📄 ringfuction.cpp
字号:
////////////////////////////////////////////// FileName: ringfuction.cpp// Creator: Du Feilong// Date: 2007-10-11// Comment: 实现轮函数//////////////////////////////////////////// #include<iostream>#include<fstream>#include<string>using namespace std;int ringdata[32];int enlargedata[48];int Exclusiveor[48];int Sout[32];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}; int SP[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}; int s[8][64]={ // S[0] 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, // S[1] 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, // S[2] 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, // S[3] 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, // S[4] 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, // S[5] 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, // S[6] 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, // S[7] 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 };void enlarge(){ int i; for(i=0;i<48;i++) enlargedata[i]=ringdata[E[i]]; }void Schange(){ int i; int temp[32]; for(i=0;i<32;i++) temp[i]=Sout[i]; for(i=0;i<32;i++) Sout[i]=temp[SP[i]];} void exclusiveor(int *Key1){ int i; for(int i=0;i<48;i++) Exclusiveor[i]=enlargedata[i]^Key1[i]; }void sfuction(int *x,int *y,int k) { int h1,h2; h1=x[0]*2+x[5]; h2=x[4]+x[3]*2+x[2]*4+x[1]*8; int location; location=h1*16+h2; int temp=s[k][location]; for(int i=3;i>=0;i--){ y[i]=temp%2; temp=temp/2; } }void S(int *R0,int *Key1){ int y[4]; int x[6]; int i,j,k,soutcount; soutcount=0; for(i=0;i<32;i++) ringdata[i]=R0[i]; enlarge(); exclusiveor(Key1); for(i=0;i<=7;i++) { for(k=0,j=i*6;k<6;j++,k++) { x[k]=Exclusiveor[j]; } sfuction(x,y,i); for(int m=0;m<4;m++){ Sout[soutcount]=y[m]; soutcount++; } } Schange();} void F(int *R1,int *L0,int *R0,int *Key1){ S(R0,Key1); int i; for(i=0;i<32;i++){ R1[i]=L0[i]^Sout[i]; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -