📄 desdlg.cpp
字号:
}
IP(ip_2, 64, q);
for(j=0; j<8; j++)
cryptography_CBC[i+j] = q[j];
index ++;
}
//---------------------显示CBC密文----------------------//
char *code_cbc = new char[LL*8+LL];
h = 0;
for(i=0; i<LL; i++)
{
for(j=1; j<=8; j++)
{
if(pick(cryptography_CBC[i], j))
code_cbc[h++] = '1';
else
code_cbc[h++] = '0';
}
code_cbc[h++] = ' ';
}
code_cbc[h] = '\0';
SetDlgItemText(IDC_CBCCipher, code_cbc);
//--------------------CBC加密算法结束---------------------//
//----------------------CFB加密算法-----------------------//
index = 0;
for(i=0; i<LL; i+=8)
{
for(j=0; j<8; j++)
p[j] = plaintext[i+j];
if(index == 0)
{
for(j=0; j<8; j++)
q[j] = p[j] ^ IV[j];
for(j=0; j<8; j++)
cryptography_CFB[i+j] = q[j];
}
else
{
IP(ip_1, 64, q);
char L[4], R[4];
for(k=0; k<4; k++)
{
L[k] = q[k];
R[k] = q[k+4];
}
for(j=1; j<=16; j++)
{
Fk(L, R, j);
InterChange(L, R, 4);
}
for(k=0; k<4; k++)
{
q[k] = L[k];
q[k+4] = R[k];
}
IP(ip_2, 64, q);
for(j=0; j<8; j++)
cryptography_CFB[i+j] = q[j];
}
index ++;
}
//--------------------显示CFB二进制密文----------------------//
char *code_cfb = new char[LL*8+LL];
h = 0;
for(i=0; i<LL; i++)
{
for(j=1; j<=8; j++)
{
if(pick(cryptography_CFB[i], j))
code_cfb[h++] = '1';
else
code_cfb[h++] = '0';
}
code_cfb[h++] = ' ';
}
code_cfb[h] = '\0';
SetDlgItemText(IDC_CFBCipher, code_cfb);
//------------------------------CFB加密结束----------------------------//
//------------------------------OFB加密算法----------------------------//
index = 0;
//以q作为中间循环变量数组,首先赋初值IV
for(j=0; j<8; j++)
q[j] = IV[j];
for(i=0; i<LL; i+=8)
{
//每次运算64 bit明文
for(j=0; j<8; j++)
p[j] = plaintext[i+j];
//如果是第一次,只是与初始向量做异或运算
if(index == 0)
{
for(j=0; j<8; j++)
p[j] = p[j] ^ IV[j];
for(j=0; j<8; j++)
cryptography_OFB[i+j] = p[j];
}
//如果是后续加密,则采取后续运算方法
else
{
//首先对初始向量做加密运算
char L[4], R[4];
IP(ip_1, 64, q);
for(k=0; k<4; k++)
{
L[k] = q[k];
R[k] = q[k+4];
}
for(j=1; j<=16; j++)
{
Fk(L, R, j);
InterChange(L, R, 4);
}
for(k=0; k<4; k++)
{
q[k] = L[k];
q[k+4] = R[k];
}
IP(ip_2, 64, q);
for(j=0; j<8; j++)
cryptography_OFB[i+j] = q[j];
}
}
//---------------------显示OFB二进制密文-----------------------//
char *code_ofb = new char[LL*8+LL];
h = 0;
for(i=0; i<LL; i++)
{
for(j=1; j<=8; j++)
{
if(pick(cryptography_OFB[i], j))
code_ofb[h++] = '1';
else
code_ofb[h++] = '0';
}
code_ofb[h++] = ' ';
}
code_ofb[h] = '\0';
SetDlgItemText(IDC_OFBCipher, code_ofb);
}
//32 bit左右两边的交换
void CDesDlg::InterChange(char *c1, char *c2, int n)
{
int i;
char temp;
for(i=0; i<n; i++)
{
temp = c1[i];
c1[i] = c2[i];
c2[i] = temp;
}
}
//产生初始向量
void CDesDlg::Create_IV()
{
int i, j;
for(i=0; i<8; i++)
IV[i] = char(0);
srand((unsigned)time(NULL));
unsigned long k = 100*rand();
for(i=0; i<64; i++)
{
j = i%8 + 1;
k = (1187*k + 1201) % 598197;
if(k/598197.0 > 0.5)
IV[i/8] = (IV[i/8]) | (char(1)<<(8-j));
}
//IV向量的二进制表示
char *laaa = new char[8*8+8];
int h = 0;
for(i=0; i<8; i++)
{
for(j=1; j<=8; j++)
{
if(pick(IV[i], j))
laaa[h++] = '1';
else
laaa[h++] = '0';
}
laaa[h++] = ' ';
}
laaa[h] = '\0';
SetDlgItemText(IDC_InitVector, laaa);
}
//第i次的复杂函数运算
void CDesDlg::Fk(char *L, char *R, int i)
{
char *R_E = new char[6];
//首先进行一次置换
IP(E_P, 48, R_E, R);
int j;
for(j=0; j<6; j++)
R_E[j] = R_E[j] ^ Key[i][j];
int k=0, kk=0;
char temp[4];
//密码盒的操作
for(j=1; j<=8; j++)
{
int x=0, y=0, s1=0, s2=0, s=0;
if(pick(R_E[k/8], k%8+1)) x = 2;
if(pick(R_E[(k+5)/8], (k+5)%8+1)) x = x + 1;
if(pick(R_E[(k+1)/8], (k+1)%8+1)) y = 8;
if(pick(R_E[(k+2)/8], (k+2)%8+1)) y = y + 4;
if(pick(R_E[(k+3)/8], (k+3)%8+1)) y = y + 2;
if(pick(R_E[(k+4)/8], (k+4)%8+1)) y = y + 1;
s1 = S_box[j][x*8+y];
x = y = 0;
k = k + 6;
j++;
if(pick(R_E[k/8], k%8+1)) x = 2;
if(pick(R_E[(k+5)/8], (k+5)%8+1)) x = x + 1;
if(pick(R_E[(k+1)/8], (k+1)%8+1)) y = 8;
if(pick(R_E[(k+2)/8], (k+2)%8+1)) y = y + 4;
if(pick(R_E[(k+3)/8], (k+3)%8+1)) y = y + 2;
if(pick(R_E[(k+4)/8], (k+4)%8+1)) y = y + 1;
s2 = S_box[j][x*8+y];
s = s1*16 + s2;
temp[kk++] = char(s);
}
for(j=0; j<4; j++)
L[j] = L[j] ^ temp[j];
delete R_E;
}
//--------------------------ECB模式解密---------------------------//
void CDesDlg::OnECBDecrypt()
{
// TODO: Add your control notification handler code here
char temp[1000];
char p[8];
int i, j, k;
for(i=0; i<1000; i++)
temp[i] = '\0';
for(i=0; i<LL; i+=8)
{
for(j=0; j<8; j++)
p[j] = cryptography_ECB[i+j];
IP(ip_1, 64, p);
char L[4], R[4];
for(k=0; k<4; k++)
{
L[k] = p[k];
R[k] = p[k+4];
}
for(j=16; j>=1; j--)
{
InterChange(L, R, 4);
Fk(L, R, j);
}
for(k=0; k<4; k++)
{
p[k] = L[k];
p[k+4] = R[k];
}
IP(ip_2, 64, p);
for(j=0; j<8; j++)
temp[i+j] = p[j];
}
j = 0;
for(i=0; i<LL; i++)
{
if(temp[i] != plaintext[i])
{
j = 1;
i = LL+1;
}
}
if(j == 0)
SetDlgItemText(IDC_ECBCipher, plaintext_0);
}
//------------------------------CBC解密算法-----------------------------//
void CDesDlg::OnCBCDecrypt()
{
// TODO: Add your control notification handler code here
int k = 0, i, j;
char p[8];
char temp[1000];
for(j=0; j<1000; j++)
temp[j] = '\0';
for(i=0; i<LL; i+=8)
{
for(j=0;j<8;j++)
p[j]=cryptography_CBC[i+j];
IP(ip_1, 64, p);
char L[4], R[4];
for(k=0; k<4; k++)
{
L[k] = p[k];
R[k] = p[k+4];
}
for(j=16; j>=1; j--)
{
InterChange(L, R, 4);
Fk(L, R, j);
}
for(j=0; j<4; j++)
{
p[j] = L[j];
p[j+4] = R[j];
}
IP(ip_2,64,p);
for(j=0; j<8; j++)
temp[j+i] = p[j];
if(i==0)
for(j=0; j<8; j++)
temp[j] = temp[j]^IV[j];
else
for(j=0; j<8; j++)
temp[i+j] = (temp[i+j])^(cryptography_CBC[i-8+j]);
}
j=0;
for(i=0; i<LL; i++)
{
if(temp[i] != plaintext[i])
{
j = 1;
i = LL + 1;
}
}
if(j == 0)
SetDlgItemText(IDC_CBCCipher, plaintext_0);
}
//------------------------------CFB模式解密--------------------------------//
void CDesDlg::OnCFBDecrypt()
{
// TODO: Add your control notification handler code here
char p[8], q[8];
char temp[1000];
int index;
int i, j, k;
for(i=0; i<1000; i++)
temp[i] = '\0';
index = 0;
for(i=0; i<LL; i+=8)
{
for(j=0; j<8; j++)
p[j] = cryptography_CFB[i+j];
if(index == 0)
{
for(j=0; j<8; j++)
q[j] = p[j] ^ IV[j];
for(j=0; j<8; j++)
temp[i+j] = q[j];
}
else
{
IP(ip_1, 64, q);
char L[4], R[4];
for(k=0; k<4; k++)
{
L[k] = q[k];
R[k] = q[k+4];
}
for(j=16; j>=1; j--)
{
InterChange(L, R, 4);
Fk(L, R, j);
}
for(k=0; k<4; k++)
{
q[k] = L[k];
q[k+4] = R[k];
}
IP(ip_2, 64, q);
for(j=0; j<8; j++)
temp[i+j] = q[j];
}
index ++;
}
j = 0;
for(i=0; i<LL; i++)
{
if(temp[i] != plaintext[i])
{
j = 1;
i = LL + 1;
}
}
if(j==0)
SetDlgItemText(IDC_CFBCipher, plaintext_0);
}
//------------------------OFB解密-------------------------------//
/*
按照OFB加密算法的流程,将OFB密文输入到算法流程中去,
即可得到解密后的明文.
*/
void CDesDlg::OnOFBDecrypt()
{
// TODO: Add your control notification handler code here
char p[8], q[8];
char temp[1000];
int i, j, k, index;
for(i=0; i<1000; i++)
temp[i] = '\0';
index = 0;
//以q作为中间循环变量数组,首先赋初值IV
for(j=0; j<8; j++)
q[j] = IV[j];
for(i=0; i<LL; i+=8)
{
//每次运算64 bit明文
for(j=0; j<8; j++)
p[j] = cryptography_OFB[i+j];
//如果是第一次,只是与初始向量做异或运算
if(index == 0)
{
for(j=0; j<8; j++)
p[j] = p[j] ^ IV[j];
for(j=0; j<8; j++)
temp[i+j] = p[j];
}
//如果是后续加密,则采取后续运算方法
else
{
//首先对初始向量做加密运算
char L[4], R[4];
IP(ip_1, 64, q);
for(k=0; k<4; k++)
{
L[k] = q[k];
R[k] = q[k+4];
}
for(j=16; j>=1; j--)
{
Fk(L, R, j);
InterChange(L, R, 4);
}
for(k=0; k<4; k++)
{
q[k] = L[k];
q[k+4] = R[k];
}
IP(ip_2, 64, q);
for(j=0; j<8; j++)
temp[i+j] = q[j];
}
}
j = 0;
for(i=0; i<LL; i++)
{
if(temp[i] != plaintext[i])
{
j = 1;
i = LL + 1;
}
}
if(j == 0)
SetDlgItemText(IDC_OFBCipher, plaintext_0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -