使用 Go 语言实现凯撒加密
2011 年 4 月 4 日
回转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 = 'a' && c 'z' { c = c - 26 } } fmt.Printf("%c", c) }
注意, 这段代码中的 ROT13 实现只能处理 ASCII 字符(字节), 它无法处理用西班牙语或者俄语撰写的消息, 不过接下来的一节将会给出这个问题的解决方案。