无论计算机有多强大、攻击者多么聪明都无法破解的密码:一次一密

在本章中读者将要学习的密码,不论计算机有多么强大、花费了多少时间或者攻击者是多么聪明,都无法破解。它被称为一次一密(One-time pad)。好消息是不必编写新的程序来使用它!读者在第18章中编写的维吉尼亚密码程序可以在不做任何修改的情况下实现此密码。但由于一次一密非常不便于使用,因此它常常只用于最机密的消息。

本章要点

  • 不可破解的一次一密。
  • 两次一密即为维吉尼亚密码。

21.1 不可破解的一次一密

一次一密是维吉尼亚密码的一种,当密钥满足以下标准时,密码将变得不可破解。

  • 它和加密的消息一样长。
  • 它是由真正随机的符号组成的。
  • 它一旦使用过一次,就不会再用于其他任何消息。

遵循这3个规则,可以使加密的消息不被任何密码分析员攻破。即使有无限的计算能力,密码也始终安全。

一次一密的密钥称为“便签”(pad),这是因为密钥通常印在便签本上,在最上面的一张纸被使用以后,会被撕下来,显示下一个要使用的密钥。通常,每次会生成一大串用于一次一密的密钥,并送出便签本,这些密钥标记着对应的特定日期。例如,如果在10月31日收到一个来自合作者的秘密消息,则只需要查看一下一次一密的密钥列表,就可以找到当天使用的密钥。

21.1.1 密钥长度等于消息长度

为了理解一次一密不可破解的原因,先考虑普通的维吉尼亚密码为什么容易受到攻击。回想一下,维吉尼亚密码破解程序是依靠分析频率来实现的,但是如果密钥与消息长度相同,则每个明文字母的子密钥都不同,这就意味着每个明文字母可以以相同的概率被加密到任意密文字母。

例如,为了对消息“IF YOU WANT TO SURVIVE OUT HERE, YOU’VE GOT TO KNOW WHERE YOUR TOWEL IS”进行加密,先删除空格和标点符号,获得具有55个字母的纯消息。使用一次一密的方式来加密此消息,需要一个长度也为55个字母的密钥。示例密钥使用“
KCQYZHEPXAUTIQEKXEJMORETZHZTRWWQDYLBTTVEJMEDBSANYBPXQIK”对字符串进行加密,获得密文“
SHOMTDECQTILCHZSSIXGHYIKDFNNMACEWRZLGHR AQQVHZGUERPLBBQC”,如图21-1所示。

《无论计算机有多强大、攻击者多么聪明都无法破解的密码:一次一密》

 

图21-1 使用一次一密加密示例消息

现在假设密码分析家掌握了密文(SHOM TDEC…),他们怎么进行攻击呢?暴力尝试密钥是行不通的,因为对于计算机而言它们的数量也太多了。密钥的数量等于26的消息个数的幂次方,因此,在示例中消息有 55个字母,则总共有2655个可能密钥,即666 091 878 431 395 624 153 823 182 526 730 590 376 250 379 528 249 805 353 030 484 209 594 19。

即使密码分析者拥有一台足够强大的计算机来尝试所有的密钥,它仍然不能破解一次一密,因为对于任何密文,对应的所有可能明文都是等概率的。

例如,密文SHOMTDEC…可以由完全不同、只不过长度相同的明文加密得来,例如使用密钥“
ZAKAVKXOLFQDLZHWSQJBZMTWMMNAKWURWEXDCUYWKSGORGH NNEDVTCP”加密的“THE MYTH OF OSIRIS WAS OF IMPORTANCE IN ANCIENT EGYPTIAN RELIGION”,如图21-2所示。

《无论计算机有多强大、攻击者多么聪明都无法破解的密码:一次一密》

 

图21-2 使用不同的密钥加密不同的示例消息,但是生成与之前相同的密文

可以破解加密消息的根本原因是通常只有一个密钥可以将密文解密成合理的英语消息。但是在前面的示例中可以看到,使用两个非常不同的明文消息可以生成相同的密文。使用一次一密的情况下,密码分析员无法分辨出哪个是正确的原始消息。事实上,任何正好有55个字母、是可读英语的明文消息都可能是原始消息,仅仅因为某个密钥能够将密文解密为可读英语不再意味着它就是正确的加密密钥。

因为可能用于得到密文的任何明文是原始消息的概率都相同,所以不可能破解用一次一密加密的消息。

21.1.2 使密钥真正随机

正如在第9章中了解到的,内置在Python中的random模块并不会生成真正的随机数。它们使用一种算法来计算只是看上去随机的数字,在大多数情况下这已经足够好了。然而,对于一次一密的工作而言,密钥必须由一个真正的随机源产生,否则它就会失去数学意义上完美的保密性。

Python 3.6及其后的版本有secrets模块,它使用操作系统提供的真正的随机数源(通常从随机事件中收集,例如用户两次敲击键盘之间的间隔)。secrets.randbelow()函数可以返回从0到传递给它的参数之间的真正随机数,但不包括参数本身,如下所示。

>>> import secrets
>>> secrets.randbelow(10)
2
>>> secrets.randbelow(10)
0
>>> secrets.randbelow(10)
6

因为secrets中的函数比random中的函数运行速度慢,所以在不需要真正随机时,首选random中的函数。还可以使用secrets.choice()函数,该函数从传递给它的字符串或列表中返回随机选择的值,如下所示。

>>> import secrets
>>> secrets.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
'R'
>>> secrets.choice(['cat', 'dog', 'mouse'])
'dog'

要创建长度为55个字符、真正随机的一次一密密钥,可以使用以下示例代码。

>>> import secrets
>>> otp = ''
>>> for i in range(55):
otp += secrets.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> otp
'MVOVAAYDPELIRNRUZNNQHDNSOUWWNWPJUPIUAIMKFKNHQANIIYCHHDC'

使用一次一密时还有一个需要铭记在心的细节。下面研究一下为什么需要避免多次使用相同的密钥。

21.1.3 避免两次一密

两次一密指使用相同的“一次一密”密钥来加密两条不同的消息。这会让加密有弱点。

正如在之前提到的,仅仅因为一个密钥将一次一密密文解密为可读的英文并不意味着它是正确的密钥。但是,如果对两个不同的消息使用相同的密钥,则相当于正在向黑客提供关键信息。使用相同的密钥加密两个消息时,如果黑客破解出了一个密钥,该密钥将第一个密文解密为可读的英文,但是将第二个消息解密为随机的垃圾文本,那么黑客将知道他们找到的密钥一定不是原始密钥。事实上,很可能只有一个密钥将两个消息都解密为英语,在21.2节中将会看到。

如果黑客只拿到了两条消息之一,那么消息的加密依然安全。但是必须始终假设所有的加密消息都会被黑客或政府拦截,否则就根本不用费心去加密消息了。香农的格言很重要,应该牢记:“敌人了解这个系统!”这其中就包括所有的密文。

21.2 为什么两次一密是维吉尼亚密码

维吉尼亚密码如何破解读者已经学会了。如果现在能证明两次一密和维吉尼亚密码并没有本质区别,那么就可以证明破解两次一密也能使用与破解维吉尼亚密码相同的技术。

为了解释两次一密为什么可以像维吉尼亚密码那样进行破解,回顾维吉尼亚密码在加密比密钥长的消息时是如何工作的。在加密过程中,当密钥中的字母用尽时,回到密钥的第一个字母并继续加密。例如,用一个包含10个字母的密钥“YZNMPZXYXY”加密包含20个字母的消息“BLUE IODINE INBOUND CAT”,相当于前10个字母(BLUE IODINE)用“YZNMPZXYXY”加密,然后接下来的10个字母(INBOUND CAT)也用“YZNMPZXYXY”加密。图21-3显示了这种回环效应。

《无论计算机有多强大、攻击者多么聪明都无法破解的密码:一次一密》

 

图21-3 维吉尼亚密码的回环效应

对于一次一密而言,假设10个字母的消息“BLUE IODINE”是使用一次密钥“YZNMPZXYXY”加密的。然后,加密者又使用了相同的一次密钥“YZNMPZXYXY”加密第二个10字母消息“INBOUND CAT”,这是错误的,如图21-4所示。

《无论计算机有多强大、攻击者多么聪明都无法破解的密码:一次一密》

 

图21-4 对明文进行加密时两次一密会造成与维吉尼亚密码相同的局面

对比图21-3所示用维吉尼亚密码加密的密文(ZKHQXNAGKCGMOAJMAXR)和图21-4所示用两次一密方式加密的密文(ZKHQXNAGKC GMOAJMAXR),发现它们是完全相同的。这意味着两次一密具有与维吉尼亚密码相同的属性,因此可以使用相同的技术来破解它!

21.3 小结

简而言之,一次一密加密方式通过使用与消息长度相同、真正随机且仅使用一次的密钥,使维吉尼亚密码变得抗黑客攻击。当这3个条件都满足时,一次一密就是不可破解的。但是,因为它使用起来很不方便,所以它不用于日常加密。一次一密的密钥由人亲自进行分发,通常包含一个密钥列表。请确保它不会落入他人的手中!

21.4 习题

1.为什么本章中没有出现一次一密程序?

2.两次一密相当于什么密码?

3.如果使用长度为明文两倍的密钥,一次一密算法的安全性会是原来的两倍吗?

本文摘自《Python密码学编程 第2版》

《无论计算机有多强大、攻击者多么聪明都无法破解的密码:一次一密》

 

本书是为对加密、破解或密码算法抱有浓厚兴趣的人士准备的。除第23章和第24章介绍的公钥密码算法以外,本书其余的密码算法均有超过一个世纪的历史,但目前的笔记本电脑有破解它们的计算能力。现在已经很少有组织或个人会使用这些密码算法了,但通过学习这些算法,读者能够了解密码算法建立的基础,也能了解黑客破解弱密码算法的方式。

● 注意

本书介绍的密码算法都非常有趣,但它们实际上并不安全。切记不能使用本书中的任何加密程序去加密真实的文件。还有一个普遍的定理是,不要信任任何你自己创造出来的密码算法。真实世界中的密码算法是经过密码学家多年的专业分析及设计之后才投入使用的。

本书也是为从未学习过编程的读者准备的。它将以Python语言传达基础的编程理念。对于新手来说,Python是一门优秀的编程语言,拥有平缓的学习曲线,各年龄段的初学者均可以掌握,而它同时也是一种用于专业软件开发的强大语言。Python程序可以运行在Windows、macOS、Linux系统,甚至树莓派,下载和使用Python程序都是完全免费的。

在本书中,作者将频繁用到“黑客”这一术语。“黑客”这个词语有两种定义,它可能指某个研究密码系统(如密码算法的原理或软件代码的片段)的人,这个人精通整个系统,以致他不会受到系统原则的限制,甚至可以创造性地对系统进行修改;这个词也可能是指闯入计算机系统的不法分子,他们会侵犯人们的隐私,造成各类损失。本书采用的是第一种释义。黑客是很“酷”的,而犯罪分子不过是一些认为搞破坏就能显得自己高人一等的家伙罢了。

    原文作者:人邮异步社区
    原文地址: https://blog.csdn.net/epubit17/article/details/106659283
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞