在2世纪,发送机密消息的一种有效方法是移动每个字母,使'a'变成'd','b'变成'e',等等。这会产生看起来像外语的结果:Lfdph、Lvdz、Lfrqtxhuhg。—JuliusCaesar如清单9-6所示,使用计算机计算字符非常容易。清单9-6处理单个字符:caesar.goc:='a'c=c+3fmt.Printf("%c",c)//prints"d"然而,清单9-6中所示的方法并不不完美,因为它不关心如何处理字符“x”、“y”和“z”,所以它不能加密像木琴、牦牛和斑马这样的词。为了解决这个问题,最初的凯撒密码采用了包装措施,即把'x'变成'a','y'变成'b','z'变成'c'。对于一个包含26个字符的英文字母表,我们可以通过这段代码实现上面的变换:ifc>'z'{c=c-26}凯撒密码的解密方法正好与加密方法相反,程序为不再加字符而是加3,减3,而且当字符太小时,也需要加26来实现换行,即c<'a'。虽然上面的加密和解密方法非常直观,但实际的编码过程可能会变得非常痛苦,因为它们都需要处理字符边界以进行换行。旋转13位(rotate13,简称ROT13)是20世纪凯撒密码的一种变体。这个变体和凯撒密码的唯一区别是它增加了13个字符而不是3个,并且ROT13的加密和解密可以用同样的方法实现,非常方便。现在,假设搜寻地外文明计划(SETI)的相关机构在扫描外星人在外太空的通讯信息时,他们发现了一个包含以下信息的广播:message:="uvvagreangvbanyfcnprfgngvba"我们有预感,这一条消息很可能是用ROT13加密的英文文本,但在解密这条消息之前,我们需要知道它包含的字符数。这条消息包含30个字符,可以通过内置的len函数判断:fmt.Println(len(message))//打印出“30”。请注意,Go有少量内置函数可以在没有import语句的情况下使用。len函数就是其中之一,它可以确定各种类型值的长度。例如,在上面的代码中,len返回字符串类型的字节长度。代码清单9-7给出了外星信息的解密程序,你只需要在GoPlayground中运行这段代码,你就会知道外星人在说什么。代码清单9-7ROT13消息解密:rot13.gomesage:="uvvagreangvbanyfcnprfgngvba"fori:=0;i
