【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++,文章也是新手向,可能有许多不足之处,如有问题,欢迎提出。

特别感谢发学习文件的学长和文章引用内容的作者。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C++是一种通用的高级编程语言,它支持面向对象编程和泛型编程。C++由Bjarne Stroustrup于1983年开发,是C语言的扩展版本。C++具有强大的功能和广泛的应用领域,包括系统开发、游戏开发、嵌入式系统、图形界面等。 密码是一种简单的替换密码,它通过将字母按照一定的偏移量进行替换来加密消息。例如,偏移量为3时,字母A会被替换为D,字母B会被替换为E,以此类推。解密过程则是将每个字母按照相反的偏移量进行替换。 在C++中实现密码可以使用字符数组和循环来完成。首先,将明文消息存储在字符数组中,然后通过循环遍历数组中的每个字符,并根据偏移量进行替换。最后,将加密后的消息输出。 以下是一个简单的C++代码示例,实现了密码的加密和解密功能: ```cpp #include <iostream> using namespace std; void encrypt(string& message, int offset) { for (int i = 0; i < message.length(); i++) { if (isalpha(message[i])) { if (isupper(message[i])) { message[i] = ((message[i] - 'A' + offset) % 26) + 'A'; } else { message[i] = ((message[i] - 'a' + offset) % 26) + 'a'; } } } } void decrypt(string& message, int offset) { encrypt(message, 26 - offset); } int main() { string message = "Hello, World!"; int offset = 3; cout << "Original message: " << message << endl; encrypt(message, offset); cout << "Encrypted message: " << message << endl; decrypt(message, offset); cout << "Decrypted message: " << message << endl; return 0; } ``` 这段代码中,encrypt函数用于加密消息,decrypt函数用于解密消息。在main函数中,我们定义了一个明文消息和偏移量,然后调用encrypt函数进行加密,再调用decrypt函数进行解密。最后,输出加密和解密后的消息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花辞树dor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值