在 2 世纪, 发送秘密音讯的一个有效办法就是对每个字母停止位移, 使得 'a' 变为 'd' , 'b' 变为 'e' , 依次类推。 这样处置产生的结果看上去就像是一门外语:
L fdph, L vdz, L frqtxhuhg. —— 尤利乌斯·凯撒(Julius Caesar)
正如代码清单 9-6 所示, 运用计算机以数值方式处置字符是十分容易的。
代码清单 9-6 处置单个字符: caesar.go
c := 'a'
c=c+3
fmt.Printf("%c", c) // 打印出“d”
但是, 代码清单 9-6 展现的办法并不完美, 由于它没有思索该如何处置字符 'x' 、 'y' 和 'z' , 所以它无法对 xylophones 、 yaks 和 zebras 这样的单词实施加密。 为了处置这个成绩, 最后的凯撒加密法采取了缭绕措施, 也就是将 'x' 变为 'a' 、 'y' 变为 'b' , 而 'z' 则变为 'c' 。 关于包含 26 个字符的英文字母表, 我们可以经过这段代码完成上述变换:
if c > 'z' {
c = c - 26
}
凯撒密码的解密办法跟加密办法正好相反, 顺序不再是为字符加上 3 而是减去 3 , 并且它还需求在字符过小也就是 c < 'a' 的时分, 将字符加上 26 以实施缭绕。 虽然上述的加密办法和解密办法都十分直观, 但由于它们都需求处置字符边界以完成缭绕, 因此实践的编码进程将变得相当痛苦。
回转13(rotate 13,简称ROT13)是凯撒密码在 20 世纪的一个变体, 该变体跟凯撒密码的独一区别就在于, 它给字符添加的量是 13 而不是 3 , 并且 ROT13 的加密和解密可以经过同一个办法完成, 这是十分方便的。
如今, 假定搜索外星智能(Search for Extra-terrestrial Intelligence, SETI)的相关机构在外太空扫描外星人通讯信息的时分, 发现了包含以下音讯的播送:
message := "uv vagreangvbany fcnpr fgngvba"
我们有预见, 这条音讯很能够是运用 ROT13 加密的英文文本, 但是在解密这条音讯之前, 我们还需求知悉其包含的字符数量, 这条音讯包含 30 个字符, 可以经过内置的 len 函数来确定:
fmt.Println(len(message)) // 打印出“30”
留意 Go 拥有大批无须导入语句即可运用的内置函数, len 函数即是其中之一, 它可以测定各种不同类型的值的长度。 例如, 在下面的代码中, len 前往的就是 string 类型的字节长度。 代码清单 9-7 展现的就是外太空音讯的解密顺序, 你只需求在 Go Playground 运转这段代码, 就会知道外星人在说什么了。
代码清单 9-7 ROT13 音讯解密: rot13.go
message := "uv vagreangvbany fcnpr fgngvba"
for i := 0; i < len(message); i++ { // 迭代字符串中的每一个 ASCII 字符
c := message[i]
if c >= 'a' && c <= 'z' { // 只解密英文字母,至于空格和标点符号则保持不变
c = c + 13
if c > 'z' {
c = c - 26
}
}
fmt.Printf("%c", c)
}
留意, 这段代码中的 ROT13 完成只能处置 ASCII 字符(字节), 它无法处置用西班牙语或许俄语撰写的音讯, 不过接上去的一节将会给出这个成绩的处置方案。
【编辑引荐】
低代码平台会让顺序员失业?测评了5个工具,谁能让效率提高N倍?
编写更繁复的Python代码的5个技巧
公司差点由于代码写得差把我直接给开掉
几行代码即可高效创立数据集,谷歌开源 TFRecorder
提高GIT中代码质量的七点优秀实际
(责任编辑:admin)