原文:
zh.annas-archive.org/md5/fe5e9f4d664790ea92fb33d78ca9108d
译者:飞龙
前言
密码学在保护关键系统和敏感信息方面有着悠久而重要的历史。本书将向您展示如何使用 Python 加密、评估、比较和攻击数据。总的来说,本书将帮助您处理加密中的常见错误,并向您展示如何利用这些错误。
这本书适合谁
这本书适用于希望学习如何加密数据、评估和比较加密方法以及如何攻击它们的安全专业人员。
本书内容
第一章,混淆,介绍了凯撒密码和 ROT13,简单的字符替换密码,以及 base64 编码。然后我们转向 XOR。最后,有一些挑战来测试您的学习,包括破解凯撒密码、反向 base64 编码和解密 XOR 加密而不使用密钥。
第二章,哈希,介绍了较旧的 MD5 和较新的 SHA 哈希技术,以及 Windows 密码哈希。最弱的哈希类型是常见的使用,其次是 Linux 密码哈希,这是常见使用中最强大的哈希类型。之后,有一些挑战需要完成。首先是破解一些 Windows 哈希并恢复密码,然后您将被要求破解哈希,甚至不知道使用了多少轮哈希算法,最后您将被要求破解那些强大的 Linux 哈希。
第三章,强加密,介绍了当今用于隐藏数据的主要模式。它足够强大,可以满足美国军方的需求。然后,介绍了它的两种模式,ECB 和 CBC;CBC 是更强大和更常见的模式。我们还将讨论填充预言攻击,这使得可能克服 AES CBC 的一些部分,如果设计者犯了错误,并且过于详细的错误消息向攻击者提供了信息。最后,我们介绍了 RSA,这是当今主要的公钥算法,它使得可以在不交换给定私钥的情况下通过不安全的通道发送秘密信息。在此之后,我们将进行一个挑战,我们将破解 RSA,即当它错误地使用两个相似的质数而不是两个随机质数时。
充分利用本书
您不需要有编程经验或任何特殊的计算机。任何能运行 Python 的计算机都可以完成这些项目,您也不需要太多的数学,因为我们不会发明新的加密技术,只是学习如何使用现有的标准加密技术,这些技术不需要比基本代数更多的东西。
下载本书的示例代码文件
您可以从www.packtpub.com的帐户中下载本书的示例代码文件。如果您在其他地方购买了这本书,您可以访问www.packtpub.com/support注册,直接将文件发送到您的邮箱。
您可以按照以下步骤下载代码文件:
- 在www.packtpub.com上登录或注册。
- 选择“支持”选项卡。
- 点击“代码下载和勘误”。
- 在搜索框中输入书名,然后按照屏幕上的说明操作。
下载文件后,请确保使用最新版本的解压缩软件解压缩文件夹:
- WinRAR/7-Zip for Windows
- Mac 的 Zipeg/iZip/UnRarX
- Linux 的 7-Zip/PeaZip
该书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/Hands-On-Cryptography-with-Python
。如果代码有更新,将在现有的 GitHub 存储库上进行更新。
我们还有其他代码包,来自我们丰富的图书和视频目录,可在github.com/PacktPublishing/
上找到。去看看吧!
下载彩色图片
我们还提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图像。您可以在这里下载:www.packtpub.com/sites/default/files/downloads/HandsOnCryptographywithPython_ColorImages.pdf
。
使用的约定
本书中使用了许多文本约定。
CodeInText
:表示文本中的代码词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄。这是一个例子:“如果我们输入HELLO
,它会打印出KHOOR
的正确答案。”
代码块设置如下:
alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" str_in = raw_input("Enter message, like HELLO: ") n = len(str_in) str_out = "" for i in range(n): c = str_in[i] loc = alpha.find(c) print i, c, loc, newloc = loc + 3 str_out += alpha[newloc] print newloc, str_out print "Obfuscated version:", str_out
任何命令行输入或输出都以以下形式编写:
$ python
粗体:表示新术语、重要单词或屏幕上看到的单词。例如,菜单或对话框中的单词会在文本中显示为这样。这是一个例子:“从管理面板中选择系统信息”。
警告或重要说明会以这种方式出现。提示和技巧会以这种方式出现。
第一章:混淆
Python 是最适合初学者的语言,这也是它如此受欢迎的原因。您可以用几行代码编写强大的代码,最重要的是,您可以完全精确地处理任意大的整数。本书涵盖了基本的密码学概念;经典的加密方法,如凯撒密码和 XOR;混淆和扩散的概念,决定了加密系统的强度;使用混淆隐藏数据;对数据进行哈希以确保完整性和密码;以及强大的加密方法和对这些方法的攻击,包括填充预言攻击。您不需要有编程经验来学习这些内容。您不需要任何特殊的计算机;任何可以运行 Python 的计算机都可以完成这些项目。我们不会发明新的加密技术,只是学习如何使用标准的现有技术,这些技术不需要任何比基本代数更复杂的东西。
我们将首先处理混淆,即加密的基本概念,以及隐藏数据以使其更难阅读的老式加密技术。后一种过程是加密模块与其他方法结合使用以制定更强大、更现代的加密技术的基本活动之一。
在本章中,我们将涵盖以下主题:
- 关于密码学
- 安装和设置 Python
- 凯撒密码和 ROT13
- base64 编码
- XOR
关于密码学
最近,随着所有货币(如比特币、以太坊和莱特币)的引入,密码一词变得过载。当我们将密码称为一种保护形式时,我们指的是应用于系统中的通信链路、存储设备、软件和消息的密码学概念。密码学在保护关键系统和敏感信息方面具有悠久而重要的历史。
在第二次世界大战期间,德国人使用 Enigma 机器加密通信,而盟军则竭尽全力破译这种加密。Enigma 机器使用一系列转子将明文转换为密文,通过了解转子的位置,盟军能够将密文解密为明文。这是一个重大的成就,但需要大量的人力和资源。今天仍然有可能破解某些加密技术;然而,攻击加密系统的其他方面,如协议、集成点甚至用于实现加密的库,往往更为可行。
密码学有着悠久的历史;然而,如今,您将遇到新概念,如区块链,可以用作帮助保护物联网的工具。区块链基于一组众所周知的密码原语。密码学的其他新方向包括抗量子算法,这些算法可以抵御理论上的量子计算机的攻击,并使用诸如 BB84 和 BB92 之类的协议来利用量子纠缠的概念,并为使用经典加密算法创建高质量的密钥。
安装和设置 Python
Python 从来都不容易安装。为了继续,请确保我们已经在我们的机器上设置了 Python。我们将看到如何在 macOS 或 Linux 上使用 Python 以及如何在 Windows 上安装它。
在 Mac 或 Linux 上使用 Python
在 macOS 或 Linux 系统上,您无需安装 Python,因为它已经包含在内。您只需要打开一个终端窗口并输入python
命令。这将使您进入交互模式,在这里您可以逐个执行python
命令。您可以通过执行exit()
命令来关闭交互模式。因此,基本上,要创建一个脚本,我们使用nano
文本编辑器,然后输入文件名。然后输入python
命令并保存文件。然后可以使用python
后跟脚本名称来运行脚本。因此,让我们看看如何在 macOS 或 Linux 上使用 Python,以下是具体步骤:
- 在 macOS 或 Linux 系统上打开终端并运行
python
命令。这将打开 Python 的交互模式,如下面的截图所示:
- 当你使用
print
命令时,它会立即打印Hello
:
>>> print "Hello" Hello
- 然后,我们将使用以下命令离开:
>>> exit()
- 如前所述,要在交互模式下使用 Python,我们将输入如下命令:
$ nano hello.py
- 在
hello.py
文件中,我们可以写入如下命令:
print "HELLO"
- 按Ctrl + X保存文件,然后只有在你修改了文件后才按Y和Enter。
- 现在,让我们输入 Python,然后输入脚本名称:
$ python hello.py
当你运行它时,你会得到以下输出:
前面的命令运行脚本并打印出HELLO
;如果你有 macOS 或 Linux 系统,这就是你所需要做的。
在 Windows 上安装 Python
如果你使用 Windows,你需要下载并安装 Python。
以下是你需要遵循的步骤:
- 从
www.python.org/downloads/
下载 Python - 在命令提示符窗口中运行它
- 用 Python 开始交互模式
- 使用
exit()
关闭
要创建一个脚本,你只需使用记事本,输入文本,用Ctrl + S保存文件,然后用python
后跟脚本名称运行它。让我们开始安装。
使用之前给出的链接打开 Python 页面并下载 Python。它为您提供各种版本的 Python。在本书中,我们将使用 Python 2.7.12。
有时,你无法立即安装它,因为 Windows 将其标记为不受信任:
- 你必须先在属性中解除阻止,这样它才能运行,并运行安装程序
- 当你按照安装程序的步骤进行时,你会看到一个名为 Add python.exe to path 的可选步骤。你需要选择那个选项
该选项的目的是使 Python 能够在终端窗口中从命令行运行,Windows 上称为命令提示符。
现在让我们继续我们的安装:
- 打开终端并输入以下命令:
$ python
- 当你运行它时,你会看到它有效。所以,现在我们将输入一个命令:
print "HELLO"
参考以下截图:
- 我们可以使用之前显示的
exit()
命令退出。 - 现在,如果我们想要制作一个脚本,我们输入以下命令:
notepad hello.py
- 这将打开记事本:
- 我们想要创建一个文件。在文件中,我们输入以下命令:
print "HELLO"
- 然后保存并关闭它。为了运行它,我们需要输入以下命令:
$ python hello.py
它运行并打印HELLO
。
通常,当你在 Windows 上安装 Python 时,它无法正确设置路径,所以你必须执行以下命令来创建一个符号链接;否则,Python 将无法从命令行正确启动:
**cd c: \Windows**
**mklink /H python.exe**
**c: \python27\python.exe**
在下一节中,我们将看看凯撒密码和 ROT13 混淆技术。
凯撒密码和 ROT13
在本节中,我们将解释什么是凯撒密码以及如何在 Python 中实现它。然后,我们将考虑其他shift
值,模运算和 ROT13。
凯撒密码是一个古老的技巧,你只需将字母向字母表中的后三个字符移动。这是一个例子:
- 明文:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
- 密文:
DEFGHIJKLMNOPQRSTUVWXYZABC
所以,HELLO
变成了KHOOR
。
为了实现它,我们将使用string.find()
方法。Python 的交互模式非常适合测试新方法,因此很容易创建一个字符串。你可以制作一个非常简单的脚本来实现凯撒密码,使用一个名为alpha
的字符串来表示字母表。然后你可以从用户那里获取输入,这就是明文方法,然后设置一个值n
,它等于字符串的长度,字符串输出等于一个空字符串。然后我们有一个循环,它重复了n
次,找到字符串中的字符,然后找到该字符在alpha
字符串中的位置。然后打印出这三个值,以便我们可以确保脚本正常工作,然后它将loc
(位置)加上3
,并将相应的字符放入字符串输出中,然后再次打印出部分值,以便我们可以看到脚本是否正常工作。最后,我们打印出最终的输出。添加额外的打印语句是开始编程的一个很好的方法,因为你可以发现错误。
在 Python 中实现凯撒密码
让我们继续打开终端,并按照以下步骤在 Python 中实现凯撒密码:
- 我们将首先在 Python 的交互模式下使用它,然后制作一个只包含一些字母的字符串来测试这种方法:
>>> str = "ABCDE" >>> str.find("A") 0 >>> str.find("B") 1 >>> exit()
- 因为我们了解了字符串方法的工作原理,我们将退出并进入
nano
文本编辑器,查看我们脚本的第一个版本:
$ nano caesar1.py
- 当你运行这个命令时,你会得到以下代码:
alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" str_in = raw_input("Enter message, like HELLO: ") n = len(str_in) str_out = "" for i in range(n): c = str_in[i] loc = alpha.find(c) print i, c, loc, newloc = loc + 3 str_out += alpha[newloc] print newloc, str_out print "Obfuscated version:", str_out
你可以在脚本中看到字母表和用户输入。你计算字符串的长度,对于每个字符,C
将是正在处理的一个字符,loc
将是该字符的数字位置,newloc
将是loc
加上3
,然后我们可以将该字符添加到字符串输出中。让我们看看这个。
- 使用Ctrl+X离开,然后输入以下命令:
$ python caesar1.py
- 当你运行这个命令时,你会得到以下输出:
Enter message, like HELLO:
- 如果我们输入
HELLO
,它会打印出KHOOR
的正确答案:
当我们运行这个脚本时,它接受HELLO
的输入,并将其逐个字符地分解开来,以便对每个字符进行处理。H
被发现是第 7 个字符,所以加上3
得到10
,结果是K
。它逐个字符地显示了它的工作原理。因此,脚本的第一个版本是成功的。
为了进一步清理代码,我们将删除不必要的print
语句并切换到shift
变量。我们将创建一个shift
变量。它也来自原始输入,但我们必须将其转换为整数,因为原始输入被解释为文本
,您不能将文本
添加到整数。这是接下来的脚本中唯一的更改。如果您给它一个3
的shift
值,您会得到KHOOR
;如果您给它一个10
的shift
值,您会得到ROVVY
;但如果您输入一个14
的shift
值,它会崩溃,显示字符串索引超出范围。这里的问题是,我们已经多次添加到loc
变量,最终,我们超过了Z
,变量就不再有效了。为了改进这一点,在向变量添加内容后,我们将检查它是否大于或等于26
,以及是否可以从中减去26
。一旦您运行这个,您可以使用14
的移位,这将起作用。我们可以使用24
的移位,它也可以工作。但是,如果我们使用44
的移位,它又超出范围了。这是因为当超过26
时,仅仅减去26
一次并不够,正确的解决方案是模运算。如果我们加上%26
,它将计算数字模26
,这将防止它离开0
到25
的范围。它将除以26
并保留余数,这在这种情况下是预期的。随着我们在密码学中继续前进,我们将看到模函数更多次。您可以输入任何您选择的shift
值,比如300
,它永远不会崩溃,但会将其转换为0
到25
之间的数字。
让我们看看脚本如何处理其他移位值:
- 看看凯撒脚本:
$ nano caesar2.py
- 运行它时,您将得到以下内容:
- 这是一个允许我们改变
shift
值但不处理shift
值变得太大的脚本。让我们运行以下命令:
$ python caesar2.py
- 如果输入
HELLO
并给它一个3
的移位,它是好的,但如果我们再次运行它并给它一个20
的移位,它就会崩溃:
因此,预料之中,这个有一些限制。
- 让我们继续看
caesar3
:
$ nano caesar3.py
- 运行后,我们得到以下输出:
Caesar3
试图通过捕捉它来解决这个问题,如果我们知道加法导致它大于或等于26
,则从中减去26
。
- 让我们运行以下命令:
$ python caesar3.py
- 我们将给它
shift
字符和shift
为20
,它会很好:
- 如果我们给它一个
40
的偏移量,它就不起作用:
有一些改进,但我们仍然无法处理任何shift
值。
- 让我们继续到
caesar4
:
$ nano caesar4.py
- 当您运行命令时,您将得到这个:
这是使用百分号进行模运算的脚本,这不会失败。
- 让我们运行以下命令:
$ python caesar4.py
- 当您运行命令时,您将得到这个:
这是处理所有凯撒移位值的脚本。
ROT13
ROT13 只不过是一个shift
等于13
个字符的凯撒密码。在接下来的脚本中,我们将硬编码移位为13
。如果您运行一次 ROT13,它会将HELLO
更改为URYYB
,如果您再次使用相同的过程对其进行加密,输入URYYB
,它将变回HELLO
,因为第一个移位只是13
个字符,再移位13
个字符将总移位变为26
,这样就可以很好地包裹,这就是这个脚本有用和重要的地方:
- 现在让我们看一下使用以下命令的 ROT13 脚本:
$ nano rot13.py
- 当您运行上述命令时,您可以看到脚本文件:
- 它与我们上次凯撒密码移位的脚本完全相同,移位为
13
。按照这里所示的脚本运行:
$ python rot13.py
以下是输出:
- 如果我们输入消息
URYYB
并运行它,它会变回HELLO
:
这很重要,因为有很多具有这种属性的加密函数;当你加密一次然后再次加密时,你会反转这个过程。它不会变得更加加密,而是变得未加密。在下一节中,我们将涵盖 base64 编码。
Python 密码学实用指南(全)(2)https://developer.aliyun.com/article/1507499