使用LibTomCrypt实现RSA加密解密算法,公钥、私钥分离

水深无声 2022-03-08 16:50 549阅读 0赞
  1. //使用本代码需要先下载LibTomMath和LibTomCrypt库
  2. //编译LibTomMath、LibTomCrypt后生成lib文件
  3. //在本工程的包含目录中添加LibTomCrypt的头文件目录
  4. //链接器中添加LibTomCrypt、LibTomMath的Lib文件
  5. #include <Windows.h>
  6. #include <stdio.h>
  7. #define LTM_DESC
  8. #include <tomcrypt.h>
  9. #include <time.h>
  10. #define PTSIZE 87
  11. #define CPSIZE 1024
  12. #define BUFFERSIZE 1024
  13. //按照16进制方式打印字符串
  14. void strprint(const char * name,unsigned char *msg,int len);
  15. //对比两个字符数组如果完全匹配返回0,否则返回负数
  16. int msgcmp(unsigned char *msg1,unsigned long l1,unsigned char *msg2,unsigned long l2);
  17. int main(void)
  18. {
  19. char c;
  20. int prng_idx,hash_idx,err;
  21. unsigned char pt[PTSIZE],pt1[CPSIZE],cp[CPSIZE];
  22. unsigned char out[BUFFERSIZE];
  23. unsigned long l1,l2;
  24. rsa_key key;
  25. rsa_key pubkey,prikey;
  26. unsigned char pubkeybuffer[BUFFERSIZE], prikeybuffer[BUFFERSIZE];
  27. unsigned long pubkeybuffersize, prikeybuffersize;
  28. int keysize = 0;
  29. int stat;
  30. int n;
  31. LARGE_INTEGER t1, t2, tc;
  32. QueryPerformanceFrequency(&tc);
  33. /*********解析算法准备**********/
  34. //绑定数学库
  35. ltc_mp = ltm_desc;
  36. //注册随机数生成器
  37. register_prng(&sprng_desc);
  38. prng_idx = find_prng("sprng");
  39. //注册hash运算库
  40. register_hash(&sha1_desc);
  41. hash_idx = find_hash("sha1");
  42. /*********生成key**********/
  43. //生成一个新的key
  44. err = rsa_make_key(NULL, prng_idx, 1024 / 8, 257, &key);
  45. if (err != CRYPT_OK)
  46. {
  47. printf("rsa_make_key err:%s\n",error_to_string(err));
  48. goto MAIN_FUNC_RET;
  49. }
  50. //打印Key的长度
  51. keysize = rsa_get_size(&key);
  52. if (keysize < 0)
  53. {
  54. printf("rsa_get_size err:%s\n", error_to_string(err));
  55. goto MAIN_FUNC_RET;
  56. }
  57. printf("keysize = %d\n",keysize);
  58. //将key导出成为私密秘钥形势的字符串,做单独保存
  59. err = rsa_export(prikeybuffer, &prikeybuffersize, PK_PRIVATE, &key);
  60. if (err != CRYPT_OK)
  61. {
  62. printf("rsa_export err:%s\n", error_to_string(err));
  63. goto MAIN_FUNC_RET;
  64. }
  65. strprint("prikey", prikeybuffer, prikeybuffersize);
  66. //将key导出成为公共秘钥形势的字符串,公开加密使用
  67. err = rsa_export(pubkeybuffer, &pubkeybuffersize, PK_PUBLIC, &key);
  68. if (err != CRYPT_OK)
  69. {
  70. printf("rsa_export err:%s\n", error_to_string(err));
  71. goto MAIN_FUNC_RET;
  72. }
  73. strprint("pubkey", pubkeybuffer, pubkeybuffersize);
  74. //从公共秘钥字符串中导入成rsa_key加密使用
  75. err = rsa_import(pubkeybuffer, pubkeybuffersize, &pubkey);
  76. if (err != CRYPT_OK)
  77. {
  78. printf("rsa_import err:%s\n", error_to_string(err));
  79. goto MAIN_FUNC_RET;
  80. }
  81. n = rsa_get_size(&pubkey);
  82. printf("pubkeysize = %d\n",n);
  83. //从私密秘钥字符串中导入成为rsa_key解密使用
  84. err = rsa_import(prikeybuffer, prikeybuffersize, &prikey);
  85. if (err != CRYPT_OK)
  86. {
  87. printf("rsa_import err:%s\n", error_to_string(err));
  88. goto MAIN_FUNC_RET;
  89. }
  90. n = rsa_get_size(&prikey);
  91. if (n < 0)
  92. {
  93. printf("rsa_get_size err:%s\n", error_to_string(err));
  94. goto MAIN_FUNC_RET;
  95. }
  96. printf("prikeysize = %d\n",n);
  97. system("pause");
  98. /*****************加密和解密验证******************/
  99. memset(pt, 0, PTSIZE);
  100. srand(time(0));
  101. //随机生成一个字符数组作为待加密原文
  102. for (int i = 0; i < PTSIZE; i++)
  103. {
  104. pt[i] = rand() % 255;
  105. }
  106. strprint("pt", pt, PTSIZE);
  107. //多次尝试加密解密,验证结果,计算运算时间
  108. for (int i = 0; i < 100; i++)
  109. {
  110. memset(cp,0,CPSIZE);
  111. QueryPerformanceCounter(&t1);
  112. rsa_encrypt_key_ex(pt, PTSIZE, cp, &l1, (const unsigned char*)"abcde", 5, NULL, prng_idx, hash_idx, LTC_PKCS_1_V1_5, &pubkey);
  113. QueryPerformanceCounter(&t2);
  114. strprint("encrypt text",cp,l1);
  115. printf("加密运算时间:%f\n", (t2.QuadPart - t1.QuadPart)*1000.0 / tc.QuadPart);
  116. //尝试使用公开秘钥进行解密失败
  117. QueryPerformanceCounter(&t1);
  118. //rsa_decrypt_key_ex(cp, l1, pt1, &l2, (const unsigned char*)"abcde", 5, hash_idx, LTC_PKCS_1_V1_5,&stat, &pubkey);
  119. rsa_decrypt_key_ex(cp, l1, pt1, &l2, (const unsigned char*)"abcde", 5, hash_idx, LTC_PKCS_1_V1_5, &stat, &prikey);
  120. QueryPerformanceCounter(&t2);
  121. printf("stat = %d\n",stat);
  122. strprint("decrypt text",pt,l2);
  123. printf("解密运算时间:%f\n", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
  124. printf("解密后对比结果:%s\n",msgcmp(pt,PTSIZE,pt1,l2) == 0 ? "正确" : "错误");
  125. system("pause");
  126. }
  127. MAIN_FUNC_RET:
  128. rsa_free(&key);
  129. rsa_free(&prikey);
  130. rsa_free(&pubkey);
  131. system("pause");
  132. return 0;
  133. }
  134. void strprint(const char * name, unsigned char *msg, int len)
  135. {
  136. printf("name = %s,len = %d\n", name, len);
  137. for (int i = 0; i < len; i++)
  138. {
  139. if (i != 0 && i % 32 == 0)
  140. {
  141. printf("\n");
  142. }
  143. printf("0x%02x,", msg[i]);
  144. }
  145. printf("\n");
  146. }
  147. int msgcmp(unsigned char *msg1, unsigned long l1, unsigned char *msg2, unsigned long l2)
  148. {
  149. if (l1 != l2)
  150. return -1;
  151. for (int i = 0; i < l1; i++)
  152. {
  153. if (msg1[i] != msg2[i])
  154. {
  155. return -2;
  156. }
  157. }
  158. return 0;
  159. }

https://download.csdn.net/download/haozi596/10308358

发表评论

表情:
评论列表 (有 0 条评论,549人围观)

还没有评论,来说两句吧...

相关阅读