使用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...