教学服务系统

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

信息计算2019陆慧明

[复制链接]

9

主题

18

帖子

77

积分

注册会员

Rank: 2

积分
77
发表于 2022-5-21 21:53:41 | 显示全部楼层 |阅读模式
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<time.h>
  5. //将十进制转二进制,用于检验大素数p,q
  6. int zh(int b,int a[],int k)
  7. {
  8.         int t,temp=-1;
  9.         while(b>0)
  10.         {
  11.                 t=b%2;
  12.                 temp++;
  13.                 a[temp]=t;
  14.                 b=b/2;
  15.         }
  16.         return temp;
  17. }
  18. //欧几里得求逆元,求解密指数d
  19. int extend(int n,int b)
  20. {
  21.         int q,r,r1=n,r2=b,t,t1=0,t2=1,i=1;
  22.         while(r2>0)
  23.         {
  24.                 q=r1/r2;
  25.                 r=r1%r2;
  26.                 r1=r2;
  27.                 r2=r;
  28.                 t=t1-q*t2;
  29.                 t1=t2;
  30.                 t2=t;
  31.         }
  32.         if(t1>0) return t1%n;
  33.         else{
  34.                 while((t1+i*n)<0)
  35.                         i++;
  36.                 return t1+i*n;
  37.         }
  38. }
  39. //检验大素数
  40. int Witness(int a,int n)
  41. {
  42.         int d=1,k,r=n-1,i,x,b[1000];
  43.         k=zh(r,b,1000);
  44.         for(i=k;i>=0;i--)
  45.         {
  46.                 x=d;
  47.                 d=(d*d)%n;
  48.                 if((d==1)&&(x!=1)&&(x!=n-1)) return 0;
  49.                 if(b[i]==1)
  50.                         d=(d*a)%n;
  51.         }
  52.         if(d!=1) return 0;
  53.         else return 1;
  54. }
  55. //快速计算模指数
  56. int mod(int a,int b,int n)
  57. {
  58.         int x=0,y=1,k,i,s[1000];
  59.         k=zh(b,s,1000);
  60.         for(i=k;i>=0;i--)
  61.         {
  62.                 x=2*x;
  63.                 y=(y*y)%n;
  64.                 if(s[i]==1)
  65.                 {
  66.                         x++;
  67.                         y=(y*a)%n;
  68.                 }
  69.         }
  70.         return y;
  71. }

  72. void main()
  73. {
  74.         int p,q,e,d,n,yn,m[1000],c[10000],mw[1000];
  75.         int yinzi[1000],e1[1000];
  76.         int i,j=0,j1;
  77.         char min_wen[1000],mi_wen[1000],re_min_wen[1000];
  78.         //密钥生成
  79.         char zimu_biao[52]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  80.         char shuzi_biao[10]="0123456789";
  81.         printf("输入明文,小英表示:\n");
  82.         gets(min_wen);
  83.         //随机生成p,q
  84.         while(1)
  85.         {
  86.                 srand((unsigned)time(NULL));
  87.                 p=rand()%500+2;
  88.                 if(Witness(2,p)==1)
  89.                 {
  90.                         printf("生成p:%d \n",p);
  91.                         break;
  92.                 }
  93.         }
  94.        
  95.         while(i){
  96.                 srand((unsigned)time(NULL));
  97.                 q=rand()%600+2;
  98.                 if(Witness(2,q)==1)
  99.                 {
  100.                         printf("生成q:%d \n",q);
  101.                         break;
  102.                 }
  103.         }
  104.         n=p*q;
  105.         yn=(p-1)*(q-1);
  106.         //生成e
  107.         for(i=2;i<=yn;i++)
  108.         {
  109.                 if(yn%i==0)
  110.                 {
  111.                         yinzi[j]=i;
  112.                         j++;
  113.                 }
  114.                 j1=j;
  115.         }
  116.         srand(time(NULL));
  117.         for(i=0;i<j1+1;i++)
  118.         {
  119.                 e1[i]=rand()%(yn-2)+2;
  120.                 for(j=0;j<i;j++)
  121.                 {
  122.                         if(e1[j]==e1[i])
  123.                         {
  124.                                 i--;
  125.                                 break;
  126.                         }
  127.                 }
  128.         }
  129.         for(i=0;i<j1+1;i++)
  130.         {
  131.                 for(j=j1;j>i;j--)
  132.                 {
  133.                         int x;
  134.                         if(e1[i]>e1[j])
  135.                         {
  136.                                 x=e1[i];
  137.                                 e1[i]=e1[j];
  138.                                 e1[j]=x;
  139.                         }
  140.                 }
  141.         }
  142.         for(i=0;i<j1+1;j++)
  143.         {
  144.                 for(j=0;j<j1;j++)
  145.                 {
  146.                         if(e1[i]==yinzi[j])
  147.                         {
  148.                                 e1[i]=0;break;
  149.                         }
  150.                 }
  151.                 if(e1[i]!=0)
  152.                 {
  153.                         e=e1[i];
  154.                         break;
  155.                 }
  156.         }
  157.         d=extend(yn,e);
  158.         printf("\ne=%d",e);
  159.         printf("\nd=%d",d);
  160.         //明文转换过程
  161.         for(i=0;i<strlen(min_wen);i++){
  162.                 for(j=0;j<51;j++){
  163.                        
  164.                         if(min_wen[i]==zimu_biao[j])
  165.                                 m[i]=j;}
  166.         }
  167.         //加密过程
  168.         for(i=0;i<strlen(min_wen);i++)
  169.                 c[i]=mod(m[i],e,n);
  170.         printf("\n输出密文:\n");
  171.         for(i=0;i<strlen(min_wen);i++)
  172.                 printf("%d",c[i]);
  173.         //解密过程
  174.         printf("\n输入待解密密文:\n");
  175.         gets(mi_wen);

  176.         for(i=0;i<strlen(mi_wen);i++)
  177.                 for(j=0;j<9;j++)
  178.                         if(mi_wen[i]==shuzi_biao[j])
  179.                                 mw[i]=j;
  180.                         printf("解密结果:");
  181.                        
  182.                         for(i=0;i<strlen(min_wen);i++)
  183.                                 m[i]=mod(mw[i],d,n);
  184.                         for(i=0;i<strlen(min_wen);i++)
  185.                                 re_min_wen[i]=zimu_biao[m[i]];
  186.                         for(i=0;i<strlen(min_wen);i++)
  187.                                 printf("%c",re_min_wen[i]);
  188.                         printf("\n\n");}
复制代码
回复

使用道具 举报

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

本版积分规则

教学服务系统

GMT+8, 2025-4-30 12:31 , Processed in 0.013379 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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