在密码学中,恺撒密码(英语: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++】“凯撒密码”详解相关推荐

  1. python凯撒密码详解_Python基础题目集--课堂案例

    这些案例均为在校期间学习<python基础编程>课程的案例,适合初学者练手~ 1.输入分数,返回等级 ''' 分数区间为0~100,等级:A(>=90).B(>=80).C(& ...

  2. python凯撒密码详解_四十八、Python用smtp发邮件详解(163和QQ邮箱)

    Python发邮件详解 一.利用163的smtp发送邮件 import smtplibfrom email.mime.text import MIMETextfrom email.header imp ...

  3. 凯撒密码中有数字怎么办_破解犯罪大师8.25突发事件中医生的密码(未解慎入)...

    警告⚠️:此文章发布时间时,案件尚未结束,此文只针对密码,不讨论案件凶手,若你还未破解密码,请不要往下观看(仅个人观点) ***-/--*/-***/**-/****/****/-**-/****/- ...

  4. php 凯撒加密解密,PHP脚本实现凯撒加(解)密

    今天在看某ctf时候遇到一题凯撒加密的题,然后看到write up里有这样一句 顿时感觉这题目有点坑啊,这要不写个脚本来跑要推到啥时候啊,于是又了本文: $text=" the text & ...

  5. 随手写系列——写一个凯撒密码转换页面

    文章目录 先展示效果 H5编写 C3编写 JS编写--方法一:过程版 JS编写--方法二:对象版 代码获取 先展示效果 (因为主要是实现功能,所以CSS写的很粗糙) H5编写 基础结构如下: 先构成最 ...

  6. C语言凯撒密码字母向后偏移三位,凯撒加密解密(java字母移位)

    1.设计思想:加密就是将字符数据转化为ASC码表中的数字,a-w之间通过加3之后再转化为字符型输出,x-z之间通过转化为ASC码表中的数字后减去23再转化为字符型输出.解密就是将字符数据转化为ASC码 ...

  7. 维吉尼亚密码详解及C语言实现

    维吉尼亚密码详解及C语言实现 文章目录 维吉尼亚密码详解及C语言实现 0x01 维吉尼亚密码 0x02 维吉尼亚密码原理 0x03 维吉尼亚密码CTF题目 0x04 C语言实现 图片地址:https: ...

  8. python凯撒密码加密写入文件_Python用户名密码登录系统(MD5加密并存入文件,三次输入错误将被锁定)及对字符串进行凯撒密码加解密操作...

    #-*- coding: gb2312 -*-#用户名密码登录系统(MD5加密并存入文件)及对字符串进行凯撒密码加解密操作#作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/k ...

  9. 凯撒密码和栅栏密码 - 密码学01

    凯撒密码和栅栏密码 让编程改变世界 Change the world by program 我们将会学到什么?! 这相信是大家广泛关注的话题,因为如果一开始给大家一个强大而震撼的目录,然后就是一屁股的 ...

最新文章

  1. Soul网关发布里程碑的2.3.0版本,新增支持GRPC,Tars,Sofa协议
  2. markdown引入代码_人人都会的Markdown
  3. ync 小技巧-14-为用户启用统一的联系人存储库-Lync-无联系人
  4. IPsec-×××基本技术挖掘
  5. MySQL优化之查询缓存(mysql8官方已经废弃这个功能)
  6. 图论--差分约束系统
  7. Codeforces Round #673 (Div. 2)——待补 E
  8. 解决:用PivotGridControl 与 chartControl 配合使用,Series最大只显示10条
  9. UVA1363 LA3521 POJ2800 ZOJ2646 Joseph‘s Problem【约瑟夫环+数学】
  10. python中分支语句elif与else的区别_浅谈对python中if、elif、else的误解
  11. C# List用法;已经实例测试OK,直接可用!List 增加减少元素,输出元素
  12. SCCM 部署操作系统 ,提示权限问题,报错:0xc00000098
  13. 微信开发者工具历史版本下载
  14. 程序员如何写工作日志?
  15. maven使用国内源和使用代理
  16. kd树(K-dimensional tree)
  17. 淘宝上的零食能买吃吗?网上进口食品的秘密。
  18. mac 更新系统后无法使用 git
  19. 永磁同步电机转子位置估算专题 —— 基波模型类位置估算概要
  20. Oracle关于分组小计再合计

热门文章

  1. java吃货联盟app讲解_Java吃货联盟订餐系统代码实例
  2. 归并排序(常数空间复杂度的一个变体)
  3. ku115上实现adc12dj3200 配置,jesd204b接口,单通道采集模式
  4. 用CSS3制作太阳系行星运动简图
  5. 苹果cmsv10仿芒果TV小说免费简约模板源码
  6. 后台数据管理——firebase和野狗
  7. 啃完这些资料,我拿到了腾讯,爱奇艺,Kotlin从入门到进阶实战
  8. 数据挖掘中的指标--分类器中的ROC曲线及相关指标(ROC、AUC、ACC)
  9. 【华为OD机试真题 java、python、c++】机房布局【2022 Q4 200分】
  10. 【数字图像处理】实验五 形态学图像处理