以下的文章主要向大家描述的是数据安全之保证密码持久到100年坚不可摧的秘诀,即使你的密码从为被破解过,在没有密钥的情况下,我们将永远需要相同的CPU平均时钟周期数来解密某一指定密码加密的东西;
任何密码无论它在鼎盛时期多么强大,最终都会成为脆弱的密码,这似乎是不言而喻的。当人们使用目前相当强大的密码时,他们担心最终也会有人能够将它破解——在不知道密钥的情况下,通过找到一条捷径大大减小暴力破解所需要的时间。
即使密码从没被破解过,在没有密钥的情况下,我们将永远需要相同的CPU平均时钟周期数来解密某一指定密码加密的东西;与几个月前相比,几个月后要想破解同样的东西需要时间会少一些。这是因为计算机至始至终都在变得更快,这允许我们把相同数目的时钟周期压缩在更短的时间内。
更加复杂和巧妙的加密算法设计,使得暴力破解的方法越来越困难,并且将取代已经被破解了的、或者说即将过时的老旧算法。这就像是一场持久的军备竞赛——保护隐私与企图渗透隐私行为之间的对抗。
虽然几乎所有被破解或者过时的密码都被历史所淘汰,但有一种密码却经受住了93年的时间,这就是一次性密码。1917年,Gilbert Vernam发明了维尔南(Vernam)密码,该密码使用了纸带作为密钥的电传(teletype)技术来加密和解密数据,随之诞生了一种在当时相当强大的对称密码。
美国陆军上尉Joseph Mauborgne意识到,使用真正随机的密钥,即密钥没有一部分是重复的(除了有时随机出现相同的情况),维尔南密码能够变得更加强大。受纸带密钥的启发,一种每页纸上的一列随机字母或数据作为记录密钥的便笺(pad of paper)被发展起来。
两份相同的便笺分发给两个人,每页纸上的每个字符只使用一次(当***一个字符被用来加密或解密信息后,该页纸就被毁掉),他们传递信息时不用担心被截获后的信息在没有密钥的情况下被破解。因为这项在便笺纸上分发密钥流数据的技术,人们又这种密码称为一次性便笺加密。
信息理论之父Claude Shannon从数学上证明了一次性加密算法在正确使用时是不可破解的——正确的使用包括毁掉含有已用密钥数据的页面,以便它不再被利用,这样即使有人获得了便笺中已用的页面,也不能解密任何未授权的信息拷贝。密钥管理可以使用相同的数字化概念,但附加条件是人们使用时必须非常小心,以避免计算机固有的弱点给一次性密钥系统带来缺陷。例如,代价高昂的数据恢复也许能够重建已经删除的数据,包括一次性密钥数据。 当简单的删除仍不够可靠时,尽管有办法可以用来对这些数据进行模糊化处理,但也一定要谨慎。
一次性加密算法有时会非常麻烦,这是它为什么没有被广泛使用的原因。由于这种不便性,我们实际需要的是在理论上稍弱一些的密码,也可以说它是一种更聪明的密码,比如AES/Rijndael和Twofish加密算法。
由于一次性密码是对称密码,双方必须使用完全相同的密钥数据来加密通信。对于某些加密用例,使用一次性加密完全没有意义,因为如果双方要能够数据安全的交换密钥以拥有它,他们必然有共享数据的安全方法,这种方法也可以用来共享最终的信息本身。
只有在你不知道将会发送什么信息的情况下,或者当你们在将来的某个时候不能找到任何安全的方法来交换密钥数据时,一次性加密才会派上用场。
一次性加密密钥必须同它所加密或解密的信息一样长。因此,当你想要加密或者解密一个3 G字节的文件时,你还需要一个大小为3G字节的一次性加密密钥。
同样的一次性加密数据不能在多于两人时被安全共享。比如,不同的信息将要在拥有同一密钥的某些接收者之间发送时,有些数据对于其它接收者是不可读的,在它们之间使用相同的一次性加密会破坏密码的安全性。
相比之下,你可以使用非对称密码为多个人提供一个相同的公钥,他们将能够使用相同的公钥来给你的信息加密,而不用担心其它拥有公钥的人能读到它——只要该加密算法不被破解,并且计算机技术目前的发展水平还没有先进到可以合理的暴力破解信息。这是因为对于公钥加密的数据,只有对应的私钥才能解开。
重复使用密钥潜在的破坏了一次性密码的数据安全性,因为它面临着一个已知明文的漏洞。Kerckhoff准则说到,当密钥仍然保密时,一个密码体系就是安全的,但是如果同时知道某个指定信息的加密和未加密版本,一次性密码的密钥就能够被破解。
如果一串密钥数据只被使用一次,这也不是什么问题,因为如果连明文被破解者获取,加密强度再大也是徒劳的。如果一个密钥被重复使用,一段信息的明文就能够作为获得密钥的工具,而该密钥可以用来解密其它信息。我们可以从中获得的教训是:不要重复使用一次性密码。这也正是它被称之为“一次性”密码的原因。
当一次性密钥用尽以后,你不能再安全的重复发送信息——使用相同的密码加密——除非你能够数据安全的交换新的随机密钥数据。当你试图与世界另一头的某个人通信时,这种情况将会让你的处境显得很窘迫。
如果在某些情况下使用一次性加密不太现实,你可以使用其它的加密方法,而你也应该意识到其它在理论上加密强度稍弱的密码仍然有它的用武之地。
一次性加密的工作原理看起来很简单。它只涉及到两个基准值(datum)的比较,比如两个字母或者数字,然后通过比较产生新的基准值。你对加密的信息中每个基准值都要这么做。实现比较的过程既简单又容易,一次产生一个基准值,而且计算的成本相对较低。一个简单的XOR(异或)操作符就能够用来实现这种比较。在它最简单的形式下,XOR操作符可以像这样应用到二进制数字的操作中:
首先,你需要一段信息。让我们使用单词”short”来作为我们的信息。它确实也很短。接下来,你将该信息翻译成二进制形式。用ASCII编码来翻译”short”,你最终会得到如下的0、1字符串:
0111001101101000011011110111001001110100
你还需要一个与信息等长的密钥。这里,我们将这个0和1组成的字符串作为我们的密钥:
0110010101101010001110010010011101100100
***,因为你使用的是XOR操作符,基本上你只需要做简单的减法。两个字符串的***个字符都为0, 可以看到0-0=0. 类似的, 两个字符串的第二个字符都为1,得1-1=0。当一个字符为1, 一个为0时,可以得到一个1或者-1。如果对结果取绝对值,这意味着两个都得到结果1。因此,减法运算和取绝对值提供了如下结果:
0111001101101000011011110111001001110100
0110010101101010001110010010011101100100
0001011000000010010101100101010100010000
首先,你需要一段信息。让我们使用单词”short”来作为我们的信息。它确实也很短。接下来,你将该信息翻译成二进制形式。用ASCII编码来翻译”short”,你最终会得到如下的0、1字符串:
0111001101101000011011110111001001110100
你还需要一个与信息等长的密钥。这里,我们将这个0和1组成的字符串作为我们的密钥:
0110010101101010001110010010011101100100
***,因为你使用的是XOR操作符,基本上你只需要做简单的减法。两个字符串的***个字符都为0, 可以看到0-0=0. 类似的, 两个字符串的第二个字符都为1,得1-1=0。当一个字符为1, 一个为0时,可以得到一个1或者-1。如果对结果取绝对值,这意味着两个都得到结果1。因此,减法运算和取绝对值提供了如下结果:
0111001101101000011011110111001001110100
0110010101101010001110010010011101100100
0001011000000010010101100101010100010000
当然,在结果中以0和1 表示的字符串,某些8位二进制组并不存在所对应ASCII表示, 因此很难用简明的方式来表示数据。ASCII编码非常适合电脑使用,但传统的字母数字方法实现的一次性加密通过手译(hand translation)后更适合于模拟信号。
很明显,一次性加密的核心算法异常简单。只有在设计软件中围绕该算法的余下部分,以及寻找该密码的正确用例时,开发安全可靠的加密软件才会出现真正的问题。另外,如果要实现加密绝对的数据安全,在当前我们对数学的理解范围内,只有一次性加密才能做到这一点,并且只有在正确使用时才无法被破解。
【编辑推荐】