1、使用维吉尼亚密码的原因
(1)单表代换密码的安全性不高,一个原因是一个明文字母只有一个密文字母代替
(2)构造多个密文字母表,在密钥的控制下用相应密文字母表中的一个字母来代替明文字母表中的一个字母。一个明文字母有多种代替。
2、原理
解释“一个明文字母有多种代替”:在长为m的密码中,任何一个字母可被影射为26个字母中的一个
明 文 p∈(Z26)m,密 文 c∈(Z26)m,密 钥k∈(Z26)m
◼ 加密
c=(p1+k1,p2+k2 ,…, pm+km) mod 26;
◼ 解密
p=(c1-k1,c2-k2 ,…, cm-km) mod 26.
3、示例
行表头:密钥key ;
列表头:明文P ;
两者交汇点为密文。密文的不同取决于密钥,即任何明文都可以被加密成任何一个字母。
4、代码
#include<iostream>
#include<cstring>
#include <string>
using namespace std;
//加密
string encrypt(string p, string k)
{
string c = "";
int lk = k.size(), pl = p.size(), s = 0;
for (int i = 0; i < pl; i++)
{
//其它字符
if (p[i] >= 'a' && p[i] <= 'z')
{
int j = (i - s) % lk;
c += (p[i] - 'a' + k[j] - 'a') % 26 + 'a';
}
else if (p[i] >= 'A' && p[i] <= 'Z')
{
int j = (i - s) % lk;
c += (p[i] - 'A' + k[j] - 'A') % 26 + 'A';
}
else
{
c += p[i];
s++;
}
}
return c;
}
//解密
string decrypt(string c, string k)
{
string p = "";
int lk = k.size(), cl = c.size(), s = 0;
for (int i = 0; i < cl; i++)
{
//其它字符
if (c[i] >= 'a' && c[i] <= 'z')
{
int j = (i - s) % lk;
p += (c[i] - 'a' + 26 - (k[j] - 'a')) % 26 + 'a';
}
else if (c[i] >= 'A' && c[i] <= 'Z')
{
int j = (i - s) % lk;
p += (c[i] - 'A' + 26 - (k[j] - 'A')) % 26 + 'a';
}
else
{
p += c[i];
s++;
}
}
return p;
}
int main()
{
string a, b;
cout << "请输入明文(可以输入任意符号,但仅对大小写字母进行加密):";
getline(cin, a);
cout << "请输入密钥:";
getline(cin, b);
cout << "密文为:" << encrypt(a, b) << endl;
cout << "明文为:" << decrypt(encrypt(a, b), b);
}