rsa數字簽名實現

2021-07-10 01:30:05 字數 1779 閱讀 9242

使用openssl庫進行封裝實現,**如下:

static int base64_decode(char *str,int str_len,char *decode,int decode_buffer_len)

static int base64_encode(char *str,int str_len,char *encode,int encode_len)

encode_len=bptr->length;

memcpy(encode,bptr->data,bptr->length);

bio_free_all(b64);

return encode_len;}/*

功能:rsa 簽名

引數:1st -- 要進行簽名的資料 2st -- 私鑰路徑 3st -- 簽名後返回的資料 緩衝區要比簽名後資料長度要大 4st -- 緩衝區的大小

返回值:成功返回 0 失敗返負數

*/int rsa_sign(const char* src,const char* prikeyfile,char* dest,int dlen)

/* do the signature */

evp_signinit(&md_ctx, evp_sha1());

evp_signupdate(&md_ctx, src, strlen(src));

sig_len = sizeof(sig_buf);

err = evp_signfinal(&md_ctx, sig_buf, &sig_len, pkey);

if (err != 1)

evp_pkey_free(pkey);

// int i = 0;

// fprintf(stderr, "sig_len = %d\n",sig_len);

// for(i = 0;i < sig_len;i++)

// fprintf(stderr, "%02x ",sig_buf[i]);

// fprintf(stderr, "\n");

if(base64_encode((char*)sig_buf,sig_len,dest,dlen) < 0)

return -5;

return 0;}/*

功能:rsa 驗證簽名

引數:1st -- 要驗證簽名的資料 2st -- 簽名值 3st -- 公鑰路徑

返回值:成功返回 true 失敗返false

*/bool rsa_verify(const char* data,const char* sign,const char* pubkeyfile)

pkey = pem_read_pubkey(fp, null, null, null);

fclose(fp);

if (pkey == null)

/* verify the signature */

evp_verifyinit(&md_ctx, evp_sha1());

evp_verifyupdate(&md_ctx, data,strlen(data));

err = evp_verifyfinal(&md_ctx, sig_buf, sig_len, pkey);

evp_pkey_free(pkey);

fprintf(stderr,"err = %d\n",err);

if (err != 1)

printf("signature verified ok.\n");

return true;

}

數字簽名演算法 RSA

數字簽名 又稱公鑰數字簽名 是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑑別數字資訊的方法。一套數字簽名通常定義兩種互補的運算,乙個用於簽名,另乙個用於驗證,但法條中的電子簽章與數字簽名,代表之意義並不相同,電子簽章用以辨識及確認電子檔案簽署人身份 資格及電子檔案真偽者...

RSA數字簽名演算法

數字簽名無非就兩個目的 證明這訊息是你發的 證明這訊息內容確實是完整的 也就是沒有經過任何形式的篡改 包括替換 缺少 新增 這種是兩個目的都達到了,還有一些只達到乙個目的 公鑰和私鑰都可以用來加密或解密 只要能保證用a加密,就用b解密就行。至於a是公鑰還是私鑰,其實可以根據不同的用途而定。例如說,如...

實現數字簽名

數字簽名演算法 dsa,digital signature algorithm 是一種公開金鑰演算法,不能用於加密,只能用於數字簽名。主要用作為接收者驗證數字的完整性和資料傳送者的身份,dsa演算法的安全性基於解離散對數的困難性。package main import crypto dsa cryp...