的 E(Ri-1) EL[i]=R[E[i]-1]; int EE[48]; for(i=0;i<48;i++) EE[i]=(EL[i]+mk[kk-1][i])%2; int R1[32]; for (int i=0;i<8;i++) //S 盒中取数且转化为二进制流 { data=S[i][EE[i*6]*2+EE[i*6+5]][EE[i*6+1]*8+EE[i*6+2]*4+EE[i*6+3]*2+EE[i*6+4]]; for (int j=3;j>=0;j--) { R1[4*i+j]=data%2;
for(int kk=1;kk<=16;kk++) { int EL[48]; for(i=0;i<48;i++)
data=data/2; } } int BB[32]; for(i=0;i<32;i++) BB[i]=R1[P[i]-1]; for(i=0;i<32;i++) R1[i]=(BB[i]+L[i])%2; for (i=0;i<32;i++) { L[i]=R[i]; R[i]=R1[i]; } } for (i=0;i<32;i++)//进行合并得到变换后的密文 { m[i]=R[i]; m[i+32]=L[i]; } for (i=0;i<64;i++) b[i]=m[i]; for (i=0;i<64;i++) //进行 IP 逆变换,得到最终密文 m[i]=b[IP1[i]-1]; cout<<"现在是密文的输出了"<
for(int j=0;j<8;j++) h=h+m[i*8+j]*pow(2,7-j);
cout< m[i]=b[IP[i]-1];
for (i=0;i<32;i++) {
//对密文进行分组 L[i]=m[i];
R[i]=m[i+32]; } for (int k=15;k>=0;k--) { int EL[48]; for(i=0;i<48;i++) //扩展后的 48 的 Ri-1 //根据 E 函数将 Ri-1 扩展为 48 位的 E(Ri-1) EL[i]=R[E[i]-1]; int EE[48]; for(i=0;i<48;i++) //和 Ki 进行模二运算
EE[i]=(EL[i]+mk[k][i])%2; int temP=0; int R1[32]; for (int i=0;i<8;i++) //在 S 盒中取数
{ data=S[i][EE[i*6]*2+EE[i*6+5]][EE[i*6+1]*8+EE[i*6+2]*4+EE[i*6+3]*2+EE[i*6+4]]; for (int j=3;j>=0;j--) //将取出的数转化为二进制流
{ R1[4*i+j]=data%2; data=data/2; } } int BB[32]; for(i=0;i<32;i++) BB[i]=R1[P[i]-1]; for(i=0;i<32;i++) //f 变换既 P 变换后的数据与 L0 进行模二运算 R1[i]=(BB[i]+L[i])%2; for (i=0;i<32;i++) { L[i]=R[i]; } for (i=0;i<32;i++) { //对解密后的二进制流时行合并 m[i+32]=L[i]; } //回赋值 //P 变换
R[i]=R1[i]; }
m[i]=R[i];
for (i=0;i<64;i++) b[i]=m[i]; for (i=0;i<64;i++) //进行 IP 逆表运算
m[i]=b[IP1[i]-1]; cout<<"输出解密得的明文二进制流"< for(int j=0;j<8;j++) h=h+m[i*8+j]*pow(2,7-j); cout< void makek()
//输入密码进行解密
k[64] 和 mk[16][48]
{ char ch[100]="programe"; int n=0; int k[64];
//要转换的明文
//先将字符的 ASCII 码测出 //输出字符以查看
cout< //进行 ASCII 码的转换 for(int j=7;j>=0;j--) { k[i*8+j]=n%2; n=n/2;
} }
//取二进制流
for(i=0;i<64;i++) cout< mk1[i]=k[PC1[i]-1];
{ mk1[i]=C1[i]; mk1[i+28]=D1[i]; } for(i=0;i<48;i++) mk[x-1][i]=mk1[PC2[i]-1]; for(i=0;i<28;i++)
{ C0[i]=C1[i]; D0[i]=D1[i]; } } //
{ minwei(); makek(); code(); uncode(); } //产生子 16 个密钥 //加密函数 //解密函数