日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

openssl 非对称加密 RSA 加密解密以及签名验证签名

發布時間:2025/6/15 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openssl 非对称加密 RSA 加密解密以及签名验证签名 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 簡介

? ?openssl ?rsa.h 提供了密碼學中公鑰加密體系的一些接口,

? ?本文主要討論利用rsa.h接口開發以下功能

  • ? ? ?公鑰私鑰的生成
  • ? ? ?公鑰加密,私鑰解密
  • ? ? ?私鑰加密,公鑰解密
  • ? ? ?簽名:私鑰簽名
  • ? ? ?驗證簽名:公鑰驗簽

2. 生成公鑰私鑰對

? ? 主要接口,

/* Deprecated version */ DEPRECATEDIN_0_9_8(RSA *RSA_generate_key(int bits, unsigned long e, void(*callback) (int, int, void *),void *cb_arg))/* New version */ int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);

? 接口調用需要先生成一個大數,如下生成密鑰對示例

//生成密鑰對RSA *r = RSA_new();int bits = 512;BIGNUM *e = BN_new();BN_set_word(e, 65537);RSA_generate_key_ex(r, bits, e, NULL);//打印密鑰RSA_print_fp(stdout, r, 0);

?打印的密鑰對結果:

Private-Key: (512 bit) modulus:00:c0:53:6c:46:57:ed:4e:33:bb:71:ec:be:d6:21:78:bf:9b:be:4f:8b:fb:32:ae:f2:83:9c:e7:b8:63:a2:34:9c:98:cc:4a:a2:17:1d:31:03:c8:f6:e0:13:3a:29:40:c8:1a:d4:b7:88:38:07:4c:3b:2a:01:0b:17:45:36:4f:f9 publicExponent: 65537 (0x10001) privateExponent:00:8f:59:9e:ca:8f:9f:01:3a:ed:eb:ec:5a:11:a0:c1:2f:90:16:39:94:4c:97:6a:6e:b8:4a:ab:2c:74:96:e2:3e:c8:aa:34:bb:99:9e:e5:60:86:b4:8f:55:49:80:dc:26:06:74:13:64:49:ac:31:f8:fe:4d:80:e1:e2:bf:fd:41 prime1:00:fd:95:4d:f0:25:a0:87:5e:d1:c9:0e:b8:96:f9:ce:0a:ef:59:e7:a4:57:49:d8:fd:dd:e6:c4:59:24:dd:e6:33 prime2:00:c2:28:a9:7b:c8:98:97:33:32:f0:52:9a:26:a2:0b:50:3b:86:c0:55:6d:c6:c7:d1:a1:43:1d:d3:7d:53:cd:23 exponent1:6c:80:d8:2a:6b:4f:36:dd:21:92:90:13:f7:b5:c7:ad:f2:20:5b:f7:7b:ca:03:69:0c:eb:d3:13:f9:ac:60:f5 exponent2:55:44:e2:5a:18:98:db:1e:83:2a:84:3c:6a:e7:13:ac:e2:d7:a5:34:5f:87:c3:4d:cf:52:d8:90:7f:24:04:9d coefficient:00:d7:0d:9b:e8:2f:3c:00:86:00:a0:b2:8b:00:1d:e2:b9:0f:9f:ca:b2:75:84:ea:c8:9d:5e:78:e5:e3:92:46:aa View Code

?

3. 公鑰加密,私鑰解密

? ?主要接口

int RSA_public_encrypt(int flen, const unsigned char *from,unsigned char *to, RSA *rsa, int padding); int RSA_private_decrypt(int flen, const unsigned char *from,unsigned char *to, RSA *rsa, int padding);

? 由于較長數據需要分組加密,如下封裝了一層

//公鑰加密 int kkrsa_public_encrypt(char *inStr,char *outData,RSA *r) {int encRet = 0;unsigned long inLen = strlen(inStr);int pdBlock = RSA_size(r)-11;unsigned int eCount = (inLen / pdBlock) +1;//分組加密,可以看出outData最大不超過malloc[eCount*pdBlock]for (int i=0; i < eCount; i++) {RSA_public_encrypt(inLen > pdBlock?pdBlock:inLen, inStr, outData, r, RSA_PKCS1_PADDING);inStr += pdBlock;outData+=RSA_size(r);encRet+=RSA_size(r);inLen -= pdBlock;}return encRet; } //私鑰解密 int kkrsa_private_decrypt(char *inStr,char *outData,RSA *r) {int decRet = 0;unsigned long inLen = strlen(inStr);int pdBlock = RSA_size(r);unsigned int dCount = inLen / pdBlock;//分組解密for (int i=0; i < dCount; i++) {int ret = RSA_private_decrypt(pdBlock, inStr, outData, r, RSA_PKCS1_PADDING);inStr += pdBlock;outData+=ret;decRet+=ret;}return decRet; }

?測試例子,例子中的r,就是上面生成的RSA密鑰對,

//測試一printf("block:%d \n",RSA_size(r));char *src = "this is test encrypt data use RSA_PKCS1_PADDING";printf("src:%s len=%d\n",src,strlen(src));char *encDat = malloc(1024);//公鑰加密int encRet = kkrsa_public_encrypt(src, encDat, r);printf("enc:%d\n",encRet);char *decDat = malloc(1024);//私鑰解密int decRet = kkrsa_private_decrypt(encDat, decDat, r);printf("dec:%s len=%d\n",decDat,decRet);free(encDat);free(decDat);

?打印結果:

block:64 src:this is test encrypt data use RSA_PKCS1_PADDING len=47 enc:64 dec:this is test encrypt data use RSA_PKCS1_PADDING len=47test2 src:this is test private encrypt data use RSA_PKCS1_PADDING len=55 enc:128 dec:this is test private encrypt data use RSA_PKCS1_PADDI len=53 View Code

?

4. 私鑰加密,公鑰解密

? 主要接口

int RSA_private_encrypt(int flen, const unsigned char *from,unsigned char *to, RSA *rsa, int padding); int RSA_private_decrypt(int flen, const unsigned char *from,unsigned char *to, RSA *rsa, int padding);

?同樣如果數據較長需要進行分組加密,如下簡單封裝的接口

//私鑰加密 int kkrsa_private_encrypt(char *inStr,char *outData,RSA *r) {int encRet = 0;unsigned long inLen = strlen(inStr);int pdBlock = RSA_size(r)-11;unsigned int eCount = (inLen / pdBlock) +1;//分組加密,可以看出outData最大不超過malloc[eCount*pdBlock]for (int i=0; i < eCount; i++) {RSA_private_encrypt(inLen > pdBlock?pdBlock:inLen, inStr, outData, r, RSA_PKCS1_PADDING);inStr += pdBlock;outData+=RSA_size(r);encRet+=RSA_size(r);inLen -= pdBlock;}return encRet; } //公鑰解密 int kkrsa_public_decrypt(char *inStr,char *outData,RSA *r) {int decRet = 0;unsigned long inLen = strlen(inStr);int pdBlock = RSA_size(r);unsigned int dCount = inLen / pdBlock;//分組解密for (int i=0; i < dCount; i++) {int ret = RSA_public_decrypt(pdBlock, inStr, outData, r, RSA_PKCS1_PADDING);inStr += pdBlock;outData+=ret;decRet+=ret;}return decRet; }

?調用示例:需要上面生成的密鑰對RSA r

//測試二printf("\ntest2\n");char *src2 = "this is test private encrypt data use RSA_PKCS1_PADDING";printf("src:%s len=%d\n",src2,strlen(src2));char *encDat2 = malloc(1024);//私鑰加密int encRet2 = kkrsa_private_encrypt(src2, encDat2, r);printf("enc:%d\n",encRet2);char *decDat2 = malloc(1024);//公鑰解密int decRet2 = kkrsa_public_decrypt(encDat2, decDat2, r);printf("dec:%s len=%d\n",decDat2,decRet2);free(encDat2);free(decDat2);

?測試結果:

test2 src:this is test private encrypt data use RSA_PKCS1_PADDING len=55 enc:128 dec:this is test private encrypt data use RSA_PKCS1_PADDING\372\314\375?GO\304 len=55 View Code

?

5. 簽名與驗證簽名

? ?主要接口

int RSA_sign(int type, const unsigned char *m, unsigned int m_length,unsigned char *sigret, unsigned int *siglen, RSA *rsa); int RSA_verify(int type, const unsigned char *m, unsigned int m_length,const unsigned char *sigbuf, unsigned int siglen, RSA *rsa);

測試示例,同樣需要上面生成的RSA密鑰對

//簽名printf("\ntest sign and verify\n");char *msg = "0123456789";char *sinDat = malloc(RSA_size(r));int sinLen = 0;RSA_sign(NID_sha1, msg,strlen(msg),sinDat,&sinLen, r);int vret = RSA_verify(NID_sha1, msg, strlen(msg), sinDat, sinLen, r);printf("sign_verify=%d\n",vret);

打印結果

test sign and verify sign_verify=1 View Code

6. 總結

? 上述RSA分組加密中使用了RSA_PKCS1_PADDING 的補位方式;當然還有如下

? 不同的補位方式,在進行分組加密時,需要注意分組塊的處理

# define RSA_PKCS1_PADDING 1 # define RSA_SSLV23_PADDING 2 # define RSA_NO_PADDING 3 # define RSA_PKCS1_OAEP_PADDING 4 # define RSA_X931_PADDING 5 /* EVP_PKEY_ only */ # define RSA_PKCS1_PSS_PADDING 6# define RSA_PKCS1_PADDING_SIZE 11

?

測試使用 openssl 1.1.0c

參考:https://www.openssl.org/docs/man1.0.2/crypto/RSA_public_encrypt.html

https://www.openssl.org/docs/manmaster/man3/RSA_verify.html

?

??

轉載于:https://www.cnblogs.com/cocoajin/p/6126099.html

總結

以上是生活随笔為你收集整理的openssl 非对称加密 RSA 加密解密以及签名验证签名的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。