密码学课程的第一个实验,算法实现转轮机的加解密,此处用c++
转轮密码机的原理如图:
图一为初始状态,图二为输入一位明文后的状态

这是三转轮密码机,有慢轮、中轮、快轮三个速度不同的轮子,加密时:输出一位后,快轮逆时针转动一次,快轮转满26次即一圈时,中轮子转动一次,中轮转满26圈时,快轮转动一次。解密过程则反过来转。
具体注意点在源码注释中强调。

源码如下:

#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;void TurnWheel(int* wheel_l,int* wheel_r);//加密时正向转动一次
void ReverseWheel(int* wheel_l,int* wheel_r);//解密时逆向转动一次
void Encrypt(char* mingwen,char* miwen,int* slow_l,int* slow_r,int* middle_l,int* middle_r,int* fast_l,int* fast_r);//加密
void Decrypt(char* miwen,char* mingwen,int* slow_l,int* slow_r,int* middle_l,int*middle_r,int* fast_l,int* fast_r);//解密int main()
{int a;while(true){cout<<"Please choose the action you want:\n1.Encrypt\t2.Decrypt"<<endl;cin>>a;//慢中快三个轮子的初始状态int slow_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_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 middle_l[26]={26,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};int middle_r[26]={20,1,6,4,15,3,14,12,23,5,16,2,22,19,11,18,25,24,13,7,10,8,21,9,26,17};int fast_l[26]={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,26};int fast_r[26]={8,18,26,17,20,22,10,3,13,11,4,23,5,24,9,12,25,16,19,6,15,21,2,7,1,14};char* mingwen=new char[128];char* miwen=new char[128];memset(mingwen,0,128);//初始化memset(miwen,0,128);switch(a){ case 1:system("cls");cout<<"Please input the string you want to entrypt:"<<endl;cin>>mingwen;Encrypt(mingwen,miwen,slow_l,slow_r,middle_l,middle_r,fast_l,fast_r);cout<<"cipertext:"<<endl;for(unsigned int i=0;i<strlen(miwen);i++){cout<<miwen[i];}cout<<endl;break;case 2:system("cls");cout<<"Please input the string you want to decrypt:"<<endl;cin>>miwen;Decrypt(miwen,mingwen,slow_l,slow_r,middle_l,middle_r,fast_l,fast_r);cout<<"cleartext:"<<endl;for(unsigned int i=0;i<strlen(mingwen);i++){cout<<mingwen[i];}cout<<endl;break;default:system("cls");break;}}return 0;
}void TurnWheel(int* wheel_l,int* wheel_r)
{int temp=wheel_l[25];for(int i=25;i>0;i--)wheel_l[i]=wheel_l[i-1];wheel_l[0]=temp;temp=wheel_r[25];for(int i=25;i>0;i--)wheel_r[i]=wheel_r[i-1];wheel_r[0]=temp;
}
void ReverseWheel(int* wheel_l,int* wheel_r)
{int temp=wheel_l[0];for(int i=0;i<25;i++)wheel_l[i]=wheel_l[i+1];wheel_l[25]=temp;temp=wheel_r[0];for(int i=0;i<25;i++)wheel_r[i]=wheel_r[i+1];wheel_r[25]=temp;
}
void Encrypt(char* mingwen,char* miwen,int* slow_l,int* slow_r,int* middle_l,int* middle_r,int* fast_l,int* fast_r)
{int count=0;//快轮转动次数for(unsigned int i=0;i<strlen(mingwen);i++)//加密{if('A'<=mingwen[i]&&mingwen[i]<='Z'){int current=mingwen[i]-'A';//确定位置current=slow_l[current];for(int j=0;j<26;j++){if(current==slow_r[j]){current=middle_l[j];break;}}for(int j=0;j<26;j++){if(current==middle_r[j]){current=fast_l[j];break;}}for(int j=0;j<26;j++){if(current==fast_r[j]){current=j;break;}}miwen[i]=char(current+65); count++;TurnWheel(fast_l,fast_r);//快轮转动一次if(count%26==0)//判断是否要转动{TurnWheel(middle_l,middle_r);if(count%(26*26)==0){TurnWheel(slow_l,slow_r);}}}}
}
void Decrypt(char* miwen,char* mingwen,int* slow_l,int* slow_r,int* middle_l,int*middle_r,int* fast_l,int* fast_r)
{int count=0;for(unsigned int i=0;i<strlen(miwen);i++)//先让轮子转成加密后的状态{if('A'<=miwen[i]&&miwen[i]<='Z'){count++;TurnWheel(fast_l,fast_r);}}  if(count%26==0){TurnWheel(middle_l,middle_r);if(count%(26*26)==0){TurnWheel(slow_l,slow_r);}}for(int i=strlen(miwen)-1;i>=0;i--)//解密{if('A'<=miwen[i]&&miwen[i]<='Z'){ReverseWheel(fast_l,fast_r);//快轮先转回去一次再解密int current=miwen[i]-'A';current=fast_r[current];for(int j=0;j<26;j++){if(current==fast_l[j]){current=middle_r[j];break;}}for(int j=0;j<26;j++){if(current==middle_l[j]){current=slow_r[j];break;}}for(int j=0;j<26;j++){if(current==slow_l[j]){current=j;break;}}if(count%26==0){ReverseWheel(middle_l,middle_r);if(count%(26*26)==0){ReverseWheel(slow_l,slow_r);}}count--;//前面判断完了再减一mingwen[i]=char(current+65);}}
}

测试:
明文:HELLOWORLD
密文:MGPOTIMTJU

如发现问题欢迎一起交流讨论!俺也是第一次弄这个。。

转轮密码机的加解密算法实现相关推荐

  1. Enigma加解密算法实现C++

    Enigma加解密算法实现C++ 刚刚接触密码学,就打算用C++实现一下Enigma的加解密.加密的思想就是非常经典的多表代换. 德国二战时期的密码系统:亚瑟·谢尔比乌斯 为了战胜enigma,英国在 ...

  2. .Net/C# 实现: FlashFXP 地址簿中站点密码的加解密算法

    参阅 CCFer & TLFer : kanbol 的 Java 代码翻译修改而成: kanbol 说: 之前在TLF写过一个程序自动更新flashfxp的地址簿,也就是修改sites.dat ...

  3. (转)base64编码(严格说来,base64不算作加解密算法)

    [README] 1.本文转自: Java base64加密解密 - xuwc - 博客园参考: https://www.cnblogs.com/luguo3000/p/3940197.html ht ...

  4. C语言实现DES加解密算法

    C语言实现DES加解密算法 DES加解密 DES加解密 #include <stdio.h> #include <stdlib.h> #include <string.h ...

  5. C语言实现AES加解密算法

    C语言实现AES加解密算法 AES加解密 AES加解密 #include <stdio.h> #include <stdint.h> #include <memory.h ...

  6. C语言实现TEA系列加解密算法

    C语言实现TEA系列加解密算法 TEA加解密 XTEA加解密 XXTEA加解密 TEA加解密 #include <stdio.h> #include <stdint.h>//加 ...

  7. KP-ABE基于属性的加密加解密算法及Access Tree构建

    注:本文加解密算法构建完全参考经典ABE paper: Attribute-Based Encryption for Fine-Grained Access Control of Encrypted ...

  8. js des加密 java_Java实现与JS相同的Des加解密算法完整实例

    本文实例讲述了Java实现与JS相同的Des加解密算法.分享给大家供大家参考,具体如下: 这里演示java与js实现相同的des加解密算法,不多说,不废话,直接上代码 一.java实现 package ...

  9. Python中的AES加解密算法

    AES加密的参数及其条件:这个AES加密的主要坑就在于这些条件,首先AES加密有几个参数 秘钥:加密的时候用秘钥,解密的时候需要同样的秘钥才能解出来 明文:需要加密的内容 模式:aes 加密常用的有E ...

  10. python中凯撒密码_python实现凯撒密码、凯撒加解密算法

    凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果 注意:密文是大写字母,在变换加密之前把明文字母都替换为大写字母 def casar(message): # *************begin* ...

最新文章

  1. shape file与coverage叠加的问题
  2. 电子产品设计流程_指纹锁生产的八大工序流程
  3. latex插入gif_如何将照片和GIF插入Google幻灯片
  4. [html] 如何扩大CheckBox点击区域
  5. RTL8201网络芯片讲解
  6. 【NOIP1999】【codevs1083】Cantor表(找规律)
  7. 计算机三级数据库应用题设计题,计算机考试三级数据库练习题
  8. [github] github入手教程
  9. Intel和AMD的区别
  10. echarts 柱状图渐变色背景
  11. Rmxprt Maxwell 生成2D和3D全模型方法
  12. 1007 Rikka with Travels Rikka with Travels
  13. ubuntu删除错误的ATI驱动
  14. 融云CEO董晗:国产化进程加速,助推政企数智办公平台深化发展
  15. 2021年全球及中国金融科技行业发展概况及发展趋势分析[图]
  16. 1068: 池塘的水草
  17. #STC8A8K# #STC8F1K# #STC8G1K# #STC8H1K# ——STC8系列单片机整体评价
  18. 心脏病和卒中非传统风险因素在女性中的上升幅度超过男性
  19. CSS Houdini:用浏览器引擎实现高级CSS效果
  20. 十六进制与字符串的转换

热门文章

  1. Redhat 9.0之xtt+xft2,可显示粗斜体美化总结(第二版)
  2. Readyboost功能
  3. 蓝桥杯2014java_【图片】2014-2016蓝桥杯java本科B组省赛题_蓝桥杯吧_百度贴吧
  4. Ryu学习总结(持续更新)
  5. 笔记本电脑建立Wifi热点多种方法
  6. 联通计算机用户名和密码,终极:联通路由器的默认登录密码是什么?
  7. 普通文档怎么换成php,腾讯在线文档如何转化为普通文档
  8. 1、mysql创建事件
  9. #多个基因批量cox 多因素回归cox univariate Adjust for age sex单个基因cox 回归分析 多因素 矫正年龄性别之后的cox回归分析 矫正年龄性别之后的cox生存分析
  10. python编写程序统计一元人民币换成一分、两分和五分的所有兑换方案个数(用while循环)