📄 desdlg.cpp
字号:
{
MessageBox("请输入8位明文", "友情提示");
return;
}
if(m_key.GetLength()!=8)
{
MessageBox("请输入8位密文", "友情提示");
return;
}
PlaySound("BEGIN", AfxGetResourceHandle(),
SND_RESOURCE|SND_ASYNC|SND_NODEFAULT);
// char plaintext[8];
// strcpy(plaintext,m_old);
// 让解密按钮有效;
GetDlgItem(IDC_DECRYPT)->EnableWindow(true);
CString str; // 该字符串存储ASCII码
//////////////////////////////////////////////////////////////////////////
// 初始化数组元素清0
memset(L0, 0, 32);
memset(R0, 0, 32);
memset(k1, 0, 48);
memset(Kc0, 0, 28);
memset(Kd0, 0, 28);
memset(re, 0, 48);
memset(old, 0, 64);
memset(s, 0, 48);
//////////////////////////////////////////////////////////////////////////
// 此处开始加密
m_new=""; //先将密文清空
//////////////////////////////////////////////////////////////////////////
/// 此处对明文处理,将对应的ASCII码转化为二进制
int flag=true;
for(int i=0; i<8; i++)
{
char ch=m_old.GetAt(i);
if(ch&0x80&&flag)
{
MessageBox("含有中文字符,加密错误不负责任!", "友情提示");
flag=false;
//return;
}
memset(tmp, 0, 8);
for(int j=0; j<8; j++)
{
tmp[j]=(ch%2+2)%2;
ch/=2;
}
for(j=7; j>=0; j--)
{
old[i*8+7-j]=tmp[j];
}
}
// 此处显示明文二进制
m_oldbin="";
for(i=0; i<64; i++)
{
str.Format("%d", old[i]);
m_oldbin+=str;
}
GetDlgItem(IDC_EDIT5)->SetWindowText(m_oldbin);
for(i=0; i<32; i++)
{
L0[i]=old[IP_Table[i]-1]; /// 获得L0共32位
R0[i]=old[IP_Table[i+32]-1]; /// 获得R0共32位
}
//////////////////////////////////////////////////////////////////////////
/// 此处开始对C0,D0处理
for(i=0; i<8; i++)
{
memset(tmp, 0, 8);
char ch=m_key.GetAt(i);
if(ch&0x80)
{
MessageBox("含有中文字符,加密失败", "友情提示");
return;
}
for(int j=0; j<8; j++)
{
tmp[j]=ch%2;
ch/=2;
}
for(j=7; j>=0; j--)
{
k[i*8+7-j]=tmp[j];
}
}
for(i=0; i<28; i++)
{
Kc0[i]=k[PC1_Table[i]-1]; /// 获得c0共28位
Kd0[i]=k[PC1_Table[i+28]-1]; /// 获得d0共28位
}
//////////////////////////////////////////////////////////////////////////
/// 此处开始16迭代算法
isDecrypt=false;
for(i=1; i<=16; i++)
{
CDESDlg::Iterate(i);
}
//////////////////////////////////////////////////////////////////////////
// 最后一次生成的L16与R16调换位置装入密文字符串里
int miwen[64];
memset(miwen, 0, 64);
// 逆初始置换,真它MOTHER的麻烦!
int mitmp[64];
memset(mitmp, 0, 64);
for(i=0; i<32; i++)
{
mitmp[i]=R0[i];
mitmp[32+i]=L0[i];
//交换L0,R0的值
L0[i]=mitmp[i];
R0[i]=mitmp[i+32];
}
for(i=0; i<64; i++)
{
miwen[i]=mitmp[IPR_Table[i]-1];
}
//////////////////////////////////////////////////////////////////////////
// 将密文2进制存入m_keybin
str="";
m_keybin="";
for(i=0; i<64; i++)
{
str.Format("%d", miwen[i]);
m_keybin+=str;
}
GetDlgItem(IDC_EDIT6)->SetWindowText(m_keybin);
//////////////////////////////////////////////////////////////////////////
// 将密文ASCII码放入编辑框里面去
m_new="";
for(i=0; i<8; i++)
{
int tmp=0;
tmp+=miwen[8*i];
for(int j=1; j<8; j++)
{
tmp*=2;
tmp+=miwen[i*8+j];
}
str.Format("%c", tmp);
m_new+=str;
}
GetDlgItem(IDC_EDIT3)->SetWindowText(m_new);
}
void CDESDlg::OnDecrypt()
{
PlaySound("BEGIN", AfxGetResourceHandle(),
SND_RESOURCE|SND_ASYNC|SND_NODEFAULT);
m_listdata.DeleteAllItems(); //清空列表项目
//////////////////////////////////////////////////////////////////////////
/// 重新开始16次迭代算法
isDecrypt=true;
int i;
for(i=16; i>=1; i--)
{
CDESDlg::Iterate(i);
}
//////////////////////////////////////////////////////////////////////////
// 最后一次生成的L16<->R16调换位置
int minwen[64];
memset(minwen, 0, 64);
// 逆初始置换,真它MOTHER的麻烦!
int mintmp[64];
memset(mintmp, 0, 64);
for(i=0; i<32; i++)
{
mintmp[i]=R0[i];
mintmp[32+i]=L0[i];
}
for(i=0; i<64; i++)
{
minwen[i]=mintmp[IPR_Table[i]-1];
}
//////////////////////////////////////////////////////////////////////////
// 将密文ASCII码放入编辑框里面去
CString str;
m_Last="";
for(i=0; i<8; i++)
{
int tmp=0;
tmp+=minwen[8*i];
for(int j=1; j<8; j++)
{
tmp*=2;
tmp+=minwen[i*8+j];
}
str.Format("%c", tmp);
m_Last+=str;
}
UpdateData(false);
// 让解密按钮无效;
GetDlgItem(IDC_DECRYPT)->EnableWindow(false);
}
void CDESDlg::Iterate(int numOfIteration)
{
//////////////////////////////////////////////////////////////////////////
/// 此处迭代生成子密钥ki
int j=2; // 移位次数
if( numOfIteration==1||numOfIteration==2||
numOfIteration==9||numOfIteration==16)
{
j=1;
}
//////////////////////////////////////////////////////////////////////////
//如果为解密,迭代移位的次序变换相反方向
if(isDecrypt)
{
if(numOfIteration==16)
{
j=0;
}
else if(numOfIteration==15||numOfIteration==8||numOfIteration==1)
{
j=-1;
}
else
{
j=-2;
}
}
int Kctmp[28], Kdtmp[28]; // C0, D0中间传递数据
memset(Kctmp, 0, 28);
memset(Kdtmp, 0, 28);
for(int i=0; i<28; i++)
{
Kctmp[i]=Kc0[(i+j+28)%28];
Kdtmp[i]=Kd0[(i+j+28)%28];
}
//////////////////////////////////////////////////////////////////////////
// 将KCTMP, KDTMP的数据存入KC,KD中去
for(i=0; i<28; i++)
{
Kc0[i]=Kctmp[i];
Kd0[i]=Kdtmp[i];
}
//////////////////////////////////////////////////////////////////////////
// 生成子密钥Ki,存储到数组k1[48]中去
int ktmp[56];
memset(ktmp, 0, 56);
for(i=0; i<28; i++)
{
ktmp[i]=Kc0[i];
ktmp[i+28]=Kd0[i];
}
memset(k1, 0, 48);
for(i=0; i<48; i++)
{
k1[i]=ktmp[PC2_Table[i]-1];
}
//////////////////////////////////////////////////////////////////////////
// 将Ri-1扩充成48位并与Ki相加并模2
memset(re, 0, 48);
for(i=0; i<48; i++)
{
re[i]=(R0[E_Table[i]-1]+k1[i])%2;
}
//////////////////////////////////////////////////////////////////////////
// 分成8组, 每组6位,有一个二维数组s[8][6]存储
for(i=0; i<6; i++)
{
for(int j=0; j<8; j++)
{
s[j][i]=re[6*j+i];
}
}
//////////////////////////////////////////////////////////////////////////
// 以下通过8个S盒得到8个S数并存到S[8]中S_Box[8][4][16]
memset(s0, 0, 8);
for(i=0; i<8; i++)
{
s0[i]=S_Box[i][s[i][5]+s[i][0]*2][s[i][1]*8+s[i][2]*4+s[i][3]*2+s[i][4]];
}
memset(stmp, 0, 8);
memcpy(stmp, s0, sizeof(s0));
//////////////////////////////////////////////////////////////////////////
// 将8个数分别转换成2进制,再存入到frk[32]
int f[32];
memset(f, 0, 32);
for(i=0; i<8; i++)
{
int tmp[4];
memset(tmp, 0, 4);
for(int j=0; j<4; j++)
{
tmp[j]=s0[i]%2;
s0[i]/=2;
}
for(j=0; j<4; j++)
{
f[4*i+j]=tmp[3-j];
}
}
// 经过P变换存入frk[32]
for(i=0; i<32; i++)
{
frk[i]=f[P_Table[i]-1];
}
int Ltmp[32], Rtmp[32];
memset(Ltmp, 0, 32);
memset(Rtmp, 0, 32);
for(i=0; i<32; i++)
{
Ltmp[i]=R0[i];
Rtmp[i]=(L0[i]+frk[i])%2;
}
// 最后将数据存入L0,RO里面去
for(i=0; i<32; i++)
{
L0[i]=Ltmp[i];
R0[i]=Rtmp[i];
}
CDESDlg::SaveToList();
//////////////////////////////////////////////////////////////////////////
// 16次迭代算法结束,真累呀^_^
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -