折叠何宝莹

一切乱码都是告白? ---如何破解凯撒密码

什么是凯撒密码?

维基百科的定义很清楚:

在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

或者看一下这个图示:
凯撒加密

为什么要了解凯撒加密?

作为战争时期的沟通, 这种加密方式算是比较原始的. 在非战争时期, 我们可以学这个来干嘛呢? 秀恩爱, 秀单身. 任君选择.

最简单的凯撒解密方法

正如上面图示, 最简单的就是所有字母表向右移动一位, 所有的字母A被替代成B, 相应地, B被替代成C, 以此类推. 使用JavaScript编写的话很简单. 函数见下文:
输入两个变量就可以得到解密答案. 其中s是需要被解密的字符串, shift是偏移量, 往右偏移一位就是1, 往左偏移一位就是-1.

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
27
28
29
30
31
// 先要定义一个 find 函数, 寻找 s2 在 s1 中的下标
var find = function(s1, s2) {
// 初始下标是 -1, 如果找不到下标, 返回 -1
var index = -1
for (var i = 0; i < s1.length; i++) {
var c = s1[i]
if (c == s2) {
index = i
break
}
}
return index
}
var decode3 = function(s, shift) {
var lower = 'abcdefghijklmnopqrstuvwxyz'
// 定义一个空的字符串
var result = ''
// 遍历需要加密后的字符串
for (var i = 0; i < s.length; i++) {
var c = s[i]
var index = find(lower, c)
if (index == -1) {
result += c
} else {
var len = lower.length
var newIndex = (len + index - shift) % len
result += lower[newIndex]
}
}
return result
}

说好的秀恩爱, 秀单身呢?

复杂一点的凯撒加密
知乎有一个求助题, 破译密码的
链接在此
https://www.zhihu.com/question/28324597
一看就是凯撒加密, 不过在这里我们不清楚偏移值是多少, 所以我们只能1~25全都试一遍, 幸好英文字母只有26个对不对. 出来25个答案, 然后肉眼看看这些解密答案有没有意义.
这些全都可以自动完成. 答案如下:

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
27
28
29
30
31
32
33
34
// 因为加密的字符串是大写字母, 我们需要把大写字母转成小写字母
var lowerCode = function(code) {
var lower = 'abcdefghijklmnopqrstuvwxyz'
var upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

var result = ''
for (var i = 0; i < code.length; i++) {
var c = code[i]
var index = find(upper, c)
if (index == -1) {
result += c
} else {
result += lower[index]
}
}
return result
}
// 开始解密了
var decode4 = function(s) {
var code = lowerCode(s)
var lower = 'abcdefghijklmnopqrstuvwxyz'
// 遍历 25 次, 因为有 25 个可能的偏移值, 同样得出 25 个答案
for (var i = 0; i < lower.length; i++) {
var source = decode3(code, i)
log(source)
}
}

var __main = function() {
// 需要解密的字符串
var code = 'VRPHWLPHV L ZDQW WR FKDW ZLWK BRX,EXW L KDYH QR UHDVRQ WR FKDW ZLWK BRX'
decode4(code)
}
__main()

肉眼找答案

解密25个答案

看到了吧, 比较像是正常语言的那句. 不就是

sometimes i want to chat with you,but i have no reason to chat with you

何宝莹 wechat
扫一扫关注我的公众号