?? s5linear.cpp
字號(hào):
#include"stdio.h"
#include"iostream.h"
#define Round 16
#define N 24
//IP置換表
static int 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};
//Expand 擴(kuò)展表
static int 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 };
//P置換表
static int 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};
/* 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 */ /* 每四位表示一個(gè)數(shù):0-15,用于轉(zhuǎn)化s盒的輸出為2進(jìn)制 */
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 };
//IP逆置換表
static int 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};
//密鑰PC1置換表
static int 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};
//密鑰PC2置換表
static int 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 Ns(unsigned char *ss,int *Nss)
{
int i;
int Ns[64][16];
unsigned char a,b,x,y[6],t1,t2,t,aa[6],bb[4],s[4];
for(a=0;a<64;a++)
{
//print column number
if(a==0)
{
printf(" ");
for(b=0;b<16;b++)
printf("%3d ",b);
cout<<endl;
}
//print row number
printf("%2d ",a);
aa[0]=(a/32)%2;
aa[1]=(a/16)%2;
aa[2]=(a/8)%2;
aa[3]=(a/4)%2;
aa[4]=(a/2)%2;
aa[5]=a%2;
for(b=0;b<16;b++)
{
Ns[a][b]=0;
bb[0]=(b/8)%2;
bb[1]=(b/4)%2;
bb[2]=(b/2)%2;
bb[3]=b%2;
for(x=0;x<64;x++)
{
y[0]=(x/32)%2;
y[1]=(x/16)%2;
y[2]=(x/8)%2;
y[3]=(x/4)%2;
y[4]=(x/2)%2;
y[5]=x%2;
t1=y[0]*aa[0];
for(i=1;i<6;i++)
t1^=y[i]*aa[i];
t=ss[(2*y[0]+y[5])*16+8*y[1]+4*y[2]+2*y[3]+y[4]];
s[0]=(t/8)%2;
s[1]=(t/4)%2;
s[2]=(t/2)%2;
s[3]=t%2;
t2=s[0]*bb[0];
for(i=1;i<4;i++)
t2^=s[i]*bb[i];
if(t1==t2)
Ns[a][b]++;
} //x end;
Ns[a][b]=Ns[a][b]-32;
printf("%3d ",Ns[a][b]);
} //b end;
printf("\n");
} //a end;
Nss=&Ns[0][0];
}
void main()
{
int Ns5[64][16];
int i,j;
Ns(&s5[0][0],&Ns5[0][0]);
printf(" ");
for(i=0;i<16;i++)
printf("%3d ",i);
cout<<endl;
/* for(i=0;i<64;i++)
{
printf("%2d ",i);
for(j=0;j<16;j++)
printf("%3d ",Ns5[i][j]);
cout<<endl;
}*/
/* Ns(&s2[0][0]);
Ns(&s3[0][0]);
Ns(&s4[0][0]);
Ns(&s5[0][0]);
Ns(&s6[0][0]);
Ns(&s7[0][0]);
Ns(&s8[0][0]); */
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -