凯撒密码

凯撒密码是把字母表中的每个字母用该字母后面第3个字母进行替代,如表3-2所示。为便于区分,我们用小写字母表示明文,大写字母表示密文。

明文:this is a book。
密文:WKLV LV D ERRN。

明文和密文空间是26个字母的循环,所以z后面的字母是a。如果为每个字母分配一个数值(a=0,b=l,…,z=25),则该算法能够表示如下:

C=EK(p)=(p+3)%26C=E_K(p) = (p+3) \% 26

变种

我们可以把每个字母用该字母后面第k个字母进行替代,即

C=EK(p)=(p+k)%26C=E_K(p) = (p+k) \% 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
// 凯撒密码的加密
// key为加密字符相对原字符的向后偏移量
string encrypt(string message, int key) {
// 加密后的字符串长度应该和原字符串相同
string result = message;
for(int i=0;i<result.size();i++) {
// 跳过空格
if(message[i] == ' ') continue;

// 先把ascii编码的字母平移成以0为起始位置
// 在套凯撒密码的公式
// 最后再平移回去
result[i] = ((message[i] - 'a' + key) % 26) + 'a';
}
return result;
}

// 凯撒密码的解密
string decrypt(string message, int key) {
// 解密的过程实际上就是向前偏移回去
// 即key变负数再执行原加密过程
// 注意负数需要先+26以转换为整数方便执行mod操作
return encrypt(message, -key+26);
}

实践

利用自己编写的变形凯撒加解密程序,尝试破译密文:

1
rjjy rj ts ymj xfggfym bj bnqq inxhzxxymj uqfs

我们可以遍历整个key空间key[0,25)key \in [0,25) ,共26种情况依次解密,得出通顺的密文则为破译成功。

1
2
3
4
5
6
7
int main() {
string c = "rjjy rj ts ymj xfggfym bj bnqq inxhzxxymj uqfs";
for(int i=0;i<26;i++) {
cout<<i<<". "<<decrypt(c, i)<<endl;
}
return 0;
}

运行结果如下,

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
0. rjjy  rj  ts  ymj  xfggfym bj bnqq inxhzxxymj uqfs
1. qiix qi sr xli weffexl ai ampp hmwgywwxli tper
2. phhw ph rq wkh vdeedwk zh zloo glvfxvvwkh sodq
3. oggv og qp vjg ucddcvj yg yknn fkuewuuvjg rncp
4. nffu nf po uif tbccbui xf xjmm ejtdvttuif qmbo
5. meet me on the sabbath we will discussthe plan
6. ldds ld nm sgd rzaazsg vd vhkk chrbtrrsgd okzm
7. kccr kc ml rfc qyzzyrf uc ugjj bgqasqqrfc njyl
8. jbbq jb lk qeb pxyyxqe tb tfii afpzrppqeb mixk
9. iaap ia kj pda owxxwpd sa sehh zeoyqoopda lhwj
10. hzzo hz ji ocz nvwwvoc rz rdgg ydnxpnnocz kgvi
11. gyyn gy ih nby muvvunb qy qcff xcmwommnby jfuh
12. fxxm fx hg max ltuutma px pbee wblvnllmax ietg
13. ewwl ew gf lzw ksttslz ow oadd vakumkklzw hdsf
14. dvvk dv fe kyv jrssrky nv nzcc uzjtljjkyv gcre
15. cuuj cu ed jxu iqrrqjx mu mybb tyiskiijxu fbqd
16. btti bt dc iwt hpqqpiw lt lxaa sxhrjhhiwt eapc
17. assh as cb hvs goppohv ks kwzz rwgqigghvs dzob
18. zrrg zr ba gur fnoongu jr jvyy qvfphffgur cyna
19. yqqf yq az ftq emnnmft iq iuxx pueogeeftq bxmz
20. xppe xp zy esp dlmmles hp htww otdnfddesp awly
21. wood wo yx dro ckllkdr go gsvv nscmeccdro zvkx
22. vnnc vn xw cqn bjkkjcq fn fruu mrbldbbcqn yujw
23. ummb um wv bpm aijjibp em eqtt lqakcaabpm xtiv
24. tlla tl vu aol zhiihao dl dpss kpzjbzzaol wshu
25. skkz sk ut znk yghhgzn ck corr joyiayyznk vrgt

观察可得当key=5时对应的明文符合正常语句。

即得出明文:

1
meet  me  on  the  sabbath we will discussthe plan

破译成功