古典密码(凯撒密码/维吉尼亚密码/Play fair密码/Hill密码)的实现(MFC界面)

这篇博客介绍了使用MFC编程实现古典密码学中的凯撒密码、维吉尼亚密码、Play fair密码和Hill密码的加密解密系统。作者提供了源码下载,包括加密、解密函数以及矩阵生成等关键功能的实现。
摘要由CSDN通过智能技术生成

学了一些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])
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值