//ファイルkey.binに秘密鍵を書き込む。
void genkey(unsigned char str[256],unsigned char tt[256]){
FILE *fp;
int i;
fp=fopen("key.bin","wb");
/*
hash(tt);
// printf("genkey\n");
printf("%s\n",tt);
fwrite(c1.m,1,16,fp);
fwrite(c2.m,1,16,fp);
*/
/*
for(i=0;i<16;i++)
printf("%d ",c1.m[i]);
printf("\n");
*/
hash(str);
// for(i=0;i<16;i++)
// printf("%u ",c1.m[i]);
fwrite(c1.dd,1,16,fp);
fwrite(c2.dd,1,16,fp);
fclose(fp);
}
//関数の値が0だったらもう一度秘密鍵の計算をやり直す
void lkb(unsigned char t[256],int x){
unsigned char str[16],m[32],s[256];
int i,a;
FILE *fp;
flag=0;
// printf("lkb=%s\n",t);
// printf("lx=%u trace 0\n",x);
// printf("鍵生成に失敗しました。鍵を作りなおします");
// printf("ランダムにキーを叩いてください\n");
for(i=0;i<16;i++){
s[i]=c1.m[i];
s[i+16]=c2.m[i];
}
// scanf("%s",&s);
genkey(s,t);
lk(t);
if(mode==2)
kk(t);
// exit(1);
// break;
}
//関数の値を計算して0なら失敗。lkbに渡して再計算
int lk(unsigned char t[256]){
unsigned int o=0,x,a,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,c[17],d[2],l[17],flag=0;
int i,j,read_size,n,count=0;
unsigned char e[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char r[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
FILE *fp;
unsigned char str[16],s[256],m[32];
for(i=0;i<256;i++){
s[i]=0;
}
fp=fopen("key.bin","rb");
//read_size=fread(m,1,32,fp);
read_size=fread(gg,1,16,fp);
for(i=1;i<16;i++){
c[i]=gg[i];
printf("gg=%u ",gg[i]);
}
c[16]=1;
for(x=0;x<N;x++){
//a=gf[mlt(mlt(mlt(fg[x],fg[x]),mlt(fg[x],fg[x])),mlt(fg[x],fg[x]))]^gf[mlt(fg[x],fg[x])]^1;
a16=gf[mltn(16,fg[x])];
a15=gf[mlt(gg[15],mltn(15,fg[x]))];
a14=gf[mlt(gg[14],mltn(14,fg[x]))];
a13=gf[mlt(gg[13],mltn(13,fg[x]))];
a12=gf[mlt(gg[12],mltn(12,fg[x]))];
a11=gf[mlt(gg[11],mltn(11,fg[x]))];
a10=gf[mlt(gg[10],mltn(10,fg[x]))];
a9=gf[mlt(gg[9],mltn(9,fg[x]))];
a8=gf[mlt(gg[8],mltn(8,fg[x]))];
a7=gf[mlt(gg[7],mltn(7,fg[x]))];
a6=gf[mlt(gg[6],mltn(6,fg[x]))];
a5=gf[mlt(mlt(mlt(fg[x],fg[x]),mlt(fg[x],fg[x])),mlt(gg[5],fg[x]))];
a4=gf[mlt(mlt(mlt(fg[x],fg[x]),mlt(fg[x],fg[x])),gg[4])];
a3=gf[mlt(mlt(fg[x],fg[x]),mlt(fg[x],gg[3]))];
a2=gf[mlt(mlt(fg[x],fg[x]),gg[2])];
a=gf[mlt(fg[x],gg[1])]^gg[0];
a=a^a2^a3^a4^a5^a6^a7^a8^a9^a10^a11^a12^a13^a14^a15^a16;
if(a==0)
printf("x=%u\n",x);
// if(a==0) {lkb(t,x);printf("lk%u=0 ",x);break;}
}
// printf("lka\n ");
c[0]=gg[0]^a;
for(x=0;x<N;x++){
//c=[1^a,0,1,0,0,0,1]
d[0]=x;
d[1]=1;
e[15]=1;
for(i=0;i<15;i++)
e[i]=0;
i=K;
while(i>0){
r[i]=gf[mlt(fg[d[1]],fg[e[i-1]])];
r[i-1]=gf[mlt(fg[d[0]],fg[e[i-1]])];
//printf("%d %d %d %d\n",r[i],i,r[i-1],e[i-1]);
j=K;
while(j>-1){
c[j]=r[j]^gf[fg[c[j]]];
//print c[j]," "
j=j-1;
}
// print "\n"
r[i]=c[i];
// printf("ei=%u\n",i-2);
if(i-2>-1){
e[i-2]=c[i-1];
// printf("e=%d\n",e[i-2]);
}
i=i-1;
}
//printf("%d,%d,%d,%d,%d,%d\n",gf[mlt(fg[e[5]],dv(1,fg[a]))],gf[mlt(fg[e[4]],dv(1,fg[a]))],gf[mlt(fg[e[3]],dv(1,fg[a]))],gf[mlt(fg[e[2]],dv(1,fg[a]))],gf[mlt(fg[e[1]],dv(1,fg[a]))],gf[mlt(fg[e[0]],dv(1,fg[a]))]);
//print gf[mlt(fg[e[15]],dv(1,fg[a]))],",",gf[mlt(fg[e[14]],dv(1,fg[a]))],",",gf[mlt(fg[e[13]],dv(1,fg[a]))],",",gf[mlt(fg[e[12]],dv(1,fg[a]))],",",gf[mlt(fg[e[11]],dv(1,fg[a]))],",",gf[mlt(fg[e[10]],dv(1,fg[a]))],",",gf[mlt(fg[e[9]],dv(1,fg[a]))],",",gf[mlt(fg[e[8]],dv(1,fg[a]))],",",gf[mlt(fg[e[7]],dv(1,fg[a]))],",",gf[mlt(fg[e[6]],dv(1,fg[a]))],",",gf[mlt(fg[e[5]],dv(1,fg[a]))],",",gf[mlt(fg[e[4]],dv(1,fg[a]))],",",gf[mlt(fg[e[3]],dv(1,fg[a]))],",",gf[mlt(fg[e[2]],dv(1,fg[a]))],",",gf[mlt(fg[e[1]],dv(1,fg[a]))],",",gf[mlt(fg[e[0]],dv(1,fg[a]))],"\n";
for(i=0;i<K;i++){
h3[i][x]=gf[mlt(fg[e[K-1-i]],dv(1,fg[a]))];
// printf("%u ",h3[i][x]);
}
// printf("\n");
//print x," "
}
}