一.实验目的
本实验的学习目标是让学生熟悉密钥加密与单向散列函数相关的概念。完成实验后,学生应该能够获得有关加密算法、加密模式、单向散列函数的第一手经验。此外,学生将能够使用工具和编写程序来加密/解密消息,为给定的消息生成单向散列值。
开发人员在使用加密算法和模式时会犯许多常见的错误。这些错误会削弱加密的强度,并最终导致出现漏洞。本实验向学生展示一些错误,并要求学生发起攻击以利用这些漏洞。
1. 密钥加密。
2. 加密模式、初始向量(IV)和填充(Padding)。
3. 使用加密算法的常见错误。
4. 使用密码库进行编程。
二.实验步骤与结果
2.1 Task 1:使用不同的密码算法和加密模式加密
在此任务中,我们将使用各种加密算法和模式。你可以使用以下openssl enc 命令来加密/解密文件。要查看手册,你可以输入man openssl 和man enc。
请将ciphertype 替换为特定的加密算法,例如-aes-128-cbc,-aes-128-cfb,-bf-cbc 等。这个任务,你应该尝试至少3 种不同的加密算法和模式组合。
实验步骤:
使用AES-128-CBC加密,解密,并与原文对比:
使用AES-128-CFB加密,解密,并与原文对比:
使用AES-128-OFB加密,解密,并与原文对比:
2.2 Task 2:加密模式:ECB vs. CBC
文件pic_original.bmp 包含一个简单的图片。我们想加密这张图片,所以没有加密密钥的人无法知道图片中的内容。请分别使用ECB(电子密码本)和CBC(密码块链接)模式加密文件。比如,你可以使用
• CBC 模式:-aes-128-cbc
• ECB 模式:-aes-128-ecb
然后执行以下操作:
(1)让我们将加密的图片视为图片,并使用图片查看软件来显示它。但是,对于.bmp 文件,前54 个字节包含有关图片的头部信息,我们必须正确设置它,因此加密文件可以被视为合法的.bmp 文件。我们将加密图片的头部替换为原始图片的头部。你可以使用十六进制编辑器工具(例如Bless)直接修改二进制文件。我们还可以使用以下命令从p1.bmp 中获取header,从p2.bmp 中获取数据(从偏移量55 到文件末尾),然后将header 和数据组合到一个新文件中。
(2)使用任意图片查看软件显示加密图片。在ECB 模式和CBC 模式下,你分别能得到关于加密图片的原始图片的任何有用的信息吗?请解释你的观察。
实验步骤:
采用ECB模式加密如下:
加密后的图片如下:
采用CBC模式加密如下:
加密后的图片如下:
通过与原图的对比可以得知,在ECB模式加密后,得到的加密图片仍然可以得到原来图片的轮廓与形状,而通过CBC模式加密后,得到的加密图片完全是乱码无法得到关于原始图片任何有用的信息。
原因在于CBC模式每一次加密要将前一次的加密结果与加密内容进行异或,因此每一部分的加密前后不是一一对应的,即相同的明文块不会得到相同的密文块。而ECB模式中,不需要异或,相同的明文块会对应相同的密文块,因此图片的形状和轮廓依旧会保留。
2.3 Task 3:错误传播– 被破坏的密文
为了理解各种工作模式的在错误传播上的性质,请做以下练习:
1. 创建一个至少1000 字节长的文本文件。
2. 使用AES-128 算法加密文件。
3. 不幸的是,加密文件中第55 个字节的某一个bit 已损坏。你可以使用bless 十六进制编辑器来破坏该文件。
4. 使用正确的密钥和IV 解密损坏的密文文件。
请回答以下问题:如果工作模式是ECB 或CBC ,你分别能从解密后的损坏文件中恢复出多少信息?
请在做这个任务之前回答这个问题,然后在完成此任务之后看看你的答案是否正确。给出你的理由。
ECB模式将只有第四组解密错误
CBC模式将有第四组与第五组的解密错误
实验步骤:
首先创建一个1000字节长的文本文件如下:
采用ECB模式加密后得到如下文件:
其中第55字节为E1
对应二进制位1110 0001
修改为A1
对应二进制位1010 0001
然后再进行解密
如下图:
修改前:
修改后:
解密后:
可以观察到只有第四轮的明文改变
CBC模式同理:
如下图:
修改前:
修改后:
解密结果:
可以观察到第四轮的明文改变,以及第五轮的第七位发生改变
实验结果与预期结果相同
2.4 Task 4:寻找密钥
你得到一个明文和一个密文,你知道aes-128-cbc 用于从明文生成密文。你得到的另一条线索是,加密此明文使用的密钥是一个少于16 个字符的英语单词。这个单词可以从英语字典中找到。由于这个单词少于16 个字符(即128 bits )1,在单词的结尾附加了一些井号(#:十六进制值是0x23)构成一个128bits 的密钥。
你的目标是编写一个程序来找出这个密钥,你可以使用任意的编程语言(如Java、C、Shell)来实现你的分析。你也可以在程序中直接调用OpenSSL 命令来使用加密算法。你可以从Internet 下载英文单词列表,我们也提供了一个:words.txt。
明文、密文和IV 如下:
实验步骤如下:
编写脚本如下:
执行该脚本,即可得到密钥如下:
2.5 Task 5:生成消息摘要
在此任务中,我们将使用各种哈希算法。。你可以使用以下openssl dgst 命令生成文件的哈希值。
$ openssl dgst dgsttype filename |
---|
请使用特定的哈希算法替换dgsttype,例如-md5,-sha1,-sha256 等。在此任务中,你应该尝试至少3 种不同的算法,并描述你的观察。你可以通过键入“man dgst”找到支持的哈希算法。
我们提供了一个(明文)文本文件用作测试:plain.txt
步骤如下:
分别使用md5,sha1,sha256进行加密,可以观察得到了不同长度的十六进制字符串。
2.6 Task 6:哈希函数的输出特性
要了解哈希函数的输出特性,我们希望对SHA1 执行以下练习:
1. 使用SHA1 算法为plain.txt 生成哈希值H1。
2. 修改输入文件的一位。你可以使用Bless 来完成此修改。
3. 为修改后的文件生成哈希值H2。
请观察H1 和H2 是否相似。请在实验报告中描述你的观察结果。
实验步骤:
使用SHA1算法加密plain.txt后,得到结果如下:
修改文件的内容中第一个字节中的第一个bit
初始为49,二进制为:0100 1001
修改后为C9,二进制为:1100 1001
如下图所示:
修改前:
修改后:
重新采用SHA1算法进行,加密得到结果如下:
对比前后两次的哈希结果:
修改前:8d3b090efe42d1344c7d6d60a534a7f525e2b2e7
修改后:6711dd03a1332377c155d81f713b4ea78c306ebf
可以发现两次的结果只有长度相同,在内容上完全不同,没有任何关联。由于任何一比特的改变都使得了输出结果的不同,保证了哈希算法的抗碰撞特性。
2.7 Task 7:单向性与抗碰撞性
哈希函数的具有单向性与抗碰撞性。在这个实验里我们将使用暴力穷举方法来测试抗碰撞性,即找到具有相同哈希值的两个文件。你的目标是,在给定一个文件,编写一个程序来找出另一个具有相同哈希值的文件,你可以使用任意的编程语言(如Java、C、Shell)来实现你的分析。你可以在程序中直接调用OpenSSL 命令来使用哈希算法。
由于大多数哈希函数的抗碰撞性的抵御暴力攻击的能力非常强大,因此使用暴力穷举方法攻破它们需要数年时间。为了使任务可行,我们将哈希值的长度减少到24 位。我们在此任务中只使用SHA1 哈希值的前24 位。即,可以理解成我们使用修改过的单向散列函数。请设计一个程序,找出以下内容:
1. 计算original.txt 的SHA1 哈希值,并记录前24 位。
2. 使用暴力穷举方法(生成随机字符串),找到另外一个文件与上述文件具有相同的哈希值(前24 位)。
实验步骤如下:
首先计算original.txt 的SHA1 哈希值,得到其前24位如下:
根据得到的前24位哈希值,编写脚本如下:
1 | #! /usr/bin/python3 |
执行该脚本得到结果如下:
此处生成的随机字符串长度同original.txt,有17位,得到五次碰撞如下:
原文 | 密文 | 次数 |
---|---|---|
iVs3Kjk18KlBgu10v | 4dc9817f10edf31eb2e76bdce63d071944615297 | 4519964 |
x2vwXgg5_VTg8FjfM | 4dc9815669519a61e1ace2eb8c7081f4c8f3c868 | 19477619 |
xj10d3J7L38qP0L70 | 4dc9812411f31e743a50506bb77a43d476d5d7c6 | 33590917 |
jQKpQ8kVkFzhyJQBc | 4dc98181cd118240664148ba948fff0be73c2fbe | 15379182 |
rkYx0Se0m93vqeyXb | 4dc98131481a7bdc3fa0d6bc391fa8a06e2513c8 | 19913632 |
平均碰撞次数:18576262.8次