感谢支持
我们一直在努力

OpenSSL RSA加解密代码片段

在RSA使用过程中,公钥加密一般用来协商密钥;私钥加密一般用来签名。
Ø n:模数
Ø e:公钥指数
Ø d:私钥指数
n+e可以组成公钥
n+d可以组成私钥


代码包括
1。生成RSA的数据结构
2。用指定的n,e,d生成RSA的数据结构
3。用私钥加密
4。用公钥解密
5。SHA256报文摘要



  1. #include <stdio.h>   

  2. #include <stdlib.h>   

  3. #include <string.h>   

  4. #include <openssl/sha.h>   

  5. #include <openssl/rsa.h>   

  6. void testRSAGen(){  

  7.     RSA *r;  

  8.     int bits=512,ret;  

  9.     unsigned long e=RSA_3;  

  10.     BIGNUM  *bne;  

  11.     r=RSA_generate_key(bits,e,NULL,NULL);  

  12.     RSA_print_fp(stdout,r,11);  

  13.     printf(“——————————–/n”);  

  14.     RSA_free(r);  

  15.     bne=BN_new();  

  16.     ret=BN_set_word(bne,e);  

  17.     r=RSA_new();  

  18.     ret=RSA_generate_key_ex(r,bits,bne,NULL);  

  19.     if(ret!=1)  

  20.     {  

  21.     printf(“RSA_generate_key_ex err!/n”);  

  22.     return -1;  

  23.     }  

  24.     //RSA_print_fp(stdout,r,11);   

  25.     RSA_free(r);  

  26.   

  27. }  

  28. void testRSA(){  

  29.     RSA *r;  

  30.     BIGNUM *bne,*bnn,*bnd;  

  31.   

  32.     int bits = 1024, ret, len, flen, padding, i;  

  33.   

  34.     unsigned char *key, *p;  

  35.     BIO *b;  

  36.     //要加密的明文   

  37.     unsigned  char *in = “abcef”;  

  38.     unsigned  char *encData,*decData,*tmpData;//加密后的数据/解密后的数据/临时指针   

  39.   

  40.     //使用的密匙数据   

  41.     unsigned long e = 75011;  

  42.     const char *MODULUS=“9EC7D9A2DC5B095F8E5F90295121F41262FAEFBE9AF57B772A71F1F9D9635F8769CB78DA2BCFE9B27FC1F3AD4A3D178F8C61981225EF5DEACBDC5665F12E691AA13DDD321A59CFCF376F002036612FF3C5E057A3007FF675AFA3EDE34DC23A1A2637294870EBE823F76B5CE21E25F3FA5137F5DE12437DE0118245B927B28221”;  

  43.     const char *PRIVATE=“8B26E30ECA6E8F3668F6FA78B0C55FB75A4A3FAD0667B152933A4991D7A815D1498F5E1EF44ACEF6CDF252E56F367DED5BA024DF6B267B7E36BD35552DFA0A4CC1E9D0A4BC8E7C76F98D4971441D6693745A0A76E175571BD160E4B1536A6EFF5A08EDA45236E96E7A4748CF4D031CA8B2F4CCE9F2E1286F432DE6495A535E43”;  

  44.   

  45.     //构建RSA数据结构   

  46.     bne = BN_new();  

  47.     bnd = BN_new();  

  48.     bnn = BN_new();  

  49.     ret = BN_set_word(bne, e);  

  50.     BN_hex2bn(&bnd, PRIVATE);  

  51.     BN_hex2bn(&bnn, MODULUS);  

  52.   

  53.     r = RSA_new();  

  54.     r->e=bne;  

  55.     r->d=bnd;  

  56.     r->n=bnn;  

  57.     RSA_print_fp(stdout, r, 5);  

  58.   

  59.     //准备输出的加密数据结构   

  60.     flen =  RSA_size(r);// – 11;   

  61.     encData =  (unsigned char *)malloc(flen);  

  62.     bzero(encData, flen);//memset(encData, 0, flen);   

  63.   

  64.     printf(“Begin RSA_private_encrypt …/n”);  

  65.     ret =  RSA_private_encrypt(flen, in, encData, r,  RSA_NO_PADDING);  

  66.     if(ret < 0){  

  67.         printf(“Encrypt failed!/n”);  

  68.         return;  

  69.     }  

  70.     printf(“Size:%d/n”, ret);  

  71.     printf(“ClearText:%s/n”, in);  

  72.     printf(“CipherText(Hex):/n”);  

  73.     tmpData=encData;  

  74.     for  (i=0; i<ret; i++){  

  75.         printf(“0x%02x, “, *tmpData);  

  76.         tmpData++;  

  77.     }  

  78.     printf(“end private encrypt /n”);  

  79.     printf(“————————/n”);  

  80.   

  81.   

  82.     //准备输出的解密数据结构   

  83.     flen =  RSA_size(r);// – 11;   

  84.     decData =  (unsigned char *)malloc(flen);  

  85.     bzero(decData, flen);//memset(encData, 0, flen);   

  86.   

  87.     printf(“Begin RSA_public_decrypt …/n”);  

  88.     ret =  RSA_public_decrypt(flen, encData, decData, r,  RSA_NO_PADDING);  

  89.     if(ret < 0){  

  90.             printf(“RSA_public_decrypt failed!/n”);  

  91.             return;  

  92.     }  

  93.     printf(“Size:%d/n”, ret);  

  94.     printf(“ClearText:%s/n”, decData);  

  95.   

  96.     free(encData);  

  97.     free(decData);  

  98.     RSA_free(r);  

  99.   

  100. }  

  101. void testSHA256(){  

  102.     unsigned char in[]=“asdfwerqrewrasfaser”;  

  103.     unsigned char out[32];  

  104.   

  105.     size_t n;  

  106.     int i;  

  107.   

  108.     n=strlen((const char*)in);  

  109.   

  110.     SHA256(in,n,out);  

  111.     printf(“/n/nSHA256 digest result:/n”);  

  112.   

  113.     printf(“%d/n”,sizeof(out));  

  114.   

  115.     for(i=0;i<32;i++)  

  116.         printf(“%d”,out[i]);  

  117.     printf(“/n”);  

  118.   

  119. }  

  120. int main(void) {  

  121.     puts(“!!!Hello World!!!”); /* prints !!!Hello World!!! */  

  122.     testSHA256();  

  123.     testRSA();  

  124.     return EXIT_SUCCESS;  

  125. }  

赞(0) 打赏
转载请注明出处:服务器评测 » OpenSSL RSA加解密代码片段
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏