📄 vigeneredlg.cpp
字号:
// VigenereDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Crypt.h"
#include "VigenereDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static CString alphabet = "abcdefghijklmnopqrstuvwxyz";
static CString ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/////////////////////////////////////////////////////////////////////////////
// CVigenereDlg dialog
CVigenereDlg::CVigenereDlg(CWnd* pParent /*=NULL*/)
: CDialog(CVigenereDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CVigenereDlg)
m_strCipher = _T("");
m_strKey = _T("");
m_strPlainText = _T("");
//}}AFX_DATA_INIT
}
void CVigenereDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CVigenereDlg)
DDX_Text(pDX, IDC_Cipher, m_strCipher);
DDX_Text(pDX, IDC_Key, m_strKey);
DDX_Text(pDX, IDC_PlainText, m_strPlainText);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CVigenereDlg, CDialog)
//{{AFX_MSG_MAP(CVigenereDlg)
ON_BN_CLICKED(IDC_Encrypt, OnVigenereEncrypt)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVigenereDlg message handlers
/*
Vigenere加密体制:
设明文m=m1m2...mn,密钥k=k1k2...kp,则密文为:
c=Ek(m)=(mi+ki)mod26
*/
void CVigenereDlg::OnVigenereEncrypt()
{
// TODO: Add your control notification handler code here
int m_iPlainTextLen, m_iKeyLen;
int i, j, num1, num2, pos;
char m_chPlainText[1000], m_chKey[1000], m_chCipher[1000];
int m_iPlainText[1000], m_iKey[1000], m_iCipher[1000];
for(i=0; i<1000; i++)
{
m_chPlainText[i] = '\0';
m_chKey[i] = '\0';
m_chCipher[i] = '\0';
}
UpdateData(true);
//得到明文,并建立明文整数数组
m_iPlainTextLen = m_strPlainText.GetLength();
if(m_iPlainTextLen <= 0)
{
AfxMessageBox("No PlainText to encrypt!", MB_ICONSTOP|MB_OK);
exit(0);
}
char* m_pPlainText = new char[m_iPlainTextLen];
m_pPlainText = m_strPlainText.GetBuffer(0);
num1 = 0;
while(num1 < m_iPlainTextLen)
{
if(97<=*m_pPlainText && *m_pPlainText<=122)
pos = alphabet.Find(*m_pPlainText);
else if(65<=*m_pPlainText && *m_pPlainText<=90)
pos = ALPHABET.Find(*m_pPlainText);
m_iPlainText[num1] = pos;
m_pPlainText ++;
num1 ++;
}
//得到密文,并建立密文整数数组
m_iKeyLen = m_strKey.GetLength();
if(m_iKeyLen <= 0)
{
AfxMessageBox("No Key to use!", MB_ICONSTOP|MB_OK);
exit(0);
}
char* m_pKey = new char[m_iKeyLen];
m_pKey = m_strKey.GetBuffer(0);
num2 = 0;
while(num2 < m_iKeyLen)
{
if(65<=*m_pKey && *m_pKey<=90)
pos = ALPHABET.Find(*m_pKey);
else if(97<=*m_pKey && *m_pKey<=122)
pos = alphabet.Find(*m_pKey);
m_iKey[num2] = pos;
m_pKey ++;
num2 ++;
}
//如果明文没有密钥长
if(num1 <= num2)
{
for(i=0; i<num1; i++)
{
m_iCipher[i] = (m_iPlainText[i] + m_iKey[i]) % 26;
m_chCipher[i] = alphabet.GetAt(m_iCipher[i]);
}
}
//如果明文比密文长
else
{
int quotient = (int)(num1/num2);
int compliment = num1 % num2;
for(i=0; i<quotient; i++)
{
for(j=0; j<num2; j++)
{
m_iCipher[i*num2+j] = (m_iPlainText[i*num2+j] + m_iKey[j]) % 26;
m_chCipher[i*num2+j] = alphabet.GetAt(m_iCipher[i*num2+j]);
}
}
if(compliment > 0)
{
for(i=0; i<compliment; i++)
{
m_iCipher[quotient*num2+i] = (m_iPlainText[quotient*num2+i] + m_iKey[i]) % 26;
m_chCipher[quotient*num2+i] = alphabet.GetAt(m_iCipher[quotient*num2+i]);
}
}
}
m_strCipher.Format("%s", m_chCipher);
UpdateData(false);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -