算法-维吉尼亚密码

问题概述


题目:算法-维吉尼亚密码

问题描述:
维吉尼亚密码是一种简单的多表代换密码(由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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值