一、Vigenere加密解密原理
加密过程:
假设明文:TOBEHAPPY
秘钥:HELLO
步骤1.给26个字母A-Z按顺序进行编号0-25
字母 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
步骤2.找到明文对应的字母序号
字母 | T | O | B | E | H | A | P | P | Y |
---|---|---|---|---|---|---|---|---|---|
序号 | 19 | 14 | 1 | 4 | 7 | 0 | 15 | 15 | 24 |
步骤3.找到密钥对应的字母序号
字母 | H | E | L | L | O |
---|---|---|---|---|---|
序号 | 7 | 4 | 11 | 11 | 14 |
步骤4 .将明文序号和秘钥序号相加再mod26,即可得到密文序号以及密文。
得到的结果有两种情况:
设a属于明文序号,b书属于秘钥序号,c属于密文序号
- 若a+b<=25,则c=a+b
- 若a+b>=26, 则c=(a+b)%26
解密过程:
假设密文:TOBEHAPPY
密钥:HELLO
步骤1. 找到明文对应的字母序号
字母 | T | O | B | E | H | A | P | P | Y |
---|---|---|---|---|---|---|---|---|---|
序号 | 19 | 14 | 1 | 4 | 7 | 0 | 15 | 15 | 24 |
步骤2. 找到密钥对应的字母序号
字母 | H | E | L | L | O |
---|---|---|---|---|---|
序号 | 7 | 4 | 11 | 11 | 14 |
步骤3. 用密文序号减去密钥序号得到明文字母序号
两种情况;设密文序号为c,密钥序号为b.
- 若c>b,则a=c-b;
- 若c<b,则a=c+26-b;
完整C++代码。
#include <iostream>
using namespace std;
const int maxsize = 100;
//加密算法
void jiami(char* mingwen, char* miwen, char* password, char* table)
{
int t, p;
for (int i = 0; i < strlen(mingwen); i++)
{
for (int j = 0; j < 26; j++)
{
if (mingwen[i] == table[j]|| mingwen[i] == table[j]-32)//明文序号
t = j;
if (password[i%(strlen(password))] == table[j]||password[i % (strlen(password))] == table[j]-32)//密钥序号
p = j;
}
miwen[i] = table[(t + p)%26];//查找对应表中的字符
}
}
//解密算法
void jiemi( char*mingwen,char* miwen,char*password,char* table)
{
int t, p;
for (int i = 0; i < strlen(miwen); i++)
{
for (int j = 0; j < 26; j++)
{
if (miwen[i] == table[j] || miwen[i] == table[j] - 32)//密文序号
t = j;
if (password[i % (strlen(password))] == table[j] || password[i % (strlen(password))] == table[j] - 32)//密钥序号
p = j;
}
if (t < p)
t = t + 26;//超出26,返回时要加26
mingwen[i] = table[t - p];
}
}
void doit()
{
char table[maxsize] = { NULL }, password[maxsize] = { NULL }, miwen[maxsize] = { NULL }, mingwen[maxsize] = { NULL };
for (int i = 0; i < 26; i++)
{
table[i] = 'a' + i;
}
while (1)
{
int idex = 0;
cout << "请选择一个操作: 1.加密 ; 2. 解密 ; -1.退出" << endl;
cin >> idex;
switch (idex)
{
case 1:
{
cout << "请输入密钥:";
cin >> password;
cout << "请输入待加密字符串:";
cin >> mingwen;
jiami(mingwen, miwen, password, table);
cout << "加密后的字符串:";
for (int i = 0; i < strlen(mingwen); i++)
{
cout << miwen[i];
}
cout << endl;
break;
}
case 2:
{
cout << "请输入密钥:";
cin >> password;
cout << "请输入待解密字符串:";
cin >> miwen;
jiemi(mingwen, miwen, password, table);
cout << "解密后的字符串:";
for (int i = 0; i < strlen(miwen); i++)
{
cout << mingwen[i];
}
cout << endl;
break;
}
case -1:
{
exit(0);
}
}
}
}
int main()
{
doit();
return 0;
}
#运行截图参考: