论文部分内容阅读
Vs lbh pna ernq guvf,lbh ner vaivgrq.
上面的文字看上去好像是乱码,不过要读懂它也不难,按字母表顺序,把每个字母向前移13位(a到m变成n到z,n到z变成a到m),于是就变成了If you can read this,you are invited.这是一种加密方法吗?可以算是,也可以说不是。
古罗马时期,恺撒经常通过顺序移动若干位字母(常常是3位)来加密其重要信件,由于恺撒的名气,现在人们仍然将这种方法称为恺撒移位加密法。尽管有证据表明,恺撒并非是利用字母移位来进行加密的第一人。实际上从现代密码学的观点看,破解移位码简直是轻而易举的事情,所以,现在几乎没有人会动真格地把移位码用在信息安全领域。
不过有趣的是,按字母表移动13次的加密法却十分有名,甚至还有一个专有名词,称为Rotate by 13 places,简写为ROT13。为什么偏偏要移动13位呢?原因之一是13这个数字在西方文化中的敏感性,而另一个更重要的原因可以总结为一个看似很玄妙的公式。这就成了本文的第一个问题:公式ROT13(ROT13(x))=ROT26(x)=x究竟代表了什么意思呢?
虽然ROT13很少被用于重要场合,但根据一条著名的安全原则:如果信息被保护的时间要短于该保护被破解的时间,那么这种保护就是有效的。例如,在教室中,若要隔着几个同学传小纸条给某心领神会者,则纸条上很可能就写着类似“zrrg zr gbavtug”这样的信息(当然并不推荐在上课时这么做)。20世纪80年代起,ROT13作为幽默或谜语流传开来,不过它果真越来越多地出现在信息技术的课堂中,成为讲解编码解码、算法结构等教学内容的重要案例。
若通过分支结构语句编程对一串文字按ROT13方式加密,算不上是什么特别困难的任务,但这里有意要提高一下难度。本文的第二个问题:若不用分支结构,如何仅编写一行程序表达式,就能将某字母按ROT13加密法,生成对应的加密后的字母呢(只考虑小写的情况)?
只用一行代码实现某个复杂功能,在英文中被称为One-liner编程,One-liner在UNIX或其他类似UNIX系统中尤其普遍,下面这个例子,仅用一行RUBY程序代码,就实现了输入文本、ROT13加密或解密、输出加密或解密后文本的功能:
gets.each_byte {|x| puts "" << (x-97 13-26*((x-97)/13.to_i) 97)}
有兴趣的话可以尝试分析这行代码的意思,不过即使读不懂也无伤大雅。熟练的程序员常常利用One-liner高效实现复杂任务,甚至有的还将One-liner编程作为一种挑战极限的智力游戏。从处理文本角度而言,RUBY还不算是编写One-liner的利器,用AWK或Perl所写代码的功能之强大往往让人头晕目眩。尤其是Perl,技巧娴熟的Perl程序员仿佛是魔法师,编写代码就像用魔符施咒。不过有些代码的魔法意味实在太过于强烈了,以至于被同行们称为Write-only code。就此,我们提出本文的第三个问题:Write-only code指的是什么意思呢?
最后,我们仍然回到和ROT13有关的问题上,这也是本文的最后一个问题:除了编程,还能通过哪些办法方便地实现ROT13的加密和解密呢?
上面的文字看上去好像是乱码,不过要读懂它也不难,按字母表顺序,把每个字母向前移13位(a到m变成n到z,n到z变成a到m),于是就变成了If you can read this,you are invited.这是一种加密方法吗?可以算是,也可以说不是。
古罗马时期,恺撒经常通过顺序移动若干位字母(常常是3位)来加密其重要信件,由于恺撒的名气,现在人们仍然将这种方法称为恺撒移位加密法。尽管有证据表明,恺撒并非是利用字母移位来进行加密的第一人。实际上从现代密码学的观点看,破解移位码简直是轻而易举的事情,所以,现在几乎没有人会动真格地把移位码用在信息安全领域。
不过有趣的是,按字母表移动13次的加密法却十分有名,甚至还有一个专有名词,称为Rotate by 13 places,简写为ROT13。为什么偏偏要移动13位呢?原因之一是13这个数字在西方文化中的敏感性,而另一个更重要的原因可以总结为一个看似很玄妙的公式。这就成了本文的第一个问题:公式ROT13(ROT13(x))=ROT26(x)=x究竟代表了什么意思呢?
虽然ROT13很少被用于重要场合,但根据一条著名的安全原则:如果信息被保护的时间要短于该保护被破解的时间,那么这种保护就是有效的。例如,在教室中,若要隔着几个同学传小纸条给某心领神会者,则纸条上很可能就写着类似“zrrg zr gbavtug”这样的信息(当然并不推荐在上课时这么做)。20世纪80年代起,ROT13作为幽默或谜语流传开来,不过它果真越来越多地出现在信息技术的课堂中,成为讲解编码解码、算法结构等教学内容的重要案例。
若通过分支结构语句编程对一串文字按ROT13方式加密,算不上是什么特别困难的任务,但这里有意要提高一下难度。本文的第二个问题:若不用分支结构,如何仅编写一行程序表达式,就能将某字母按ROT13加密法,生成对应的加密后的字母呢(只考虑小写的情况)?
只用一行代码实现某个复杂功能,在英文中被称为One-liner编程,One-liner在UNIX或其他类似UNIX系统中尤其普遍,下面这个例子,仅用一行RUBY程序代码,就实现了输入文本、ROT13加密或解密、输出加密或解密后文本的功能:
gets.each_byte {|x| puts "" << (x-97 13-26*((x-97)/13.to_i) 97)}
有兴趣的话可以尝试分析这行代码的意思,不过即使读不懂也无伤大雅。熟练的程序员常常利用One-liner高效实现复杂任务,甚至有的还将One-liner编程作为一种挑战极限的智力游戏。从处理文本角度而言,RUBY还不算是编写One-liner的利器,用AWK或Perl所写代码的功能之强大往往让人头晕目眩。尤其是Perl,技巧娴熟的Perl程序员仿佛是魔法师,编写代码就像用魔符施咒。不过有些代码的魔法意味实在太过于强烈了,以至于被同行们称为Write-only code。就此,我们提出本文的第三个问题:Write-only code指的是什么意思呢?
最后,我们仍然回到和ROT13有关的问题上,这也是本文的最后一个问题:除了编程,还能通过哪些办法方便地实现ROT13的加密和解密呢?