一次性密码本又称Vernam密码或完美密码,是一种将明文与随机密钥相结合的对称式密码算法,它简单、可靠、高效。 从第二次世界大战开始,它就是各大情报机构间谍特工的宠儿,其绝对安全性,放在当今现代密码学中也是所无法比拟的。 事实上,可以说,无论未来的密码技术进步如何,只要遵循一定的规则,一次性密码本,依然可以说是唯一真正牢不可破的加密系统。
一次性密码本的历史可追溯到19世纪80年代,在电报时代,由于通信费用高昂,而且信息很难加密,为了打破这种束缚,美国加州的银行家弗兰克.米勒发明了一套独特的密码本。 他的密码本包含14000个单词、短语和空格,如果在加密过程中,明文和密钥的总和超过14000个,则必须从总和中减去14000个。如果在解密密文的过程中,密文值小于密钥,则必须将14000加到密文上,然后减去密钥。如果移位数是随机选择的并且仅使用一次,则mod算法提供了牢不可破的加密。 遗憾的是,弗兰克.米勒的完美密码并没有被大众熟知,直到2011年才被研究者史蒂文·贝洛文在档案馆重新发现。 比较被大众熟知和公认的一次性密码本发明者是Gilbert S. Vernam,他是美国电话电报公司的工程师,1919年他发明了一种通过打有密钥的纸带进行数据加密和解密的电传技术。 不过,在当时,Gilbert S. Vernam的这套加密系统还只是一个雏形,直到后来美军陆军上尉看到了Gilbert S. Vernam的密码机时,他提出了今天依然在使用的一次性密码本在加密中必须遵循的几条规则。 一次性密码本加密需遵循的规则: 1、密钥至少与必须加密的明文一样长 2、密钥是真正随机的(不是由简单的计算机或其他方式等等生成的) 3、密钥和明文以mod-10 (数字)、mod-26 (字母)或mod-2 (二进制)计算 4、每个密钥仅使用一次,发送方和接收方必须在使用后销毁该密钥 5、密钥应该只有两个副本:发送者一份,接收者一份(如果有多个接收者可以重新考虑该条) 一次性密码本加密方式: 一次性密码本的核心是随机密钥。在创建随机密钥之前,需要用到一种将字母转换为数字的方法,一般采用的是以字母表对应数字顺序的方式,即A-Z=0-25(如下图所示)
下面做一个简单的例子;以mod-26计算为例。 一次性密码本(密钥):weizh 明文:hello 分别将两者以A-Z=0-25的方式转换成数字: 密钥: 22、4、8、25、7 明文: 7、4、11、11、14 将上面数字(密文和密钥)依序相加(注意:如果结果超过100,则在结果中写入最后两位数,例如96+16=112,只需写后两位数12即可): 29、8、19、36、21 将以上信息,以mod-26求同余数运算(即除以26取余数),得到以下信息; 3 8 19 10 21 然后将以上数字,对应上面的A-Z=0-25字母表,将数字逆转为字母,得到最终密文: 一次性密码本:weizh 明文:hello 密文:DITKV 解密的方法(需知道密钥): 先将密文DITKV对应A-Z=0-25字母表转换为数字: 3 8 19 10 21 然后将我们知道的密钥也对应A-Z=0-25字母表转换为数字; 22、4、8、25、7 将上面数字(密文和密钥)依序相减: -19、4、11、15、14 将以上信息,以mod-26求同余数运算,得到以下信息; 7、4、11、11、14 (注意:如果是负数就用26除以该负数取余,例如-19,就不是-19除以26取余数,而是26除以19取余,之所以是19是负数,是因为3-22=-19) 对应A-Z=0-25字母表,即可得到最终明文:hello。 如果是用二进制的方法,则需要用到ASCII码,这是美国标准信息交换代码,是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,如下表所示,该表显示了每个大写和小写字母和空格的二进制编码:
如果我们要加密明文:ONETIME 利用上面的ASCII二进制码表,可以编码为: 消息:ONETIME O:01001111 N:01001110 E:01001010 T:01010100 I:01001001 M:01001101 E:01001010 对于这个例子,我们将使用以下内容作为一次性密码本: 11010111 11100101 10001111 00110000 10100010 00001010 01000000 然后,我们将明文和一次性密码本非进行异或(xor)运算。 异或是一种逻辑运算,它的真值表如下: 1 ^ 1 == 0; 1 ^ 0 == 1; 0 ^ 1 == 1; 0 ^ 0 == 0; 异或实质上是将参与运算的两个数据,按对应的二进制逐位进行逻辑异或运算,只有当对应位的二进制数互斥时对应为的结果才为真。 最终加密为: 明文: 01001111 01001110 01000101 01010100 01001001 01001101 01000101 一次性密码本: 11010111 11100101 10001111 00110000 10100010 00001010 01000000 密文: = 10011000 10101011 11001010 01100100 11101011 01000111 00000101 解密过程与加密过程相同,即我们对密文和一次性密码本进行异或运算,从而得到明文。
|