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. }  

相关内容