“在密码学中,恺撒密码(英语: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++,文章也是新手向,可能有许多不足之处,如有问题,欢迎提出。
特别感谢发学习文件的学长和文章引用内容的作者。