转轮密码机的加解密算法实现
密码学课程的第一个实验,算法实现转轮机的加解密,此处用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
如发现问题欢迎一起交流讨论!俺也是第一次弄这个。。
转轮密码机的加解密算法实现相关推荐
- Enigma加解密算法实现C++
Enigma加解密算法实现C++ 刚刚接触密码学,就打算用C++实现一下Enigma的加解密.加密的思想就是非常经典的多表代换. 德国二战时期的密码系统:亚瑟·谢尔比乌斯 为了战胜enigma,英国在 ...
- .Net/C# 实现: FlashFXP 地址簿中站点密码的加解密算法
参阅 CCFer & TLFer : kanbol 的 Java 代码翻译修改而成: kanbol 说: 之前在TLF写过一个程序自动更新flashfxp的地址簿,也就是修改sites.dat ...
- (转)base64编码(严格说来,base64不算作加解密算法)
[README] 1.本文转自: Java base64加密解密 - xuwc - 博客园参考: https://www.cnblogs.com/luguo3000/p/3940197.html ht ...
- C语言实现DES加解密算法
C语言实现DES加解密算法 DES加解密 DES加解密 #include <stdio.h> #include <stdlib.h> #include <string.h ...
- C语言实现AES加解密算法
C语言实现AES加解密算法 AES加解密 AES加解密 #include <stdio.h> #include <stdint.h> #include <memory.h ...
- C语言实现TEA系列加解密算法
C语言实现TEA系列加解密算法 TEA加解密 XTEA加解密 XXTEA加解密 TEA加解密 #include <stdio.h> #include <stdint.h>//加 ...
- KP-ABE基于属性的加密加解密算法及Access Tree构建
注:本文加解密算法构建完全参考经典ABE paper: Attribute-Based Encryption for Fine-Grained Access Control of Encrypted ...
- js des加密 java_Java实现与JS相同的Des加解密算法完整实例
本文实例讲述了Java实现与JS相同的Des加解密算法.分享给大家供大家参考,具体如下: 这里演示java与js实现相同的des加解密算法,不多说,不废话,直接上代码 一.java实现 package ...
- Python中的AES加解密算法
AES加密的参数及其条件:这个AES加密的主要坑就在于这些条件,首先AES加密有几个参数 秘钥:加密的时候用秘钥,解密的时候需要同样的秘钥才能解出来 明文:需要加密的内容 模式:aes 加密常用的有E ...
- python中凯撒密码_python实现凯撒密码、凯撒加解密算法
凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果 注意:密文是大写字母,在变换加密之前把明文字母都替换为大写字母 def casar(message): # *************begin* ...
最新文章
- shape file与coverage叠加的问题
- 电子产品设计流程_指纹锁生产的八大工序流程
- latex插入gif_如何将照片和GIF插入Google幻灯片
- [html] 如何扩大CheckBox点击区域
- RTL8201网络芯片讲解
- 【NOIP1999】【codevs1083】Cantor表(找规律)
- 计算机三级数据库应用题设计题,计算机考试三级数据库练习题
- [github] github入手教程
- Intel和AMD的区别
- echarts 柱状图渐变色背景
- Rmxprt Maxwell 生成2D和3D全模型方法
- 1007	 Rikka with Travels	Rikka with Travels
- ubuntu删除错误的ATI驱动
- 融云CEO董晗:国产化进程加速,助推政企数智办公平台深化发展
- 2021年全球及中国金融科技行业发展概况及发展趋势分析[图]
- 1068: 池塘的水草
- #STC8A8K# #STC8F1K# #STC8G1K# #STC8H1K# ——STC8系列单片机整体评价
- 心脏病和卒中非传统风险因素在女性中的上升幅度超过男性
- CSS Houdini:用浏览器引擎实现高级CSS效果
- 十六进制与字符串的转换
热门文章
- Redhat 9.0之xtt+xft2,可显示粗斜体美化总结(第二版)
- Readyboost功能
- 蓝桥杯2014java_【图片】2014-2016蓝桥杯java本科B组省赛题_蓝桥杯吧_百度贴吧
- Ryu学习总结(持续更新)
- 笔记本电脑建立Wifi热点多种方法
- 联通计算机用户名和密码,终极:联通路由器的默认登录密码是什么?
- 普通文档怎么换成php,腾讯在线文档如何转化为普通文档
- 1、mysql创建事件
- #多个基因批量cox 多因素回归cox univariate Adjust for age sex单个基因cox 回归分析 多因素 矫正年龄性别之后的cox回归分析 矫正年龄性别之后的cox生存分析
- python编写程序统计一元人民币换成一分、两分和五分的所有兑换方案个数(用while循环)