歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> OpenSSL RSA加解密代碼片段

OpenSSL RSA加解密代碼片段

日期:2017/2/28 16:03:49   编辑:Linux教程

在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. void testRSA(){
  28. RSA *r;
  29. BIGNUM *bne,*bnn,*bnd;
  30. int bits = 1024, ret, len, flen, padding, i;
  31. unsigned char *key, *p;
  32. BIO *b;
  33. //要加密的明文
  34. unsigned char *in = "abcef";
  35. unsigned char *encData,*decData,*tmpData;//加密後的數據/解密後的數據/臨時指針
  36. //使用的密匙數據
  37. unsigned long e = 75011;
  38. const char *MODULUS="9EC7D9A2DC5B095F8E5F90295121F41262FAEFBE9AF57B772A71F1F9D9635F8769CB78DA2BCFE9B27FC1F3AD4A3D178F8C61981225EF5DEACBDC5665F12E691AA13DDD321A59CFCF376F002036612FF3C5E057A3007FF675AFA3EDE34DC23A1A2637294870EBE823F76B5CE21E25F3FA5137F5DE12437DE0118245B927B28221";
  39. const char *PRIVATE="8B26E30ECA6E8F3668F6FA78B0C55FB75A4A3FAD0667B152933A4991D7A815D1498F5E1EF44ACEF6CDF252E56F367DED5BA024DF6B267B7E36BD35552DFA0A4CC1E9D0A4BC8E7C76F98D4971441D6693745A0A76E175571BD160E4B1536A6EFF5A08EDA45236E96E7A4748CF4D031CA8B2F4CCE9F2E1286F432DE6495A535E43";
  40. //構建RSA數據結構
  41. bne = BN_new();
  42. bnd = BN_new();
  43. bnn = BN_new();
  44. ret = BN_set_word(bne, e);
  45. BN_hex2bn(&bnd, PRIVATE);
  46. BN_hex2bn(&bnn, MODULUS);
  47. r = RSA_new();
  48. r->e=bne;
  49. r->d=bnd;
  50. r->n=bnn;
  51. RSA_print_fp(stdout, r, 5);
  52. //准備輸出的加密數據結構
  53. flen = RSA_size(r);// - 11;
  54. encData = (unsigned char *)malloc(flen);
  55. bzero(encData, flen);//memset(encData, 0, flen);
  56. printf("Begin RSA_private_encrypt .../n");
  57. ret = RSA_private_encrypt(flen, in, encData, r, RSA_NO_PADDING);
  58. if(ret < 0){
  59. printf("Encrypt failed!/n");
  60. return;
  61. }
  62. printf("Size:%d/n", ret);
  63. printf("ClearText:%s/n", in);
  64. printf("CipherText(Hex):/n");
  65. tmpData=encData;
  66. for (i=0; i<ret; i++){
  67. printf("0x%02x, ", *tmpData);
  68. tmpData++;
  69. }
  70. printf("end private encrypt /n");
  71. printf("------------------------/n");
  72. //准備輸出的解密數據結構
  73. flen = RSA_size(r);// - 11;
  74. decData = (unsigned char *)malloc(flen);
  75. bzero(decData, flen);//memset(encData, 0, flen);
  76. printf("Begin RSA_public_decrypt .../n");
  77. ret = RSA_public_decrypt(flen, encData, decData, r, RSA_NO_PADDING);
  78. if(ret < 0){
  79. printf("RSA_public_decrypt failed!/n");
  80. return;
  81. }
  82. printf("Size:%d/n", ret);
  83. printf("ClearText:%s/n", decData);
  84. free(encData);
  85. free(decData);
  86. RSA_free(r);
  87. }
  88. void testSHA256(){
  89. unsigned char in[]="asdfwerqrewrasfaser";
  90. unsigned char out[32];
  91. size_t n;
  92. int i;
  93. n=strlen((const char*)in);
  94. SHA256(in,n,out);
  95. printf("/n/nSHA256 digest result:/n");
  96. printf("%d/n",sizeof(out));
  97. for(i=0;i<32;i++)
  98. printf("%d",out[i]);
  99. printf("/n");
  100. }
  101. int main(void) {
  102. puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
  103. testSHA256();
  104. testRSA();
  105. return EXIT_SUCCESS;
  106. }
Copyright © Linux教程網 All Rights Reserved