问题概述
题目:算法-维吉尼亚密码
问题描述:
维吉尼亚密码是一种简单的多表代换密码(由26个类似的凯撒密码的代换表组成),即由一些偏移量不同的恺撒密码组成,这些代换在一起组成了密钥。英文中az,由025表示。假设串长为m,明文为P,密文为C,密钥为K则
C = (P1 + K1, P2 + K2, P3 + K3 …, Pm + Km) mod 26
P = (C1 - K1, C2 - K2, C3 - K3 …, Cm + Km) mod 26
输入:
两行数据,第一行为明文数据,第二行为密钥数据
输出:
第三行输出加密的密文数据
样例输入:
“testData”
“testKey”
样例输出:
mikmNert
1. 问题分析
1.1 算法核心
本博客旨在分享cpp代码实现维吉尼亚密码,核心思想就是字母移位,维吉尼亚密码与凯撒密码非常类似,有兴趣的同学可以在网上查一查。
1.2 算法分析
维吉尼亚加密法与凯撒加密很相似,只是这种加密方法在对明文和密码转换时,引入了“密钥”的概念。使用密钥(一组字符)代替了K(固定的移动位数,步长)。这种加密方法使用的字符密钥将26个英文字母用0~25表示,通常对密钥字母不区分大小写。
具体实现步骤:
第一步,得到明文数据长度,
第二步,将密钥数据全部转换为小写或大写,
第三步,循环使用密钥对明文数据加密。
2. 解决方案
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <istream>
using namespace std;
/*
算法问题:维吉尼亚密码
问题描述:
维吉尼亚密码是一种简单的多表代换密码(由26个类似的凯撒密码的代换表组成),即由一些偏移量不同的恺撒密码组成,这些代换在一起组成了密钥。英文中a~z,由0~25表示。假设串长为m,明文为P,密文为C,密钥为K则
C = (P1 + K1, P2 + K2, P3 + K3 ....., Pm + Km) mod 26
P = (C1 - K1, C2 - K2, C3 - K3 ....., Cm + Km) mod 26
输入:
第一行为明文数据,
第二行为密钥数据
输出:
第三行输出加密的密文数据
样例输入:
"testData"
"testKey"
样例输出:
mikmNert
*/
#define ALPHANUMBER 26
int main(void)
{
string inputStr; // 输入的明文字符串
string keyStr; // 用作加密的密钥字符串
string outputStr; // 密文字符串
cin >> inputStr;
cin >> keyStr;
for (int i = 0; i < keyStr.length(); i++)
if (keyStr[i] >= 'A' && keyStr[i] <= 'Z')
keyStr[i] = keyStr[i] + 32;
// cout << keyStr.length() << endl;
// cout << keyStr << endl;
int j = 0;
for(int i = 0; i < inputStr.length(); i++)
if(isalpha(inputStr[i]))
{
if(inputStr[i] >= 'A' && inputStr[i] <= 'Z')
outputStr[i] = ((inputStr[i] - 65) + (keyStr[j++] - 97)) % ALPHANUMBER;
else if (inputStr[i] >= 'a' && inputStr[i] <= 'z')
outputStr[i] = ((inputStr[i] - 97) + (keyStr[j++] - 97)) % ALPHANUMBER;
j = j % keyStr.length();
}
for(int i =0 ; i < inputStr.length(); i++)
if(isalpha(inputStr[i]))
{
if (inputStr[i] >= 'A' && inputStr[i] <= 'Z')
printf("%c", outputStr[i] + 65);
else if (inputStr[i] >= 'a' && inputStr[i] <= 'z')
printf("%c", outputStr[i] + 97);
else
printf("%c", inputStr[i]);
}
return 0;
}
3. 资源分享
旗木白哉のGitHub:
https://github.com/YangMengHeng
GitHub/Gitee源代码下载地址:
GitHub
https://github.com/YangMengHeng/myCode/tree/master/VSCode
https://github.com/YangMengHeng/myCode/tree/master/Java
Gitee
https://gitee.com/QMBZ/myCode/tree/master/VSCode
https://gitee.com/QMBZ/myCode/tree/master/Java
旗木白哉のblog源代码下载地址:
https://github.com/YangMengHeng/myCode/tree/master/%E6%97%97%E6%9C%A8%E7%99%BD%E5%93%89%E3%81%AEblog
https://gitee.com/QMBZ/myCode/tree/master/%E6%97%97%E6%9C%A8%E7%99%BD%E5%93%89%E3%81%AEblog