📄 cryptographydlg.cpp
字号:
m_StrCipInPut.Insert(Length,'x');
Length = Length+1;
}
//将字母对换成相应的密文
for (int x = 0,y = 1;y<Length;x = x+2,y = y+2)
{
char ch1=m_StrCipInPut.GetAt(x);
char ch2=m_StrCipInPut.GetAt(y);
//查找字母对在矩阵中的位置
for (m = 0;m < 5;m++)
{
for (n = 0;n < 5;n++)
{
if(str[m].GetAt(n) ==ch1 )
{
p = m;
q = n;
}
if (str[m].GetAt(n) ==ch2 )
{
row = m;
col = n;
}
}
}
//同行取右边
if (p == row)
{
q = (q+1)%5;
col = (col+1)%5;
str1 += str[p].GetAt(q);
str1 += str[row].GetAt(col);
}
//同列取下边
else if (q == col)
{
p = (p+1)%5;
row = (row+1)%5;
str1 += str[p].GetAt(q);
str1 += str[row].GetAt(col);
}
//其他取交叉
else
{
str1 +=str[p].GetAt(col);
str1 +=str[row].GetAt(q);
}
}
m_StrCipInPut = str1;
UpdateData(FALSE);
}
void CCryptographyDlg::PlayfairDecrypt()
{
UpdateData(TRUE);
m_StrPlainTextOut = "";
//构建Playfair密表
CString str[20];
char FileArray[5];
memset(&FileArray,0,5);
ifstream myFile;
int i = 0,j = 0,m = 0,n = 0,l = 0,q = 0,p = 0,rom = 0,low = 0;
myFile.open("Playfair.txt",ios_base::in); //读取Playfair密表
while(myFile.getline(FileArray,20)&&i<5)
{
str[i].Format("%s",FileArray);
i++;
}
myFile.close();
CString str1,str2;
int Length = m_StrCipInPut.GetLength();
//将密文字母对转换为明文之母对
for (int x = 0,y = 1;y<Length;x = x+2,y = y+2)
{
//查找密文在矩阵中的位置
for (m = 0;m < 5;m++)
{
for (n = 0;n < 5;n++)
{
if(str[m][n] == m_StrCipInPut.GetAt(x))
{
p = m;q = n;
}
if (str[m][n] == m_StrCipInPut.GetAt(y))
{
rom = m;low = n;
}
}
}
//同行取右边
if (p == rom)
{
q = ((q-1)+5)%5;
low = ((low-1)+5)%5;
str1 += str[p][q];
str1 += str[rom][low];
}
//同列取下边
else if (q == low)
{
p = ((p-1)+5)%5;
rom = ((rom-1)+5)%5;
str1 += str[p][q];
str1 += str[rom][low];
}
//其他取交叉
else
{
str1 +=str[p][low];
str1 +=str[rom][q];
}
}
m_StrPlainTextOut = str1;
UpdateData(FALSE);
}
//Vigenere密码
void CCryptographyDlg::Vigenere()
{
UpdateData(TRUE);
m_StrCipInPut = "";
char FileArray[1000];
memset(&FileArray,0,1000);
ifstream myFile;
int i = 0,j = 0,k = 0,l = 0,m = 0;
myFile.open("Vigenere.txt",ios_base::in); //读取vigenere密表
while(myFile.getline(FileArray,1000)&&i<26)
{
pass[i] = FileArray;
i++;
}
myFile.close();
CString plainttext ="abcdefghijklmnopqrstuvwxyz";
int Length = m_StrPlaintTextInPut.GetLength();
CString array[1000] = {""},array1[26] = {""}; //array[]保存明文
while (j<Length) //获取明文
{
array[j] = m_StrPlaintTextInPut.GetAt(j);
j++;
}
if (m_StrPass =="") //获取密钥
{
AfxMessageBox("请输入密钥");
return;
}
int L = m_StrPass.GetLength();
while (k<L) //array1[]保存密钥
{
array1[k] = m_StrPass.GetAt(k);
k++;
}
for (j = 0,k = 0;j<Length;j++,k++)
{
k = k%L;
l = plainttext.Find(array[j]);
m = plainttext.Find(array1[k]);
m_StrCipInPut +=pass[m].GetAt(l); //在vigenere表中查找对应的字母
}
UpdateData(FALSE);
}
void CCryptographyDlg::VigenereDecrypt()
{
UpdateData(TRUE);
m_StrPlainTextOut = "";
char FileArray[1000];
memset(&FileArray,0,1000);
int i = 0,j = 0,k = 0,l = 0,m = 0,o = 0,p = 0;
ifstream myFile;
myFile.open("vigtable.txt",ios_base::in);
while(myFile.getline(FileArray,1000)&&i<26)
{
pass[i] = FileArray;
i++;
}
myFile.close();
CString plainttext ="abcdefghijklmnopqrstuvwxyz";
int Length = m_StrPlaintTextInPut.GetLength();
CString array[1000] = {""},array1[26] = {""};
int L = m_StrPass.GetLength();
while (k<L)
{
array1[k] = m_StrPass.GetAt(k);
k++;
}
for (j = 0,k = 0;j<Length;j++,k++)
{
k = k%L;
m = plainttext.Find(array1[k]); //获取密钥行号
for (int n = 0;n<26;n++) //根据行号来查找对应的密文字母,并记录列号
{
if (pass[m].GetAt(n) == m_StrCipInPut.GetAt(j))
{
o = n;
}
}
m_StrPlainTextOut +=plainttext.GetAt(o); //O即为列号
}
UpdateData(FALSE);
}
//置换密码
void CCryptographyDlg::Permutation ()
{
UpdateData(TRUE);
m_StrCipInPut = "";
int Length = m_StrPlaintTextInPut.GetLength(); //获取明文的长度
if (m_StrPass == "")
{
AfxMessageBox("请输入密钥");
return;
}
int L = m_StrPass.GetLength(); //获取密钥的长度和矩阵的列数
int i = 0, j= 0,p = 0,q = 0,r = 0;
CString array[100][100] = {""};
//若明文长度小于密钥长度
if (Length<L)
{
for (int n = 0;n < Length; n++)
{
if (p == Length)
{
break;
}
array[0][n] = m_StrPlaintTextInPut.GetAt(p); //将明文保存到array[]中
p++;
}
char v = '1'; //密钥长度为8,从1开始
while (v<'8')
{
q = m_StrPass.Find(v);
m_StrCipInPut +=array[0][q];
v++;
}
}
//明文长度大于密钥长度
else
{
j = (int)(Length/L)+1; //构造矩阵的行数
for (int k = 0;k<j;k++)
{
for (int n = 0;n < L;n++)
{
if (p == Length)
{
break;
}
array[k][n] = m_StrPlaintTextInPut.GetAt(p);
p++;
}
}
char v = '1';
while (v <'8')
{
q = m_StrPass.Find(v);
r = 0;
while (r<j)
{
m_StrCipInPut +=array[r][q];
r++;
}
v++;
}
}
UpdateData(FALSE);
}
void CCryptographyDlg::PermutationDecrypt()
{
UpdateData(TRUE);
m_StrPlainTextOut = "";
int Length = m_StrCipInPut.GetLength(); //获取密文的长度
if (m_StrPass == "")
{
AfxMessageBox("请输入密钥");
return;
}
int L = m_StrPass.GetLength(); //获取密钥的长度和矩阵的列数
int i = 0, j= 0,p = 0,q = 0,r = 0;
CString array[100][100] = {""};
//若明文长度小于密钥长度
if (Length<L)
{
int b = 0;
char v = '1';
while (v<'8')
{
q = m_StrPass.Find(v);
int k = 0;
for (;k<1,b<Length;b++,k++)
{
if (k == 1)
{
break;
}
array[0][q] = m_StrCipInPut.GetAt(b);
}
v++;
}
for (int n = 0;n < L;n++)
{
if (p == L)
{
break;
}
m_StrPlainTextOut +=array[0][n];
p++;
}
}
//明文长度大于密钥长度
else
{
j = (int)(Length/L)+1; //构造矩阵的行数
int t = Length%L;
int b = 0;
char v = '1';
while (v <'8')
{
q = m_StrPass.Find(v); //从小到大找出对应的列号
r = 0;
for (;b<L,r<j;b++,r++)
{
if(r == j-1&&q>t)
{
break;
}
array[r][q] = m_StrCipInPut.GetAt(b);
}
v++;
}
//明文保存
for (int k = 0;k<j;k++)
{
for (int n = 0;n < L;n++)
{
if (p == Length)
{
break;
}
m_StrPlainTextOut +=array[k][n];
p++;
}
}
}
UpdateData(FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -