转轮密码机的原理如图:
图(a)为初始状态,图(b)为输入一位明文后的状态
图片来自现代密码学教程第2版(2015年版)
三转轮密码机有慢速、中速、快速三个轮子,加密时:入明文一位,出密文一位,快轮逆时针转动一格,快轮转满26次即一圈时,中轮子转动一格,中轮转满26圈时,慢轮转动一次。解密过程即为加密的逆过程。
因实验不要求解密时用密钥,故本文不包含密钥相关内容。
CSDN博客中已经有几篇不错的文章给出算法思路,但看了源码部分多少有些不如意,问题有如下几个:直接验证不给交互、对题意理解有偏差、解密功能中判断和回转的顺序错误导致密文超过26位就无法正确解密。
我的源码如下,欢迎批评指正:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstring>
using namespace std;
void Turn_wheel(int* wheel_l, int* wheel_r); // 正向转
void Reverse_turn_wheel(int* wheel_l, int* wheel_r);//反向转
void Encrypt(char* cleartext, char* ciphertext, int* slow_wheel_l, int* slow_wheel_r, int* mid_wheel_l, int* mid_wheel_r,
int* fast_wheel_l, int* fast_wheel_r);
void Decrypt(char* ciphertext, char* cleartext, int* slow_wheel_l, int* slow_wheel_r, int* mid_wheel_l, int* mid_wheel_r,
int* fast_wheel_l, int* fast_wheel_r);
int main()
{
int a;
while (true) {
cout << "Please choose the action you want:\n1.Encrypt\t2.Decrypt" << endl;
cin >> a;
// 快、中、慢三个轮子初始状态
int slow_wheel_l[26] = {
24,25,26,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 };
int slow_wheel_r[26] = {
21,3,15,1,19,10,14,26,20,8,16,7,22,4,11,5,17,9,12,23,18,2,25,6,24,13 };
int mid_wheel_l[26] = {
26,1,2,3,4,5,6,7,8,9,10,11,12,13,