vigenere 密码是一种用于加密和解密文本的算法。vigenere 密码是一种加密字母文本的算法,使用一系列交织的凯撒密码。它基于关键字的字母。这是一个多字母替换密码的例子。该算法易于理解和实现。这个算法最早是在 1553 年由吉奥万·巴蒂斯塔·贝拉索描述的。它使用维格纳表或维格纳方块来加密和解密文本。vigenere 表也被称为白板。
当给定 vigenere 表时,在该方法中使用 vigenere 表(26 * 26 矩阵)进行加密和解密。
例:明文为“JAVATPOINT”,密钥为“BEST”。
要生成新密钥,只要纯文本的长度不等于新密钥,给定密钥就会以循环方式重复。
加密
明文的第一个字母与密钥的第一个字母组合在一起。纯文本“J”的列和密钥“B”的行与 vigenere 表中的字母“K”相交,因此密文的第一个字母是“K”。
同样,明文的第二个字母与密钥的第二个字母组合在一起。明文“A”的列和密钥“E”的行与 vigenere 表中的字母“E”相交,因此密文的第二个字母是“E”。
这个过程一直持续到明文完成。
塞浦路斯文 =肯顿堡盒
解密
解密由 vigenere 表中的密钥行完成。首先选择关键字母所在的行,找到密文字母在该行的位置,然后选择对应密文的列标签作为明文。
例如,在密钥的行中是“B”,密文是“K”,这个密文字母出现在“J”列中,这意味着第一个明文字母是“J”。
接下来,在密钥的行中是“E”,密文是“E”,这个密文字母出现在“A”列中,这意味着第二个明文字母是“A”。
这个过程一直持续到密文结束。
明文 = JAVATPOINT
当未给定 vigenere 表时,该方法中的加密和解密由 Vigenar 代数公式完成(将字母(A-Z)转换为数字(0-25))。
加密公式为,
Ei = (Pi + Ki) mod 26
解密公式为,
Di = (Ei - Ki) mod 26
如果任何情况下(D i )值变成负值(-ve),在这种情况下,我们将在负值中加上 26。
在哪里,
e 表示加密。
d 表示解密。
p 表示明文。
k 表示钥匙。
例:明文为“JAVATPOINT”,密钥为“BEST”。
**加密:**EI=(PI+KI)mod 26
| 纯文本 | J | A | V | A | T | P | O | 我 | 普通 | T | | 明文值(P) | 09 | 00 | Twenty-one | 00 | Nineteen | Fifteen | Fourteen | 08 | Thirteen | Nineteen | | 钥匙 | B | E | S | T | B | E | S | T | B | E | | 键值 | 01 | 04 | Eighteen | Nineteen | 01 | 04 | Eighteen | Nineteen | 01 | 04 | | 密文值 | Ten | 04 | Thirteen | Nineteen | Twenty | Nineteen | 06 | 01 | Fourteen | Twenty-three | | 密文 | K | E | 普通 | T | U | T | G | B | O | X |
**解密:**DI=(EI-KImod 26
如果任何情况下(Di)值变成负值(-ve),在这种情况下,我们将在负值中加上 26。比如,密文的第三个字母;
N = 13,S = 18
dI=(eI-kImod 26
d .“t0”、“I”、“T1”和“mod 26”
d .“t0”、“I”、“T1”、“5 模式 26”
(d)t0±I±t1 = =-5+26)mod 26
D i = 21
| 密文 | K | E | 普通 | T | U | T | G | B | O | X | | 密文值 | Ten | 04 | Thirteen | Nineteen | Twenty | Nineteen | 06 | 01 | Fourteen | Twenty-three | | 钥匙 | B | E | S | T | B | E | S | T | B | E | | 键值 | 01 | 04 | Eighteen | Nineteen | 01 | 04 | Eighteen | Nineteen | 01 | 04 | | 明文值(P) | 09 | 00 | Twenty-one | 00 | Nineteen | Fifteen | Fourteen | 08 | Thirteen | Nineteen | | 纯文本 | J | A | V | A | T | P | O | 我 | 普通 | T |
C 语言
#include #include <string>using namespace std;
int main()
{
Vigenere cipher("VIGENERECIPHER");
string original = "I AM INDIAN";
string encrypted = cipher.encrypt(original);
string decrypted = cipher.decrypt(encrypted);
cout << original << endl;
cout << "Encrypted: " << encrypted << endl;
cout << "Decrypted: " << decrypted << endl;
}
class Vigenere
{
public:
string key;
Vigenere(string key)
{
for (int i = 0; i < key.size(); ++i)
{
if (key[i] >= 'A' && key[i] <= 'Z')
this -> key += key[i];
else if (key[i] >= 'a' && key[i] <= 'z')
this -> key += key[i] + 'A' - 'a';
}
}
string encrypt(string text)
{
string out;
for (int i = 0, j = 0; i < text.length(); ++i)
{
char c = text[i];
if (c >= 'a' && c <= 'z')
c += 'A' - 'a';
else if (c < 'A' || c > 'Z')
continue;
out += (c + key[j] - 2 * 'A') % 26 + 'A';
j = (j + 1) % key.length();
}
return out;
}
string decrypt(string text)
{
string out;
for (int i = 0, j = 0; i < text.length(); ++i)
{
char c = text[i];
if (c >= 'a' && c <= 'z')
c += 'A' - 'a';
else if (c < 'A' || c > 'Z')
continue;
out += (c - key[j] + 26) % 26 + 'A';
j = (j + 1) % key.length();
}
return out;
}
};</string>
输出:
I AM INDIAN
Encrypted: SDERFGTUJ
Decrypted: IAMINDIAN