教学服务系统

 找回密码
 立即注册
搜索
查看: 522|回复: 3

信息计算2019级1班26号陈宇扬

[复制链接]

8

主题

19

帖子

124

积分

注册会员

Rank: 2

积分
124
发表于 2022-4-22 15:33:41 | 显示全部楼层 |阅读模式
4.22:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

19

帖子

124

积分

注册会员

Rank: 2

积分
124
 楼主| 发表于 2022-4-29 21:14:53 | 显示全部楼层
4.29:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

19

帖子

124

积分

注册会员

Rank: 2

积分
124
 楼主| 发表于 2022-5-3 20:50:10 | 显示全部楼层
  1. #include <stdio.h>
  2. #include</openssl/include/bn.h> //引用大数库中的BN函数
  3. #pragma comment(lib, "libeay32.lib" )  //引用
  4. #pragma comment(lib, "ssleay32.lib")
  5. #ifdef  __cplusplus
  6. extern "C" {
  7. #endif
  8. #include</openssl/include/applink.c>
  9. #ifdef  __cplusplus
  10. }
  11. #endif
  12. int zhuanhuan(int a)//将十六进制转换为十进制
  13. {
  14.         if (a< 60)
  15.         {
  16.                 a= a- '0';
  17.         }
  18.         if (a> 64)
  19.         {
  20.                 a = a- 'A' + 10;
  21.         }
  22.         return a;
  23. }
  24. void main()
  25. {
  26.                 BIGNUM* p=BN_new();    //大素数p
  27.                 BIGNUM* q = BN_new();  //大素数q
  28.                 BIGNUM* n= BN_new();    //n=p*q
  29.                 BIGNUM* fn = BN_new();   //fn=(p-1)*(q-1)
  30.                 BIGNUM* d = BN_new();    //d=e-1 mod (n)
  31.                 BIGNUM * e = BN_new();   //整数e,1<e<fn且gcd(fn, e)=1
  32.                 BIGNUM* r = BN_new();   
  33.                 BIGNUM* M = BN_new();    //明文
  34.                 BIGNUM* C = BN_new();    //密文
  35.                 BIGNUM* one = BN_new();  //将one设置为1
  36.                 BN_one(one);
  37.                 int length;
  38.                 char str[100] = "0";   
  39.                 char* show;     
  40.                 int bits = 512;     //512bits
  41.                 int i,j,t;   
  42.                 int sum=0;
  43.                 printf("请输入要加密的的明文:");
  44.                 scanf_s("%s",str,sizeof(str));
  45.                 length = strlen(str);                //记录明文的长度
  46.             BN_bin2bn(str, length,M);            //将明文以十六进制转换为大数
  47.                 printf("明文:%s\n", str);   
  48.                 BN_generate_prime(p, bits, NULL,NULL, NULL, NULL,NULL);       //生成512bits的大素数p
  49.                 BN_generate_prime(q, bits, NULL, NULL, NULL, NULL, NULL);     //生成512bits的大素数q
  50.                 BN_CTX* ctx = BN_CTX_new();         //上下文结构               
  51.                 BN_mul(n ,p, q, ctx);            //n=p*q
  52.                 BN_sub(p, p, one);      
  53.                 BN_sub(q, q, one);
  54.                 BN_mul(fn, p, q, ctx);           //fn=(p-1)*(q-1)
  55.                 do
  56.                 {
  57.                 BN_rand_range(e, fn); //产生的0 < e < fn的随机数
  58.             BN_gcd(r, e, fn, ctx); //r = e, fn最大公约数
  59.                 } while (!BN_is_one(r)); //判断r是否等于1
  60.                 BN_mod_inverse(d, e, fn, ctx);    //模逆运算
  61.                 //公钥加密 C = M^e mod n
  62.                 BN_mod_exp_simple(C, M, e, n , ctx);
  63.                 show = BN_bn2hex(C);     //将密文转换为十六进制
  64.                 printf("密文:%s\n", show);
  65.                 //私钥解密 M = C^d mod n。
  66.                 BN_mod_exp_simple(M, C, d, n, ctx);
  67.                 show = BN_bn2hex(M);
  68.                 //printf("%x",show);//测试
  69.                 printf("\n解密后的明文:%s", show);  //将解密后的明文转换为十六进制
  70.                 printf("\n解密后的明文:");

  71.                 for (i = 0; i < length; i++)  //将解密后的明文转化为对应的ASCII的字符
  72.                 {
  73.                         j = *(show + 2*i);   //每两位为一个整体
  74.                         t= *(show +2* i+1);
  75.                         j=zhuanhuan(j);
  76.                         t=zhuanhuan(t);
  77.                         sum = j * 16 + t;
  78.                         printf("%c", sum); //将ASCII的字符输出
  79.                 }
  80.                 //释放结构
  81.                 BN_CTX_free(ctx);
  82.                 BN_free(p);
  83.                 BN_free(q);
  84.                 BN_free(n);
  85.                 BN_free(fn);
  86.                 BN_free(d);
  87.                 BN_free(e);
  88.                 BN_free(r);
  89.                 BN_free(M);
  90.                 BN_free(C);
  91. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

8

主题

19

帖子

124

积分

注册会员

Rank: 2

积分
124
 楼主| 发表于 2022-5-3 20:51:40 | 显示全部楼层
5.3:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

教学服务系统

GMT+8, 2025-4-30 14:27 , Processed in 0.016075 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表