论文部分内容阅读
上期文章提到一种叫“ROT-13”的文字游戏,按字母表的顺序往右移13位,将字母明文替换为密文,如“seeyoulater”会变成“frrlbhyngre”,不过若总是移动13位,那么密码很容易被破解,为了让密码更安全,可以每一次移位替换掉一个字母后,就变动一下移动的次数,于是“ROT-13”就成了“ROT-n”。例如,密码的发送方和接收方使用“14159265358”当作ROT-n的移动次数,对明文“seeyoulater”加密后“s”变成“t”,“e”变成“i”,而再后一个字母“e”则变成了“f”。其中“14159265358”这串数字被称为密钥。如图1借助MS Excel里的函数,可以让替换工作变得更轻松。
为ROT-n换钥匙
如果密码的发送方和接收方总是用“14159265358”当作ROT-n的移动次数,那么每经过11次移动操作后,就只能按原有的模式再重复做移动操作,有经验的密码破解者就可利用这个漏洞来猜解密码,所以文本的发送者就要定期更换“钥匙”。不过问题是发送和接收双方如何知道“钥匙”究竟是什么数字呢?假设这样的情况:发送方和接收方身处异地,而加密后的密文与钥匙只能交由某第三方传达——这简直就是考验第三方的“诱惑耐受值”。借助一些简单的数学工具可以找到一些简单的解决方法。
⑴发送和接收双方预先找到某一个很大的素数A。有许多网络工具可以找大素数,www.numberempire.com网站就提供了搜寻大素数的功能,如图2先输入某个很大的数字如“11221123321123443211234554321”,然后选中“Findnext”,再点“Compute”
找到最接近的素数为“112211233211234
43211234554373”,发送接收双方在分手前预先保存好这个素数。
⑵每次在传送信息前,接收方都要再找一个大素数B当作钥匙,如“1415926535897932384633”,将大素数A和大素数B相乘,得到大合数C,这里仍然可以借助网络工具,如defuse.ca/big-number-calculator.htm对大数字做乘法。结果得到的合数C是“15888286272961819275349957628854586099036988150109”。然后将C交由第三方传达给发送方。将一个很大的合式作因式分解,需很长的时间,所以即便第三方对这串数字很感兴趣,在相当长一段时间内,也无法知道素数A和B究竟是什么。
⑶发送方收到大合数C,因为事先知道大素数A,所以用简单的除法得到B,然后将大素数B“14159265358979323
84633”作为密钥,按字母表顺序移动替换进行ROT-n加密,然后将密文经由第三方传送给接收方,接收方用B作为钥匙逆向移位解码即可。
⑷下次又有发送信息需要的时候,接收方再重新找一个大素数B当作钥匙,将其与素数A相乘传给发送方即可。
上面的例子可以用来展示加密技术原理,不过现实世界中使用的各种加密技术要复杂得多,数学中关于素数的许多研究都被用于加密技术,有兴趣的朋友可以深入研究一下。
打造永远安全的ROT-n钥匙
世界上有没有绝对无法破解的密码?理论上绝对安全的密码是“一次一密”,假如所使用的密钥与发送信息等长且没有任何规律,那么破解者就无从下手,可是发送接收双方如何才能记住那没有规律的密钥呢?其实方法也不难,以ROT-n为例,双方先约定好某套百科全书,然后加密方按顺序依次读该书上的任何字母,每个字母都代表特定的字母表移动次数,如“a”代表移动1次,“b”代表移动2次,这么一来整部百科全书就成了密钥。当然,前提条件是双方都要有这么一套百科全书。尽管这个密钥长度仍然有限,但在相当长的一段时间里也够用了。“一次一密”缺点也很明显,一是密钥必须随时带着(谍战影片里特工常会随身带着一本书当密钥),二是如果发送方发送了很长的信息而接收方没有收到,双方使用的密钥就无法同步了,所以还需要另外引入同步密钥的机制。
为ROT-n换钥匙
如果密码的发送方和接收方总是用“14159265358”当作ROT-n的移动次数,那么每经过11次移动操作后,就只能按原有的模式再重复做移动操作,有经验的密码破解者就可利用这个漏洞来猜解密码,所以文本的发送者就要定期更换“钥匙”。不过问题是发送和接收双方如何知道“钥匙”究竟是什么数字呢?假设这样的情况:发送方和接收方身处异地,而加密后的密文与钥匙只能交由某第三方传达——这简直就是考验第三方的“诱惑耐受值”。借助一些简单的数学工具可以找到一些简单的解决方法。
⑴发送和接收双方预先找到某一个很大的素数A。有许多网络工具可以找大素数,www.numberempire.com网站就提供了搜寻大素数的功能,如图2先输入某个很大的数字如“11221123321123443211234554321”,然后选中“Findnext”,再点“Compute”
找到最接近的素数为“112211233211234
43211234554373”,发送接收双方在分手前预先保存好这个素数。
⑵每次在传送信息前,接收方都要再找一个大素数B当作钥匙,如“1415926535897932384633”,将大素数A和大素数B相乘,得到大合数C,这里仍然可以借助网络工具,如defuse.ca/big-number-calculator.htm对大数字做乘法。结果得到的合数C是“15888286272961819275349957628854586099036988150109”。然后将C交由第三方传达给发送方。将一个很大的合式作因式分解,需很长的时间,所以即便第三方对这串数字很感兴趣,在相当长一段时间内,也无法知道素数A和B究竟是什么。
⑶发送方收到大合数C,因为事先知道大素数A,所以用简单的除法得到B,然后将大素数B“14159265358979323
84633”作为密钥,按字母表顺序移动替换进行ROT-n加密,然后将密文经由第三方传送给接收方,接收方用B作为钥匙逆向移位解码即可。
⑷下次又有发送信息需要的时候,接收方再重新找一个大素数B当作钥匙,将其与素数A相乘传给发送方即可。
上面的例子可以用来展示加密技术原理,不过现实世界中使用的各种加密技术要复杂得多,数学中关于素数的许多研究都被用于加密技术,有兴趣的朋友可以深入研究一下。
打造永远安全的ROT-n钥匙
世界上有没有绝对无法破解的密码?理论上绝对安全的密码是“一次一密”,假如所使用的密钥与发送信息等长且没有任何规律,那么破解者就无从下手,可是发送接收双方如何才能记住那没有规律的密钥呢?其实方法也不难,以ROT-n为例,双方先约定好某套百科全书,然后加密方按顺序依次读该书上的任何字母,每个字母都代表特定的字母表移动次数,如“a”代表移动1次,“b”代表移动2次,这么一来整部百科全书就成了密钥。当然,前提条件是双方都要有这么一套百科全书。尽管这个密钥长度仍然有限,但在相当长的一段时间里也够用了。“一次一密”缺点也很明显,一是密钥必须随时带着(谍战影片里特工常会随身带着一本书当密钥),二是如果发送方发送了很长的信息而接收方没有收到,双方使用的密钥就无法同步了,所以还需要另外引入同步密钥的机制。