学了一些MFC的编程刚好结合密码学的四种古典密码算法实现结合一下,写了一个自己的带MFC界面的加密解密系统。
具体的密码算法原理在此就不贴出了,直接贴相关的源码:
简单解释:
i:凯撒密码的密钥是数字,也就是偏移量
ii:维吉尼亚密码的密钥是字符串
iii:Play fair密码的密钥是字符串,来构造5*5的字母密钥表
iiii:Hill密钥的密钥是n*n的可逆矩阵,这里我只对明文空间为5的明文进行加密解密,可以点击生成5*5的加密矩阵,以及其伴随矩阵
【源码下载】
链接:http://pan.baidu.com/s/1nuXDdUx 密码:3jjd
(1)左边四种算法的选择用的是radio button:
void CEn_DeDlg::OnBnClickedRadio1()
{
// TODO: 在此添加控件通知处理程序代码
choose = 1;
MessageBox(_T(" 输入密钥,密钥为数字"));
}
void CEn_DeDlg::OnBnClickedRadio2()
{
// TODO: 在此添加控件通知处理程序代码
choose = 2;
MessageBox(_T(" 输入密钥,密钥为字符串"));
}
void CEn_DeDlg::OnBnClickedRadio3()
{
// TODO: 在此添加控件通知处理程序代码
choose = 3;
MessageBox(_T(" 输入密钥,密钥为字符串,来生成5*5字符矩阵"));
}
void CEn_DeDlg::OnBnClickedRadio4()
{
// TODO: 在此添加控件通知处理程序代码
choose = 4;
MessageBox(_T(" 无需输入密钥,明文空间为5,密钥为n*n的数字矩阵,可点击右上方生成按钮生成符合条件的5*5矩阵密钥"));
}
加密函数:
//加密
void CEn_DeDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
// 将各控件中的数据保存到相应的变量
UpdateData(TRUE);
switch (choose)
{
case 1://凯撒
{
CString s = m_ming;
CString ss;
int t = 0;
while (t < s.GetLength())
{
if (s[t] <= 'z'&&s[t] >= 'a')
ss.AppendChar('a' + (s[t] - 'a' + _ttoi(m_key)) % 26);
else if (s[t] <= 'Z'&&s[t] >= 'A')
ss.AppendChar('A' + (s[t] - 'A' + _ttoi(m_key)) % 26);
else
{
ss.AppendChar(s[t]);
}
t++;
}
m_mi = ss;
break;
}
case 2://维吉尼亚
{
int i, j, s = 0;
j = m_key.GetLength();
int size1 = m_ming.GetLength();
m_ming.MakeLower();
for (i = 0; i<size1; i++) {
if (isalpha(m_ming[i])) {
m_mi.AppendChar( (m_ming[i] - 'a' + m_key[s%j] - 'a') % 26 + 'a');
s++;
}
else
m_mi.AppendChar(m_ming[i]);
}
m_mi.MakeUpper();
break;
}
case 3://play fair
{
m_key2 = _T("");
int l,i,j;
char p[1000];
m_key1 = _T("");
dealkey(m_key);
l=m_ming.GetLength();
for(i=0;i<l;i++)
{
p[i]=m_ming[i];
}
for(i=0;i<l;i++)
{
if(p[i]=='j')
{
p[i]='i';
}
}
for(i=0;i<l;i=i+2)
{
if(p[i]==p[i+1])
{
l++;
for(int n=l-1;n>i+1;n--)
{
p[n]=p[n-1];
}
p[i+1]='q';
}
}
if(l%2!=0)
{
p[l]='q';
l++;
}
p[l]='\0';
int c,d,e,f;
char h[1000];
int k=0;
for(int o=0;o<l;o=o+2)
{
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(p[o]==m[i][j])