教学服务系统

 找回密码
 立即注册
搜索
查看: 527|回复: 0

信息计算2019级2班30号高鹏

[复制链接]

10

主题

16

帖子

80

积分

注册会员

Rank: 2

积分
80
发表于 2022-5-5 18:25:34 | 显示全部楼层 |阅读模式
本帖最后由 2019-2高鹏 于 2022-5-5 18:27 编辑
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include <time.h>

  6. char s[100], * c;
  7. int n, e, d, i, C, j, k = 0, len;
  8. int str[100], b[30];
  9. unsigned gcd(unsigned a, unsigned b)
  10. {
  11.     if (a % b == 0)
  12.         return b;
  13.     else
  14.         return gcd(b, a % b);
  15. }
  16. void Egcd(int a, int b, int& x, int& y)
  17. { //ax-by=1
  18.     if (b == 0 || a == 0)
  19.     {
  20.         x = 1;
  21.         y = 0;
  22.         return;
  23.     }
  24.     if (a < b)
  25.     {
  26.         Egcd(a, b % a, x, y);
  27.         x = (int)(b * y + 1) / a;
  28.     }
  29.     else
  30.     {
  31.         Egcd(a % b, b, x, y);
  32.         y = (int)(a * x - 1) / b;
  33.     }
  34. }
  35. void RSA()
  36. {
  37.     int p, q, N, Y;
  38.     printf(" 请输入素数 p 和 q的值:");
  39.     scanf("%d %d", &p, &q);
  40.     n = p * q;
  41.     N = (p - 1) * (q - 1);
  42.     srand((unsigned)time(NULL)); // 初始化随机数
  43.     while (1) // 产生随机整数 e , e 与 N 互质
  44.     {
  45.         e = rand() % N;
  46.         if (e == 0)
  47.             continue;
  48.         if (gcd(N, e) == 1)
  49.         {
  50.             break;
  51.         }
  52.     }
  53.     Egcd(e, N, d, Y);
  54.     printf(" 公钥为 PU={e=%d,n=%d}\n", e, n);
  55.     printf(" 私钥为 PR={d=%d,n=%d}\n", d, n);
  56. }
  57. void encrypt() // 加密函数
  58. {
  59.     len = strlen(s);
  60.     for (i = 0; i < len; i++) // 去掉 s[100] 中的空格
  61.     {
  62.         if (s[i] < 97 || s[i]>122)
  63.         {
  64.             b[k] = i;
  65.             k++;
  66.             for (j = i; j < len - 1; j++)
  67.             {
  68.                 s[j] = s[j + 1];
  69.             }
  70.             len--;
  71.         }
  72.     }
  73.     s[len] = '\0'; // 结束符
  74.     printf(" 密文是 : ");
  75.     for (i = 0; i < len; i++)
  76.     {
  77.         C = 1;
  78.         for (int j = 0; j < e; j++)
  79.         {
  80.             C = (C * (s[i] - 97)) % n;
  81.         }
  82.         str[i] = C;
  83.         printf("%d ", str[i]);
  84.     }
  85.     printf("\n");
  86. }
  87. void decrypt() // 解密函数
  88. {
  89.     c = (char*)malloc(len * sizeof(int));
  90.     for (i = 0; i < len; i++) // 实现解密
  91.     {
  92.         C = 1;
  93.         for (int j = 0; j < d; j++)
  94.         {
  95.             C = (C * (str[i])) % n;
  96.         }
  97.         c[i] = C + 97;
  98.     }
  99.     c[i] = '\0';
  100.     for (int z = 0; z < k; z++) // 加空格
  101.     {
  102.         for (i = 0; i < len; i++)
  103.         {
  104.             if (i == b[z])
  105.             {
  106.                 for (j = len; j > i; j--)
  107.                 {
  108.                     c[j] = c[j - 1];
  109.                 }
  110.                 c[i] = ' ';
  111.                 len++;
  112.                 b[z + 1] = b[z + 1] + (z + 1);
  113.                 break;
  114.             }
  115.         }
  116.     }
  117.     c[len] = '\0';
  118.     printf(" 明文 : ");
  119.     puts(c);
  120. }
  121. int function()// 系统功能选择页面
  122. {
  123.     int choice;
  124.     printf("    \n");
  125.         printf("    \n");
  126.     printf("  欢迎使用 RSA 加密解密系统  \n");
  127.     printf(" 1--   加密  \n");
  128.     printf(" 2--   解密  \n");
  129.     printf(" 3--   退出  \n");
  130.     printf("     \n");
  131.         printf("    \n");
  132.     printf(" 请输入要选择的功能 : ");
  133.     scanf("%d", &choice);
  134.     return choice;
  135. }
  136. int main()
  137. {

  138.     int function();
  139.     int fc;
  140.     printf(" 请输入初始的明文 ( 小写 ) : ");
  141.     gets(s);
  142.     RSA(); // 提供私钥和公钥
  143.     while (1)
  144.     {
  145.         fc = function();
  146.         if (fc == 1) // 加密
  147.             encrypt();
  148.         else if (fc == 2) // 解密
  149.             decrypt();
  150.         else if (fc == 3)
  151.             break;
  152.         else
  153.             printf(" 输入有误,请重新输入 /n");
  154.     }
  155.     return 0;
  156. }
复制代码

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

教学服务系统

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

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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