/*rsa.c RSA绠楁硶瀹炵幇*/
#include <stddef.h>
#include <stdio.h>
#include <sys/time.h>
#include <linux/types.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include <malloc.h>
#define L 100
#define W 512
#define BigNumLength 2000 //瀛樻斁y*a鍚庣殑瀛楃澶у皬
#define c_length 1000 //瀵嗘枃瀛樻斁闀垮害
int k,z=1,x1,S1=0,S2=1,S=0;
int digit;//澶ф暟鐨勪綅鏁?
int ys[c_length]={},a1[c_length]={}; //瀛樺偍鐨勮В瀵嗙殑y鍜宎
int y[c_length]={},a[c_length]={}; //瀛樺偍鐨勫姞瀵嗙殑y鍜宎
int BigNumSquare1[BigNumLength]={},ciphertext[c_length]={},plaintext[c_length]={};
double VAR=0,VAR1[L],VAR2[L];
int A[W],B[L][W],C[W],D[W],Q[L],X[L][W],Y[L][W];
int x[1000],y2[1000],z1[1000],m[1000];//琚櫎鏁? 闄ゆ暟 鍟? 浣欐暟
int n[155]={1,0,9,6,9,3,8,6,5,6,1,8,3,3,0,7,3,0,3,2,7,3,5,9,5,7,5,1,0,8,7,4,0,4,3,6,9,8,5,4,6,6,4,0,9,6,3,4,5,9,5,0,1,5,3,4,8,6,0,4,1,7,5,3,5,5,6,1,2,7,4,5,5,6,3,9,0,8,9,3,0,1,5,5,6,0,9,1,9,5,5,8,6,3,7,6,0,1,0,3,6,3,5,7,1,3,8,5,0,0,5,5,6,6,8,2,2,2,3,8,5,9,8,6,1,3,4,9,3,3,6,3,4,7,2,1,4,4,8,5,3,2,1,1,2,1,8,5,1,0,8,7,6,5,7};
int key[512]={0,0,0,1,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,0,0,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,0,0,1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,0,1,1,1,0,1,0,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,0,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,1,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,0,0,1,0,0,1,1,0,0,1,1,1,1,0,0,1,0,0,1,0,1,0,1,0,0,0,0,0,0,1};
int key1[17]={1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1};
/*int n[5]={1,6,6,3,7};
int key[14]={1,1,1,0,0,0,0,1,1,1,0,1,0,1};
int key1[5]={1,0,0,0,1};*/
int key2[512]={1,0,1,1,0,0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,0,0,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,0,0,1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,0,1,1,1,0,1,0,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,0,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,1,0,0,0,1,1,1,0,1,1,1,1,1,0,0,1,0,0,1,0,0,1,1,0,0,1,1,1,1,0,0,1,0,0,1,0,1,0,1,0,0,0,0,0,0,1};
int key3[512]={1,1,0,1,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,0,0,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,0,0,1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,0,1,1,1,0,1,0,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,0,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,1,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,0,1,0,1,0,1,0,0,0,0,0,0,1};
__u64 rdtsc()
{
__u32 lo,hi;
__asm__ __volatile__
(
"rdtsc":"=a"(lo),"=d"(hi)
);
return (__u64)hi<<32|lo;
}
void BigNum(int *y3,int *a2,int x1,int len1,int len2) //len1,S2鏄痽鐨勯暱搴︼紝len2,S1鏄痑鐨勯暱搴?
{
int i=0,j=0,k=0,len=0,k1=0;
int REMAINDER=0,CARRY=0,SUM=0;
int BigNumSquare[BigNumLength]={},y4[BigNumLength]={},a3[BigNumLength]={};
//printf("y0=%d\n",y[0]);
//printf("a2!=%d\n",a2);
/*for(int i = 0; i < len2;i++)
{
printf("-----------%d",a2[i]);
}
printf("\n");
for(int i = 0; i < len1;i++)
{
printf("***********%d",y3[i]);
}*/
if(x1==1)
{
for(int i=0;i<len1;i++)
{
y4[i]=y3[i];
//printf("-----------------%d",y4[i]);
}
//printf("\n");
for(int i=0;i<len2;i++)
{
a3[i]=a2[i];
//printf("-----------------%d",a3[i]);
}
//printf("y0=%d\n",y[0]);
//y3=ys;
//a2=a1;
}
else if(x1==0)
{
for(int i=0;i<len1;i++)
{
y4[i]=y3[i];
//printf("-----------------%d",y4[i]);
}
//printf("\n");
for(int i=0;i<len2;i++)
{
a3[i]=a2[i];
//printf("-----------------%d",a3[i]);
}
//y3=a1;
//a2=a1;
}
else if(x1==2)
{
for(int i=0;i<len1;i++)
{
y4[i]=y3[i];
//printf("-----------------%d",y4[i]);
}
//printf("\n");
for(int i=0;i<len2;i++)
{
a3[i]=a2[i];
//printf("-----------------%d",a3[i]);
}
}
else if(x1==3)
{
for(int i=0;i<len1;i++)
{
y4[i]=y3[i];
//printf("--------------------------------------%d",y4[i]);
}
//printf("\n");
for(int i=0;i<len2;i++)
{
a3[i]=a2[i];
//printf("**************************************%d",a3[i]);
}
}
//len1=S2;
//len2=S1;
//printf("%d,%d\n",len2,len1);
len=abs(len2-len1);
//printf("%d\n",len);
if(len1>len2)
{
//printf("_________________________________________________________________________\n");
y3=(int *)malloc(len1*sizeof(int));
a2=(int *)malloc(len1*sizeof(int));
for(i=0;i<len1;i++)
{
y3[i]=y4[i];
//printf("%d",y3[i]);
}
for(i=len1-1;i>0;i--)
{
a2[i]=a3[i-len];
}
for(i=0;i<len;i++)
{
a2[i]=0;
}
/*for(int i=0;i<S1;i++)
{
printf("%d",a2[i]);
}*/
//k=(int)sizeof(BigNum1)/4-1;
k=len1-1;
k1=k;
}
else
{
if(len2>len1)
{
y3=(int *)malloc(len2*sizeof(int));
a2=(int *)malloc(len2*sizeof(int));
for(i=0;i<len2;i++)
{
a2[i]=a3[i];
//printf("------------------------%d",a2[i]);
}
//printf("\n");
for(i=len2-1;i>0;i--)
{
y3[i]=y4[i-len];
}
for(i=0;i<len;i++)
{
y3[i]=0;
}
/*for(int i=0;i<len2;i++)
{
printf("************************%d",y3[i]);
}*/
k=len2-1;
k1=k;
}
else
{
if(len1==len2)
{
//printf("_________________________________________________________________________\n");
/*for(i=0;i<len1;i++)
{
y4[i]=y3[i];
//printf("--------------------------------------%d",y4[i]);
//printf("**************************************%d",y3[i]);
}
//printf("\n");
for(i=0;i<len2;i++)
{
a3[i]=a2[i];
//printf("**************************************%d",a3[i]);
}*/
y3=(int *)malloc(len1*sizeof(int));
a2=(int *)malloc(len2*sizeof(int));
if(y3==NULL)
{ // 妫?鏌ュ唴瀛樺垎閰嶆槸鍚︽垚鍔?
printf("Unable to allocate memory.\n");
exit(1);
}
/*for(i=0;i<len1;i++)
{
printf("--------------------------------------%d",y4[i]);
}
printf("\n");
for(i=0;i<len2;i++)
{
printf("**************************************%d",a3[i]);
}*/
for(i=0;i<len2;i++)
{
a2[i]=a3[i];
//printf("------------------------%d",a2[i]);
}
//printf("\n");
for(i=0;i<len1;i++)
{
y3[i]=y4[i];
//printf("------------------------%d",y3[i]);
}
k=len1-1;
k1=k;
//printf("y0k=%d\n",y[0]);
}
}
}
//printf("璇疯緭鍑簁鍜宬1鐨勫?煎垎鍒负:%d,%d\n",k,k1);
while (k>=0)
{
SUM=0;
for (i=k,j=k1;j>=k;i++,j--)
SUM+=y3[i]*a2[j];
//printf("SUM=%d\n",SUM);
//getchar();
SUM=SUM+CARRY;
//printf("SUM=%d\n",SUM);
CARRY=SUM/10;
REMAINDER=SUM%10;
BigNumSquare[S++]=REMAINDER;
//printf("REMAINDER=%d\n",REMAINDER);
/*for(i=0;i<S;i++)
{
printf("B[%d]=%d\n", i,BigNumSquare[i]);
}*/
k--;
}
//printf("S=%d\n", S);
//printf("CARRY=%d\n", CARRY);
k=k1-1;
//printf("y0k1=%d\n",y[0]);
while (k>=0)
{
SUM=0;
for (i=0,j=k;i<=k;i++,j--)
SUM+=y3[i]*a2[j];
//printf("sum=%d\n",SUM);
SUM=SUM+CARRY;
CARRY=SUM/10;
REMAINDER=SUM%10;
BigNumSquare[S++]=REMAINDER;
//printf("REMAINDER1=%d\n",REMAINDER);
/*for(i=0;i<S;i++)
{
printf("B[%d]=%d\n", i,BigNumSquare[i]);
}*/
k--;
}
//printf("S=%d\n", S);
//printf("y0k2=%d\n",y[0]);
while(1)
{
if(CARRY==0)
break;
REMAINDER=CARRY%10;
CARRY=CARRY/10;
BigNumSquare[S++]=REMAINDER;
}
//printf("THE SOURCE BIGNUMBER1 IS:\n");
/*for(i=0;i<=k1;i++)
{
printf("B[%d]=%d\n", i,y3[i]);
}*/
//printf("THE SOURCE BIGNUMBER2 IS:\n");
/*for(i=0;i<=k1;i++)
{
//printf("B[%d]=%d\n", i,a2[i]);
}*/
//printf("THE RESULT of BIGNUMBER1*BIGNUMBER2 is:!!!!\n");
//printf("S鐨勫?间负:%d\n", S);
for(i=S-1;i>=0;i--)
{
BigNumSquare1[S-1-i]=BigNumSquare[i];
//printf("%d",BigNumSquare1[S-1-i]);
}
//printf("\n");
/*for(i=0;i<S;i++)
{
if(BigNumSquare1[i]==0)
S--;
k2++;
}
//printf("S鐨勫?间负:%d\n", S);
//printf("k2鐨勫?间负:%d\n", k2);
for(i=0;i<S;i++)
{
BigNumSquare1[i]=BigNumSquare1[k2-1+i];
//printf("%d",BigNumSquare1[i]);
}*/
//printf("\n");
//printf("\n");
//printf("y0k3=%d\n",y[0]);
//printf("ya=%d\n",y);
//printf("a2=%d\n",a2);
//printf("a8=%d\n",a8);
free(y3);
free(a2);
}
void sub(int x[],int y2[],int len1,int len2)//澶ф暟鍑忔硶
{
int i;
for(i=0;i<len1;i++)
{
if(x[i]<y2[i])
{
x[i]=x[i]+10-y2[i];
x[i+1]--;
}
else
x[i]=x[i]-y2[i];
}
for(i=len1-1;i>=0;i--)//鍒ゆ柇鍑忔硶缁撴潫涔嬪悗锛岃闄ゆ暟鐨勪綅鏁?
{
if(x[i])
{
digit=i+1;
break;
}
}
}
int judge(int x[],int y2[],int len1,int len2)
{
int i;
if(len1<len2)
return -1;
if(len1==len2)//鑻ヤ袱涓暟浣嶆暟鐩哥瓑
{
for(i=len1-1;i>=0;i--)
{
if(x[i]==y2[i])//瀵瑰簲浣嶇殑鏁扮浉绛?
continue;
if(x[i]>y2[i])//琚櫎鏁? 澶т簬 闄ゆ暟锛岃繑鍥炲?间负1
return 1;
if(x[i]<y2[i])//琚櫎鏁? 灏忎簬 闄ゆ暟锛岃繑鍥炲?间负-1
return -1;
}
return 0;//琚櫎鏁? 绛変簬 闄ゆ暟锛岃繑鍥炲?间负0
}
}
int mod(int aa[],int x1)
{
int i,j=0,k1=0,temp,ys1=0,k2=0;
int len1,len2,len;//len涓や釜澶ф暟浣嶆暟鐨勫樊鍊?
//printf("B2mod-----aa=%d\n",aa);
//printf("yamod=%d\n",y);
//printf("-------------%d,%d,%d",S1,S2,S);
/*for(int i =0;i<S1;i++)
{
printf("-----%d",aa[i]);
}
printf("\n");
for(int i =0;i<S2;i++)
{
printf("*****%d",y[i]);
}*/
if(x1==1)
{
/*for(int i = 0; i< S1;i++)
{
printf("璇疯緭鍑轰紶鍏ョ殑瀵嗘枃鐨勫?间负%d",aa[i]);
}*/
//printf("B1-----aa=%d\n",aa);
BigNum(ys,aa,x1,S2,S1);
//printf("B2-----aa=%d\n",aa);
//printf("ya=%d\n",y);
/*for(int i =0;i<S1;i++)
{
printf("B-----a1:%d",aa[i]);
}*/
}
else
{
if(x1==0)
{
/*for(int i = 0; i< S1;i++)
{
printf("璇疯緭鍑轰紶鍏ョ殑瀵嗘枃鐨勫?间负%d",aa[i]);
}*/
BigNum(aa,aa,x1,S1,S1);
}
else
{
if(x1==2)
{
/*for(int i = 0; i< S1;i++)
{
printf("璇疯緭鍑轰紶鍏ョ殑鏄庢枃鐨勫?间负%d",aa[i]);
}
for(int i = 0; i< S2;i++)
{
printf("璇疯緭鍑轰紶鍏ョ殑y鐨勫?间负%d",y[i]);
}*/
BigNum(y,aa,x1,S2,S1);
}
else
{
if(x1==3)
{
/*for(int i = 0; i< S1;i++)
{
printf("璇疯緭鍑轰紶鍏ョ殑鏄庢枃鐨勫?间负%d",aa[i]);
}*/
BigNum(aa,aa,x1,S1,S1);
}
}
}
}
//len1=(int)sizeof(BigNumSquare1)/4;//琚櫎鏁颁綅鏁?
//printf("%d\n",S);
/*for(int i=0;i<S;i++)
{
printf("----------------------%d",BigNumSquare1[i]);
}*/
//printf("璇疯緭鍑簂en2鐨勫?间负锛?%d\n",len2);
//len3=S;
len1=S;
for(i=0;i<len1;i++)//灏嗗瓧绗︿覆涓悇涓厓绱犲?掑簭鍌ㄥ瓨鍦ㄦ暟缁勪腑
{
//x[i]=BigNumSquare1[i];
if(BigNumSquare1[i]==0)
{
S--;
k2++;
}
else if(BigNumSquare1[i]!=0)
break;
}
//printf("璇疯緭鍏鐨勫?间负锛?%d,k2=%d\n",S,k2);
len2=(int)sizeof(n)/4;//闄ゆ暟浣嶆暟
len1=S;
for(i=len1-1,j=0;i>=0;i--)//灏嗗瓧绗︿覆涓悇涓厓绱犲?掑簭鍌ㄥ瓨鍦ㄦ暟缁勪腑
{
x[j++]=BigNumSquare1[k2+i];
//x[j++]=BigNumSquare1[i];
}
/*for(int j=0;j<len1;j++)
{
printf("%d",x[j]);
}
printf("\n");*/
k2=0;
for(i=len2-1,k1=0;i>=0;i--)
{
y2[k1++]=n[i];
}
/*for(int k1=0;k1<len2;k1++)
{
printf("%d",y2[k1]);
} */
if(len1<len2)//褰撹闄ゆ暟浣嶆暟灏忎簬闄ゆ暟浣嶆暟鏃?
{
for(i=len1-1;i>=0;i--)
{
if(x1==1)
{
ys[len1-1-i]=x[i];
//ys[i]=BigNumSquare1[i];
//printf("%d",ys[i]);
}
else
{
if(x1==0)
{
a1[len1-1-i]=x[i];
//a1[i]=BigNumSquare1[i];
//printf("%d",a1[i]);
}
else
{
if(x1==2)
{
y[len1-1-i]=x[i];
//y[i]=BigNumSquare1[i];
//printf("~~~~~%d",y[i]);
}
else
{
if(x1==3)
{
a[len1-1-i]=x[i];
//a[i]=BigNumSquare1[i];
//printf("%d",a[i]);
}
}
}
}
}
/*for(int i=0;i<S2;i++)
{
printf("%d",y[i]);
}*/
//printf("%d",S);
if(x1==1) //S1涓篴鐨勯暱搴︼紝S2涓簓鐨勯暱搴?
{
S2=S;
}
else if(x1==0)
{
S1=S;
}
else if(x1==2)
{
S2=S; //鍥犱负S2涓瓨鍌ㄧ殑y鐨勯暱搴︼紝璧嬪?煎悗鐢ㄤ簬涓嬩竴娆*a鐨勮绠?
}
else if(x1==3)
{
S1=S;
}
//printf("-------------%d,%d,%d",S1,S2,S);
}
else //褰撹闄ゆ暟浣嶆暟 澶т簬鎴栬?? 闄ゆ暟浣嶆暟鏃?
{
len=len1-len2;//涓や釜澶ф暟浣嶆暟鐨勫樊鍊?
for(i=len1-1;i>=0;i--)//灏嗛櫎鏁板悗琛ラ浂锛屼娇寰椾袱涓ぇ鏁颁綅鏁扮浉鍚屻?傝闄ゆ暟锛?4541543329 闄ゆ暟锛?98745,鍔犻浂鍚?:9874500000
{
if(i>=len)
y2[i]=y2[i-len];
else
y2[i]=0;
/*if(i>len)
y2[i]=0;
else
y2[i]=y2[i];*/
}
/*for(int j=0;j<len1;j++)
{
printf("----------%d",x[j]);
}
printf("\n");
for(int k1=0;k1<len2;k1++)
{
printf("----------%d",y2[k1]);
}*/
len2=len1;//灏嗕袱涓ぇ鏁版暟浣嶇浉鍚?
digit=len1; //灏嗗師琚櫎鏁颁綅鏁拌祴鍊肩粰digit
for(j=0;j<=len;j++)
{
z1[len-j]=0;
//printf("璇疯緭鍑簁1鐨勫?间负锛?%d\n",k1);
while(((temp=judge(x,y2,len1,len2))>=0)&&digit>=k1)//鍒ゆ柇涓や釜鏁颁箣闂寸殑鍏崇郴浠ュ強浣嶆暟涓庨櫎鏁板師浣嶆暟鐨勫叧绯?
{
sub(x,y2,len1,len2); //澶ф暟鍑忔硶鍑芥暟
z1[len-j]++;//鍌ㄥ瓨鍟嗙殑姣忎竴浣?
len1=digit;//閲嶆柊淇敼琚櫎鏁扮殑闀垮害
if(len1<len2&&y2[len2-1]==0)
len2=len1;//灏唋en1闀垮害璧嬬粰len2;
}
if(temp<0)//鑻ヨ闄ゆ暟灏忎簬闄ゆ暟锛岄櫎鏁板噺灏忎竴浣嶃?備緥濡傦細琚櫎鏁帮細4541543329 闄ゆ暟锛?(鍘?)98745,(鍔犻浂鍚?)9874500000锛屽悗閫?涓?浣嶅悗:0987450000
{
for(i=1;i<len2;i++)
y2[i-1]=y2[i];
y2[i-1]=0;
if(len1<len2)
len2--;
}
}
//printf("鍟嗘槸锛?");
//for(i=len;i>0;i--)//鍘绘帀鍓嶇紑0
//{
// if(z1[i])
// break;
//}
//for(;i>=0;i--)
//printf("%d",z1[i]);
//printf("\n");
//printf("浣欐暟鏄細");
for(i=len1;i>0;i--)
{
if(x[i])
break;
}
for(;i>=0;i--)
//for(;i>=0;i--)
{
ys1++;
}
//printf("ys1:%d",ys1);
/*for(int i=0;i<ys1;i++)
{
printf("%d",y[i]);
}*/
if(x1==1) //S1涓篴鐨勯暱搴︼紝S2涓簓鐨勯暱搴?
{
S2=ys1;
for(int i=0;i<S2;i++)
{
ys[i]=x[S2-1-i];
//printf("~~~~~~~~~~~~~~~~~~~~~~~~~~%d",ys[i]);
}
}
else if(x1==0)
{
S1=ys1;
for(int i=0;i<S1;i++)
{
a1[i]=x[S1-1-i];
}
}
else if(x1==2)
{
S2=ys1;
for(int i=0;i<S2;i++)
{
y[i]=x[S2-1-i];
}
//printf("------------ys1:%d",ys1);
}
else if(x1==3)
{
S1=ys1;
for(int i=0;i<S1;i++)
{
a[i]=x[S1-1-i];
}
//printf("------------ys1:%d",ys1);
}
ys1=0;
//printf("\n");
}
//printf("--------------------------%d,%d,%d",S1,S2,S);
/*for(int i=0;i<S;i++)
{
printf("%d",y[i]);
}*/
//printf("-------------%d,%d,%d",S1,S2,S);
S=0;
}
static int modexp(int *a12) //a1褰㈠弬,浼犲叆鐨勬槸瀵嗘枃ciphertext
{
__u64 begin;
__u64 end;
int j=0,label=1,sum=0,t=0,t1=0;
ys[0]=1;
/*for(int i=0;i<S1;i++)
{
printf("----------%d",a12[i]);
}*/
//printf("a12modexp=%d\n",a12);
//printf("ymodexp=%d\n",y);
for(int i = W-1; i>=0; i--)
{
if(key[i]==1)
{
if(label==1)
{
begin = rdtsc();
mod(a12,1); //ys = (ys*a1) % n;
end = rdtsc();
t = end - begin;
}
else
{
begin = rdtsc();
mod(a1,1); //璇ュ嚱鏁颁細浣垮緱ys[]锛孊igNumSquare1[]锛屼骇鐢熷彉鍖?
end = rdtsc();
t = end - begin;
}
A[j] = t; //鏈?浣庝綅鍒版渶楂樹綅杩涜鏃堕棿瀛樺叆鐨?
j++;
}
else
{
begin = rdtsc();
end = rdtsc();
t1 = end - begin;
A[j] = t1;
j++;
}
//sum++;
//printf("%d",sum); //a = (a*a)%n;
if(label==1){
mod(a12,0); //璇ュ嚱鏁颁細浣垮緱a1[]浜х敓鍙樺寲
label=0;}
else
mod(a1,0);
}
return *ys;
}
static int modexp1(int *a11) //a褰㈠弬,浼犲叆鐨勬槸鏄庢枃p2
{
int t=1,sum=0;;
y[0]=1;
/*for(int i=0;i<S1;i++)
{
printf("----------%d",a11[i]);
}*/
for(int i = 16; i>=0; i--)
{
if(key1[i]==1)
{
if(t==1)
mod(a11,2); //y = (y*a) % n;
else
mod(a,2);
}
/*for(int i=0;i<S1;i++)
{
printf("----------%d",a[i]);
}*/
//printf("--------------%d",sum);
sum++;
if(t==1)
{
mod(a11,3); //a = (a*a)%n;
t=0;
}
else
{
/*for(int j=0;j<S1;j++)
{
printf("璇疯緭鍑篴鐨勫?间负锛?%d",a[j]);
}*/
mod(a,3);
}
}
//printf("****************%d",*y);
//printf("S:%d,S1:%d,S2:%d",S,S1,S2);
return *y;
}
static int modexp2(int *a12) //a1褰㈠弬,浼犲叆鐨勬槸瀵嗘枃ciphertext
{
__u64 begin;
__u64 end;
int j=0,label=1,sum=0,t=0,t1=0;
ys[0]=1;
/*for(int i=0;i<S1;i++)
{
printf("----------%d",a12[i]);
}*/
//printf("a12modexp=%d\n",a12);
//printf("ymodexp=%d\n",y);
for(int i = W-1; i>=0; i--)
{
if(key2[i]==1)
{
if(label==1)
{
begin = rdtsc();
mod(a12,1); //ys = (ys*a1) % n;
end = rdtsc();
t = end - begin;
}
else
{
begin = rdtsc();
mod(a1,1); //璇ュ嚱鏁颁細浣垮緱ys[]锛孊igNumSquare1[]锛屼骇鐢熷彉鍖?
end = rdtsc();
t = end - begin;
}
A[j] = t; //鏈?浣庝綅鍒版渶楂樹綅杩涜鏃堕棿瀛樺叆鐨?
j++;
}
else
{
begin = rdtsc();
end = rdtsc();
t1 = end - begin;
A[j] = t1;
j++;
}
//sum++;
//printf("%d",sum); //a = (a*a)%n;
if(label==1){
mod(a12,0); //璇ュ嚱鏁颁細浣垮緱a1[]浜х敓鍙樺寲
label=0;}
else
mod(a1,0);
}
return *ys;
}
static int modexp3(int *a12) //a1褰㈠弬,浼犲叆鐨勬槸瀵嗘枃ciphertext
{
__u64 begin;
__u64 end;
int j=0,label=1,sum=0,t=0,t1=0;
ys[0]=1;
/*for(int i=0;i<S1;i++)
{
printf("----------%d",a12[i]);
}*/
//printf("a12modexp=%d\n",a12);
//printf("ymodexp=%d\n",y);
for(int i = W-1; i>=0; i--)
{
if(key3[i]==1)
{
if(label==1)
{
begin = rdtsc();
mod(a12,1); //ys = (ys*a1) % n;
end = rdtsc();
t = end - begin;
}
else
{
begin = rdtsc();
mod(a1,1); //璇ュ嚱鏁颁細浣垮緱ys[]锛孊igNumSquare1[]锛屼骇鐢熷彉鍖?
end = rdtsc();
t = end - begin;
}
A[j] = t; //鏈?浣庝綅鍒版渶楂樹綅杩涜鏃堕棿瀛樺叆鐨?
j++;
}
else
{
begin = rdtsc();
end = rdtsc();
t1 = end - begin;
A[j] = t1;
j++;
}
//sum++;
//printf("%d",sum); //a = (a*a)%n;
if(label==1){
mod(a12,0); //璇ュ嚱鏁颁細浣垮緱a1[]浜х敓鍙樺寲
label=0;}
else
mod(a1,0);
}
return *ys;
}
int Variance()
{
double sum = 0,avgtime = 0;
for(int i = 0; i < L; i++)
{
sum+=Q[i];
}
avgtime = sum/L;
for(int i = 0; i < L; i++)
{
VAR = VAR + pow((Q[i]-avgtime),2);
}
//VAR=VAR/(L-1);
printf("the realVAR is: %.2f\n",VAR);
printf("\n");
return 0;
}
int VarianceA()
{
//int n = 1;
double V = 0,time = 0,avgtime = 0,total = 0;
int E[10000];
//for(int k = 0;k < W; k++)
//{
for(int i = 0; i < L; i++)
{
for(int j = 0; j < z+1; j++)
{
total+=X[i][j];
}
E[i]=Q[i]-total;
time += E[i];
total = 0;
}
avgtime = time/L;
for(int i = 0; i < L; i++)
{
V+=pow((E[i]-avgtime),2);
}
V=V/(L-1);
VAR1[z]=V;
printf("the VAR1[%d] is: %.2f\n",z,V);
/*total = 0;
time = 0;
avgtime = 0;
V = 0;*/
//n++;
printf("\n");
//}
return 0;
}
int VarianceB()
{
//int n = 1;
double V = 0,time = 0,avgtime = 0,total = 0;
long F[10000];
//Find the lowest order of each ciphertext
//for(int k=0;k < W; k++)
//{
for(int i = 0; i < L; i++)
{
for(int j = 0; j < z+1; j++)
{
total+=Y[i][j];
}
F[i]=Q[i]-total;
time += F[i];
total = 0;
}
avgtime = time/L;
for(int i = 0; i < L; i++)
{
V+=pow((F[i]-avgtime),2);
}
V=V/(L-1);
VAR2[z] = V;
printf("the VAR2[%d] is: %.2f\n",z,V);
/*total = 0;
time = 0;
avgtime = 0;
V = 0;
n++;*/
printf("\n");
//}
return 0;
}
int arrytime()
{
int p,p1[c_length]={},p2[c_length]={};
int sum = 0;
srand(time(NULL));
//prikey.n[20] ={1,5,7,1,2,2,9,0,4,2,1,7,0,7,7,7,6,4,5,9};
for (int i = 0; i < L; i++)
{
//p = rand()%100;
p=12345;
//printf("%d",p);
while(p!=0)//灏唒laintext瀛樺叆鏁扮粍涓?
{
p1[S1]=p%10;
p = p/10;
S1++;
}
//printf("S1鐨勫?间负锛?%d",S1);
printf("the plain[%d] is:",i);
for(int j=S1-1;j>=0;j--)
{
p2[S1-1-j]=p1[j];
}
for(int j=0; j<S1;j++)
{
//printf("S1鐨勫?间负锛?%d",S1);
printf("%d",p2[j]);
}
printf("\n");
//rsa_encipher(p2,ciphertext); //鍔犲瘑
modexp1(p2); //鍔犲瘑
printf("the ciphertext is:");
for(int j=0;j<S2;j++)
{
ciphertext[j]=y[j];
printf("%d",ciphertext[j]);
}
S1=S2;
S2=1;
//printf("S=%d,S1=%d,S2=%d",S,S1,S2);
//rsa_decipher(ciphertext,plaintext); //瑙e瘑
modexp(ciphertext);
printf("\n");
printf("the plain is:");
for(int j=0;j<S2;j++)
{
plaintext[j]=ys[j];
printf("%d",plaintext[j]);
}
printf("\n");
//printf("-----------------------------------------------------------------------------\n");
for(int j =0; j < W; j++)
{
B[i][j] = A[j];
}
S1=0;
S2=1;
for(int m=0;m<c_length;m++)
{
ys[m]=0;
a1[m]=0; //瀛樺偍鐨勮В瀵嗙殑y鍜宎
y[m]=0;
a[m]=0; //瀛樺偍鐨勫姞瀵嗙殑y鍜宎
BigNumSquare1[m]=0;
ciphertext[m]=0;
plaintext[m]=0;
p1[m]=0;
p2[m]=0;
}
}
printf("\n");
for(int i = 0; i < L; i++)
{
for(int j = 0; j < W; j++)
{
if(B[i][j] > 10000000)
{
//printf("绗?%d琛岀%d鍒楀嚭鐜扮缇ょ偣锛?%d\n",i,j,B[i][j]);
B[i][j] = B[i-1][j];
if(i == 0)
{
B[i][j] = B[i+1][j];
}
}
}
}
for(int i = 0; i < L; i++)
{
for(int j = 0; j < W; j++)
{
sum+=B[i][j];
printf("%d\t",B[i][W-1-j]);
}
Q[i]=sum;
sum = 0;
printf("\n");
}
//Variance();
return 0;
}
void arrytime1()
{
int p,p1[c_length]={},p2[c_length]={};
int sum = 0;
srand(time(NULL));
for (int i = 0; i < L; i++)
{
//p = rand()%100;
p=12345;
while(p!=0)//灏唒laintext瀛樺叆鏁扮粍涓?
{
p1[S1]=p%10;
p = p/10;
S1++;
}
//printf("S1鐨勫?间负锛?%d",S1);
printf("the plain[%d] is:",i);
for(int j=S1-1;j>=0;j--)
{
p2[S1-1-j]=p1[j];
}
for(int j=0; j<S1;j++)
{
//printf("S1鐨勫?间负锛?%d",S1);
printf("%d",p2[j]);
}
printf("\n");
//rsa_encipher(p2,ciphertext); //鍔犲瘑
modexp1(p2); //鍔犲瘑
printf("the ciphertext is:");
for(int j=0;j<S2;j++)
{
ciphertext[j]=y[j];
printf("%d",ciphertext[j]);
}
S1=S2;
S2=1;
//printf("S=%d,S1=%d,S2=%d",S,S1,S2);
//rsa_decipher(ciphertext,plaintext); //瑙e瘑
//printf("ctarry=%d\n",ciphertext);
//printf("yarry=%d\n",y);
modexp2(ciphertext);
printf("\n");
printf("the plain is:");
for(int j=0;j<S2;j++)
{
plaintext[j]=ys[j];
printf("%d",plaintext[j]);
}
printf("\n");
//printf("-----------------------------------------------------------------------------\n");
for(int j =0; j < W; j++)
{
X[i][j] = A[j];
}
S1=0;
S2=1;
for(int m=0;m<c_length;m++)
{
ys[m]=0;
a1[m]=0; //瀛樺偍鐨勮В瀵嗙殑y鍜宎
y[m]=0;
a[m]=0; //瀛樺偍鐨勫姞瀵嗙殑y鍜宎
BigNumSquare1[m]=0;
ciphertext[m]=0;
plaintext[m]=0;
p1[m]=0;
p2[m]=0;
}
}
printf("\n");
for(int i = 0; i < L; i++)
{
for(int j = 0; j < W; j++)
{
if(X[i][j] > 10000000)
{
//printf("绗?%d琛岀%d鍒楀嚭鐜扮缇ょ偣锛?%d\n",i,j,B[i][j]);
X[i][j] = X[i-1][j];
if(i == 0)
{
X[i][j] = X[i+1][j];
}
}
}
}
for(int i = 0; i < L; i++)
{
for(int j = 0; j < W; j++)
{
printf("%d\t",X[i][W-1-j]);
}
printf("\n");
}
VarianceA();
}
void arrytime2()
{
int p,p1[c_length]={},p2[c_length]={};
int sum = 0;
srand(time(NULL));
for (int i = 0; i < L; i++)
{
//p = rand()%100;
p=12345;
while(p!=0)//灏唒laintext瀛樺叆鏁扮粍涓?
{
p1[S1]=p%10;
p = p/10;
S1++;
}
//printf("S1鐨勫?间负锛?%d",S1);
printf("the plain[%d] is:",i);
for(int j=S1-1;j>=0;j--)
{
p2[S1-1-j]=p1[j];
}
for(int j=0; j<S1;j++)
{
//printf("S1鐨勫?间负锛?%d",S1);
printf("%d",p2[j]);
}
printf("\n");
//rsa_encipher(p2,ciphertext); //鍔犲瘑
modexp1(p2); //鍔犲瘑
printf("the ciphertext is:");
for(int j=0;j<S2;j++)
{
ciphertext[j]=y[j];
printf("%d",ciphertext[j]);
}
S1=S2;
S2=1;
//printf("S=%d,S1=%d,S2=%d",S,S1,S2);
//rsa_decipher(ciphertext,plaintext); //瑙e瘑
//printf("ctarry=%d\n",ciphertext);
//printf("yarry=%d\n",y);
modexp3(ciphertext);
printf("\n");
printf("the plain is:");
for(int j=0;j<S2;j++)
{
plaintext[j]=ys[j];
printf("%d",plaintext[j]);
}
printf("\n");
//printf("-----------------------------------------------------------------------------\n");
for(int j =0; j < W; j++)
{
Y[i][j] = A[j];
}
S1=0;
S2=1;
for(int m=0;m<c_length;m++)
{
ys[m]=0;
a1[m]=0; //瀛樺偍鐨勮В瀵嗙殑y鍜宎
y[m]=0;
a[m]=0; //瀛樺偍鐨勫姞瀵嗙殑y鍜宎
BigNumSquare1[m]=0;
ciphertext[m]=0;
plaintext[m]=0;
p1[m]=0;
p2[m]=0;
}
}
printf("\n");
for(int i = 0; i < L; i++)
{
for(int j = 0; j < W; j++)
{
if(Y[i][j] > 10000000)
{
//printf("绗?%d琛岀%d鍒楀嚭鐜扮缇ょ偣锛?%d\n",i,j,Y[i][j]);
Y[i][j] = Y[i-1][j];
if(i == 0)
{
Y[i][j] = Y[i+1][j];
}
}
}
}
for(int i = 0; i < L; i++)
{
for(int j = 0; j < W; j++)
{
printf("%d\t",Y[i][W-1-j]);
}
printf("\n");
}
VarianceB();
}
void attack()
{
int i,x = 0;
double p;
int M[512]={0,0,0,1,0,0,1,1,1,1,1,0,1,1,0,0,1,1,1,1,1,1,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,1,0,1,1,0,0,1,0,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,0,0,0,0,1,1,1,1,0,1,0,1,1,1,1,1,0,1,1,0,1,0,1,1,0,0,0,1,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,0,0,1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,1,1,1,0,0,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,0,1,1,1,0,1,0,1,0,1,1,0,1,0,0,0,1,1,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,0,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,1,1,1,0,1,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,1,0,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,1,0,0,0,0,1,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,1,0,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,1,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,0,0,1,0,0,1,1,0,0,1,1,1,1,0,0,1,0,0,1,0,1,0,1,0,0,0,0,0,0,1};
//printf("\n---------------------------------------------------------------------------------------------------------\n");
for(int k =1;k<W-1;k++)
{
if(key2[W-1-k] == key3[W-1-k])
{
key2[W-1-k] = (key3[W-1-k]+1)%2;
}
for(int j = 0; j < W; j++)
{
printf("%d\t",key2[j]);
}
printf("\n");
for(int j = 0; j < W; j++)
{
printf("%d\t",key3[j]);
}
printf("\n");
arrytime1();
printf("\n-----------------------------------------------------------------------------------------------------------------------------------\n");
arrytime2();
if(VAR1[k]<VAR2[k])
{
key3[W-1-k]=key2[W-1-k];
}
else
{
key2[W-1-k]=key3[W-1-k];
}
//printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n");
//printf("%.2f\t%.2f\n",fabs(VAR-VAR1[j]),fabs(VAR-VAR2[j]));
//printf("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n")
for(int j = 0; j < W; j++)
{
printf("%d\t",key2[j]);
}
printf("\n");
for(int j = 0; j < W; j++)
{
printf("%d\t",key3[j]);
}
printf("\n");
printf("\n********************************************************************************************************************************************************\n");
if(key2[W-1-k]==M[W-1-k])
x++;
z++;
}
printf("璇疯緭鍑簒鐨勫?间负:%d\n",x);
p = (x+2)/512.00;
printf("鐚滄祴姝g‘鐜囦负:%f\n",p);
}/**/
long sum(long a2[])
{
long n,j,term;
long sum = 0;
for(j=0,n=W-1;j<W;j++,n--)
if(n>=0)
{
term=a2[W-1-j]*pow(2,n);
sum=sum+term;
}
return sum;
}
void main()
{
arrytime(); //杈撳嚭鐪熷疄绉侀挜鍔犺В瀵嗘槑鏂囧拰瀵嗘枃
for(int j = 0; j<W;j++)
{
printf("%d\t",key[j]);
}
printf("\n---------------------------------------------------------------------------------------------------------\n");
//arrytime1();
//arrytime2();
//Variance();
attack();
printf("\n*********************************************************************************************************\n");
for(int i = 0; i < L; i++)
{
printf("%d\n",Q[i]);
}/**/
//free(y3);
//free(a2);
}