📄 calculate_ji_calculate_key.cpp
字号:
#include"stdio.h"
#include"iostream.h"
#define Round 3 //control the round of DES
#define N 8
static unsigned char IP[64]={57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7,
56,48,40,32,24,16,8,0,
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6};
//P置换表
static unsigned char P[32]={15, 6,19,20,
28,11,27,16,
0,14,22,25,
4,17,30, 9,
1, 7,23,13,
31,26, 2, 8,
18,12,29, 5,
21,10, 3,24};
//Expand 扩展表
static unsigned char E[48] = {31, 0, 1, 2, 3, 4,
3, 4, 5, 6, 7, 8,
7, 8, 9,10,11,12,
11,12,13,14,15,16,
15,16,17,18,19,20,
19,20,21,22,23,24,
23,24,25,26,27,28,
27,28,29,30,31, 0};
/* INITIALIZE THE TABLES */
/* Table - s1 */
static unsigned char s1[4][16] = {
14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 };
/* Table - s2 */
static unsigned char s2[4][16] = {
15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 };
/* Table - s3 */
static unsigned char s3[4][16] = {
10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 };
/* Table - s4 */
static unsigned char s4[4][16] = {
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 };
/* Table - s5 */
static unsigned char s5[4][16] = {
2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 };
/* Table - s6 */
static unsigned char s6[4][16] = {
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 };
/* Table - s7 */
static unsigned char s7[4][16] = {
4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 };
/* Table - s8 */
static unsigned char s8[4][16] = {
13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 };
/* Table - Shift */
static unsigned char shift[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 };
/* Table - Binary */ /* 每四位表示一个数:0-15,用于转化s盒的输出为2进制 */
static unsigned char binary[64] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1,
0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1,
1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1,
1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1 };
static unsigned char IP1[64]={39,7,47,15,55,23,63,31,
38,6,46,14,54,22,62,30,
37,5,45,13,53,21,61,29,
36,4,44,12,52,20,60,28,
35,3,43,11,51,19,59,27,
34,2,42,10,50,18,58,26,
33,1,41,9,49,17,57,25,
32,0,40,8,48,16,56,24};
static unsigned char PC1[56]={56,48,40,32,24,16, 8,
0,57,49,41,33,25,17,
9, 1,58,50,42,34,26,
18,10, 2,59,51,43,35,
62,54,46,38,30,22,14,
6,61,53,45,37,29,21,
13, 5,60,52,44,36,28,
20,12, 4,27,19,11, 3};
static unsigned char PC2[48]={13,16,10,23, 0, 4,
2,27,14, 5,20, 9,
22,18,11, 3,25, 7,
15, 6,26,19,12, 1,
40,51,30,36,46,54,
29,39,50,44,32,47,
43,48,38,55,33,52,
45,41,49,35,28,31};
void test(unsigned char *EL,unsigned char *el,unsigned char *c,unsigned char *J)
{
unsigned char ELd[48],B[48],B1[48];
register i,j,p,C;
for(i=0;i<48;i++)
ELd[i]=EL[i]^el[i];
//J1
C=0;
for(j=0;j<4;j++)
{
C=C*2;
C=C+c[j];
}
for(i=0;i<64;i++)
{
p=i;
for(j=5;j>=0;j--)
{
B[j]=p%2;
p=p/2;
B1[j]=ELd[j]^B[j];
}
if((s1[2*B[0]+B[5]][8*B[1]+4*B[2]+2*B[3]+B[4]]^s1[2*B1[0]+B1[5]][8*B1[1]+4*B1[2]+2*B1[3]+B1[4]])==C)
{
p=0;
for(j=0;j<6;j++)
{
p=p*2;
p=p+(B[j]^EL[j]);
}
J[p]++;
}
}
//J2
C=0;
for(j=4;j<8;j++)
{
C=C*2;
C=C+c[j];
}
for(i=0;i<64;i++)
{
p=i;
for(j=11;j>=6;j--)
{
B[j]=p%2;
p=p/2;
B1[j]=ELd[j]^B[j];
}
if((s2[2*B[6]+B[11]][8*B[7]+4*B[8]+2*B[9]+B[10]]^s2[2*B1[6]+B1[11]][8*B1[7]+4*B1[8]+2*B1[9]+B1[10]])==C)
{
p=0;
for(j=6;j<12;j++)
{
p=p*2;
p=p+(B[j]^EL[j]);
}
J[64+p]++;
}
}
//J3
C=0;
for(j=8;j<12;j++)
{
C=C*2;
C=C+c[j];
}
for(i=0;i<64;i++)
{
p=i;
for(j=17;j>=12;j--)
{
B[j]=p%2;
p=p/2;
B1[j]=ELd[j]^B[j];
}
if((s3[2*B[12]+B[17]][8*B[13]+4*B[14]+2*B[15]+B[16]]^s3[2*B1[12]+B1[17]][8*B1[13]+4*B1[14]+2*B1[15]+B1[16]])==C)
{
p=0;
for(j=12;j<18;j++)
{
p=p*2;
p=p+(B[j]^EL[j]);
}
J[64*2+p]++;
}
}
//J4
C=0;
for(j=12;j<16;j++)
{
C=C*2;
C=C+c[j];
}
for(i=0;i<64;i++)
{
p=i;
for(j=23;j>=18;j--)
{
B[j]=p%2;
p=p/2;
B1[j]=ELd[j]^B[j];
}
if((s4[2*B[18]+B[23]][8*B[19]+4*B[20]+2*B[21]+B[22]]^s4[2*B1[18]+B1[23]][8*B1[19]+4*B1[20]+2*B1[21]+B1[22]])==C)
{
p=0;
for(j=18;j<24;j++)
{
p=p*2;
p=p+(B[j]^EL[j]);
}
J[64*3+p]++;
}
}
//J5
C=0;
for(j=16;j<20;j++)
{
C=C*2;
C=C+c[j];
}
for(i=0;i<64;i++)
{
p=i;
for(j=29;j>=24;j--)
{
B[j]=p%2;
p=p/2;
B1[j]=ELd[j]^B[j];
}
if((s5[2*B[24]+B[29]][8*B[25]+4*B[26]+2*B[27]+B[28]]^s5[2*B1[24]+B1[29]][8*B1[25]+4*B1[26]+2*B1[27]+B1[28]])==C)
{
p=0;
for(j=24;j<30;j++)
{
p=p*2;
p=p+(B[j]^EL[j]);
}
J[64*4+p]++;
}
}
//J6
C=0;
for(j=20;j<24;j++)
{
C=C*2;
C=C+c[j];
}
for(i=0;i<64;i++)
{
p=i;
for(j=35;j>=30;j--)
{
B[j]=p%2;
p=p/2;
B1[j]=ELd[j]^B[j];
}
if((s6[2*B[30]+B[35]][8*B[31]+4*B[32]+2*B[33]+B[34]]^s6[2*B1[30]+B1[35]][8*B1[31]+4*B1[32]+2*B1[33]+B1[34]])==C)
{
p=0;
for(j=30;j<36;j++)
{
p=p*2;
p=p+(B[j]^EL[j]);
}
J[64*5+p]++;
}
}
//J7
C=0;
for(j=24;j<28;j++)
{
C=C*2;
C=C+c[j];
}
for(i=0;i<64;i++)
{
p=i;
for(j=41;j>=36;j--)
{
B[j]=p%2;
p=p/2;
B1[j]=ELd[j]^B[j];
}
if((s7[2*B[36]+B[41]][8*B[37]+4*B[38]+2*B[39]+B[40]]^s7[2*B1[36]+B1[41]][8*B1[37]+4*B1[38]+2*B1[39]+B1[40]])==C)
{
p=0;
for(j=36;j<42;j++)
{
p=p*2;
p=p+(B[j]^EL[j]);
}
J[64*6+p]++;
}
}
//J8
C=0;
for(j=28;j<32;j++)
{
C=C*2;
C=C+c[j];
}
for(i=0;i<64;i++)
{
p=i;
for(j=47;j>=42;j--)
{
B[j]=p%2;
p=p/2;
B1[j]=ELd[j]^B[j];
}
if((s8[2*B[42]+B[47]][8*B[43]+4*B[44]+2*B[45]+B[46]]^s8[2*B1[42]+B1[47]][8*B1[43]+4*B1[44]+2*B1[45]+B1[46]])==C)
{
p=0;
for(j=42;j<48;j++)
{
p=p*2;
p=p+(B[j]^EL[j]);
}
J[64*7+p]++;
}
}
}
void differentialattack(unsigned char *plaintext1,unsigned char *ciphertext1,unsigned char *plaintext2,unsigned char *ciphertext2,unsigned char *J)
{
unsigned char L0[32],l0[32],
L3[32],R3[32],l3[32],r3[32],L[32],R[32],c[32],
EL[48],el[48];
register i,p1,p2,j;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -