【C++】“凯撒密码”详解
“在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。”
“凯撒密码即简单的换位密码,用字符串初始化一个密文空间,存储明文与密文要用到的字符集,以字符在串中的索引作为该字符的数值。通过移位对原串加密,再逆向移位进行解密。”
名词解释:
首先对代码中出现的名词进行解释,如有疑问还请继续浏览。
string cipherSpace-----密文空间:明文转密文的依据。
int q-----密文空间长度:密文空间的总长度,也是字符数。
int key-----加密移位长度:向前或向后的偏移长度。
string encode (string plainText)-----加密函数
string decode (string cipherText)-----解密函数
原理图解:
假设密文空间为26字母表,即a~z,下标0~25,偏移长度为1。
加密,若明文为“deskonerice”:
d---明文下标[0]---在密文空间中下标[3]---偏移后下标[4]---在密文空间对应的字符f---f
以此类推......
解密,若密文为“eftlpofsjdf:
以此类推......
f---密文下标[10]---在密文空间中下标[6]---偏移后下标[5]---在密文空间对应的字符e---e
加密代码:
string encode (string plainText) {int len = plainText.length(); //len记录明文长度string cipherString = ""; //创建空密文,并用空字符初始化for (int i = 0; i < len; ++i) { //逐一访问明文的每个字符,并转换成对应的密文字符int plainIndex = cipherSpace.find(plainText[i]); // 查找明文字符在密文空间内对应的下标,并记录该下标int cipherIndex = (plainIndex + key) % q; // 记录偏移后的下标,其对应字符即转换后的密文字符cipherString.insert(i,1,cipherSpace[cipherIndex]); //将该密文字符写入密文}return cipherString; //返回密文 }
- int len = plainText.length();-----计算字符串plainText的长度并将长度储存于len中
- int plainIndex = cipherSpace.find(plainText[i]);-----在字符串cipherSpace中寻找字符plainText[i]的位置并将其下标储存于plainIndex中
- cipherString.insert(i,1,cipherSpace[cipherIndex]); -----在字符cipherString[i]的前面插入1个字符cipherSpace[cipherIndex]
以上三条为部分函数作用解释,除此之外,特别解释下偏移阶段的取余操作,由于密文空间长度有限,可以看成一个转盘。如果偏移到密文空间最后一个字符仍需偏移,那么将从第一个字符继续偏移。偏移长度等于密文空间长度的部分可以省略,这个过程可以看成循环。
解密代码:
string decode (string cipherText) {int len = cipherText.length(); //len记录密文长度string plainString = ""; //创建空明文,并用空字符初始化for (int i = 0; i < len; ++i) { //逐一访问密文的每个字符,并转换成对应的明文字符int cipherIndex = cipherSpace.find(cipherText[i]); 查找密文字符在密文空间内对应的下标,并记录该下标int plainIndex = (cipherIndex + q - key) % q; 记录偏移后的下标,其对应字符即转换后的明文字符plainString.insert(i,1,cipherSpace[plainIndex]); //将该明文字符写入明文}return plainString; //返回明文 }
同样的,解释下偏移阶段的取余操作,如果偏移到密文空间的第一个字符后仍需偏移,那么将从最后一个字符继续向前偏移。密文空间的下标是 0 ~ q-1 ,而key可正可负,这里默认key为正整数。
函数调用:
调用函数前,需要创建密文空间 cipherSpace 以及设置加密移位长度 q ,明文中可能出现的字符均需要被包含在密文空间中。当然,你也可以根据需要,不对没有在密文空间内找到的明文字符进行加密。
注意事项:
“ ”内容以及两段代码(除注释外)均来源于学长发的学习文件,如果知道内容原地址,欢迎补充。
鄙人刚步入C++,文章也是新手向,可能有许多不足之处,如有问题,欢迎提出。
特别感谢发学习文件的学长和文章引用内容的作者。
【C++】“凯撒密码”详解相关推荐
- python凯撒密码详解_Python基础题目集--课堂案例
这些案例均为在校期间学习<python基础编程>课程的案例,适合初学者练手~ 1.输入分数,返回等级 ''' 分数区间为0~100,等级:A(>=90).B(>=80).C(& ...
- python凯撒密码详解_四十八、Python用smtp发邮件详解(163和QQ邮箱)
Python发邮件详解 一.利用163的smtp发送邮件 import smtplibfrom email.mime.text import MIMETextfrom email.header imp ...
- 凯撒密码中有数字怎么办_破解犯罪大师8.25突发事件中医生的密码(未解慎入)...
警告⚠️:此文章发布时间时,案件尚未结束,此文只针对密码,不讨论案件凶手,若你还未破解密码,请不要往下观看(仅个人观点) ***-/--*/-***/**-/****/****/-**-/****/- ...
- php 凯撒加密解密,PHP脚本实现凯撒加(解)密
今天在看某ctf时候遇到一题凯撒加密的题,然后看到write up里有这样一句 顿时感觉这题目有点坑啊,这要不写个脚本来跑要推到啥时候啊,于是又了本文: $text=" the text & ...
- 随手写系列——写一个凯撒密码转换页面
文章目录 先展示效果 H5编写 C3编写 JS编写--方法一:过程版 JS编写--方法二:对象版 代码获取 先展示效果 (因为主要是实现功能,所以CSS写的很粗糙) H5编写 基础结构如下: 先构成最 ...
- C语言凯撒密码字母向后偏移三位,凯撒加密解密(java字母移位)
1.设计思想:加密就是将字符数据转化为ASC码表中的数字,a-w之间通过加3之后再转化为字符型输出,x-z之间通过转化为ASC码表中的数字后减去23再转化为字符型输出.解密就是将字符数据转化为ASC码 ...
- 维吉尼亚密码详解及C语言实现
维吉尼亚密码详解及C语言实现 文章目录 维吉尼亚密码详解及C语言实现 0x01 维吉尼亚密码 0x02 维吉尼亚密码原理 0x03 维吉尼亚密码CTF题目 0x04 C语言实现 图片地址:https: ...
- python凯撒密码加密写入文件_Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作...
#-*- coding: gb2312 -*-#用户名密码登录系统(MD5加密并存入文件)及对字符串进行凯撒密码加解密操作#作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/k ...
- 凯撒密码和栅栏密码 - 密码学01
凯撒密码和栅栏密码 让编程改变世界 Change the world by program 我们将会学到什么?! 这相信是大家广泛关注的话题,因为如果一开始给大家一个强大而震撼的目录,然后就是一屁股的 ...
最新文章
- Soul网关发布里程碑的2.3.0版本,新增支持GRPC,Tars,Sofa协议
- markdown引入代码_人人都会的Markdown
- ync 小技巧-14-为用户启用统一的联系人存储库-Lync-无联系人
- IPsec-×××基本技术挖掘
- MySQL优化之查询缓存(mysql8官方已经废弃这个功能)
- 图论--差分约束系统
- Codeforces Round #673 (Div. 2)——待补 E
- 解决:用PivotGridControl 与 chartControl 配合使用,Series最大只显示10条
- UVA1363 LA3521 POJ2800 ZOJ2646 Joseph‘s Problem【约瑟夫环+数学】
- python中分支语句elif与else的区别_浅谈对python中if、elif、else的误解
- C# List用法;已经实例测试OK,直接可用!List 增加减少元素,输出元素
- SCCM 部署操作系统 ,提示权限问题,报错:0xc00000098
- 微信开发者工具历史版本下载
- 程序员如何写工作日志?
- maven使用国内源和使用代理
- kd树(K-dimensional tree)
- 淘宝上的零食能买吃吗?网上进口食品的秘密。
- mac 更新系统后无法使用 git
- 永磁同步电机转子位置估算专题 —— 基波模型类位置估算概要
- Oracle关于分组小计再合计
热门文章
- java吃货联盟app讲解_Java吃货联盟订餐系统代码实例
- 归并排序(常数空间复杂度的一个变体)
- ku115上实现adc12dj3200 配置,jesd204b接口,单通道采集模式
- 用CSS3制作太阳系行星运动简图
- 苹果cmsv10仿芒果TV小说免费简约模板源码
- 后台数据管理——firebase和野狗
- 啃完这些资料,我拿到了腾讯,爱奇艺,Kotlin从入门到进阶实战
- 数据挖掘中的指标--分类器中的ROC曲线及相关指标(ROC、AUC、ACC)
- 【华为OD机试真题 java、python、c++】机房布局【2022 Q4 200分】
- 【数字图像处理】实验五 形态学图像处理