|
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<time.h>
- //将十进制转二进制,用于检验大素数p,q
- int zh(int b,int a[],int k)
- {
- int t,temp=-1;
- while(b>0)
- {
- t=b%2;
- temp++;
- a[temp]=t;
- b=b/2;
- }
- return temp;
- }
- //欧几里得求逆元,求解密指数d
- int extend(int n,int b)
- {
- int q,r,r1=n,r2=b,t,t1=0,t2=1,i=1;
- while(r2>0)
- {
- q=r1/r2;
- r=r1%r2;
- r1=r2;
- r2=r;
- t=t1-q*t2;
- t1=t2;
- t2=t;
- }
- if(t1>0) return t1%n;
- else{
- while((t1+i*n)<0)
- i++;
- return t1+i*n;
- }
- }
- //检验大素数
- int Witness(int a,int n)
- {
- int d=1,k,r=n-1,i,x,b[1000];
- k=zh(r,b,1000);
- for(i=k;i>=0;i--)
- {
- x=d;
- d=(d*d)%n;
- if((d==1)&&(x!=1)&&(x!=n-1)) return 0;
- if(b[i]==1)
- d=(d*a)%n;
- }
- if(d!=1) return 0;
- else return 1;
- }
- //快速计算模指数
- int mod(int a,int b,int n)
- {
- int x=0,y=1,k,i,s[1000];
- k=zh(b,s,1000);
- for(i=k;i>=0;i--)
- {
- x=2*x;
- y=(y*y)%n;
- if(s[i]==1)
- {
- x++;
- y=(y*a)%n;
- }
- }
- return y;
- }
- void main()
- {
- int p,q,e,d,n,yn,m[1000],c[10000],mw[1000];
- int yinzi[1000],e1[1000];
- int i,j=0,j1;
- char min_wen[1000],mi_wen[1000],re_min_wen[1000];
- //密钥生成
- char zimu_biao[52]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
- char shuzi_biao[10]="0123456789";
- printf("输入明文,小英表示:\n");
- gets(min_wen);
- //随机生成p,q
- while(1)
- {
- srand((unsigned)time(NULL));
- p=rand()%500+2;
- if(Witness(2,p)==1)
- {
- printf("生成p:%d \n",p);
- break;
- }
- }
-
- while(i){
- srand((unsigned)time(NULL));
- q=rand()%600+2;
- if(Witness(2,q)==1)
- {
- printf("生成q:%d \n",q);
- break;
- }
- }
- n=p*q;
- yn=(p-1)*(q-1);
- //生成e
- for(i=2;i<=yn;i++)
- {
- if(yn%i==0)
- {
- yinzi[j]=i;
- j++;
- }
- j1=j;
- }
- srand(time(NULL));
- for(i=0;i<j1+1;i++)
- {
- e1[i]=rand()%(yn-2)+2;
- for(j=0;j<i;j++)
- {
- if(e1[j]==e1[i])
- {
- i--;
- break;
- }
- }
- }
- for(i=0;i<j1+1;i++)
- {
- for(j=j1;j>i;j--)
- {
- int x;
- if(e1[i]>e1[j])
- {
- x=e1[i];
- e1[i]=e1[j];
- e1[j]=x;
- }
- }
- }
- for(i=0;i<j1+1;j++)
- {
- for(j=0;j<j1;j++)
- {
- if(e1[i]==yinzi[j])
- {
- e1[i]=0;break;
- }
- }
- if(e1[i]!=0)
- {
- e=e1[i];
- break;
- }
- }
- d=extend(yn,e);
- printf("\ne=%d",e);
- printf("\nd=%d",d);
- //明文转换过程
- for(i=0;i<strlen(min_wen);i++){
- for(j=0;j<51;j++){
-
- if(min_wen[i]==zimu_biao[j])
- m[i]=j;}
- }
- //加密过程
- for(i=0;i<strlen(min_wen);i++)
- c[i]=mod(m[i],e,n);
- printf("\n输出密文:\n");
- for(i=0;i<strlen(min_wen);i++)
- printf("%d",c[i]);
- //解密过程
- printf("\n输入待解密密文:\n");
- gets(mi_wen);
- for(i=0;i<strlen(mi_wen);i++)
- for(j=0;j<9;j++)
- if(mi_wen[i]==shuzi_biao[j])
- mw[i]=j;
- printf("解密结果:");
-
- for(i=0;i<strlen(min_wen);i++)
- m[i]=mod(mw[i],d,n);
- for(i=0;i<strlen(min_wen);i++)
- re_min_wen[i]=zimu_biao[m[i]];
- for(i=0;i<strlen(min_wen);i++)
- printf("%c",re_min_wen[i]);
- printf("\n\n");}
复制代码 |
|