秘钥加密和解密实验
秘钥加密和解密实验
环境
- openssl开发库
- bless编辑器
使用openssl enc命令可以对文件进行加密
$ openssl enc ciphertype -e -in plain.txt -out cipher.bin \
-K 00112233445566778899aabbccddeeff \
-iv 0102030405060708
上述代码中的 ciphertype 应该被替换成指定的加密类型,比如-aes-128-cbc, -aes-128-cfb, -bf-cbc 等
密码(cipher):指 bf, cast, des, aes, rs2 等
以下列出部分主要选项释义:
| 参数 | 含义 | 含义(中文) |
|---|---|---|
| -in | input file | 输入文件 |
| -out | output file | 输出文件 |
| -e | encrypt | 加密 |
| -d | decrypt | 解密 |
| -K/-iv | key/iv in hex is the next argument | 十六进制密钥与初始向量 |
| -[pP] | print the iv/key (then exit if -P) | 打印初始向量与密钥 |
加密模式感知-ECB和CBC
以下是名为 pic_original.bmp 的图片: 
首先下载该图片:
$ wget http://labfile.oss.aliyuncs.com/courses/241/pic_original.bmp
#要查看图片需要安装图片查看器
$ sudo apt-get install gpicview
pic_original.bmp 是一张简单的图片,我们将对它进行加密,这样没有密钥的人就无法看到这张图是什么了。
请分别使用 ECB 和 CBC 模式:
$ openssl enc -aes-128-cbc -e -in pic_original.bmp -out pic_cbc.bmp \
-K 00112233445566778899aabbccddeeff \
-iv 0102030405060708
$ openssl enc -aes-128-ecb -e -in pic_original.bmp -out pic_ecb.bmp \
-K 00112233445566778899aabbccddeeff \
-iv 0102030405060708
- 加密后的图片 bmp 文件头是损坏的,我们需要用 bless 编辑该图片文件。

把 pic_ecb.bmp 和 pic_cbc.bmp 的文件头修改成 pic_original.bmp 的文件头(注:bmp 头长度为 54 字节,可复制粘贴)。
修改加密后文件的文件头



- 修改完后,打开图片,描述你的观察结果。

观察结果(左:cbc 中:ecb 右:原图) 
加密模式-损坏的密文
为了理解各种不同加密模式的特性,我们需要做以下练习:
- 创建一个长度至少 64 字节的文本文件。
- 使用 AES-128 对其进行加密
- 不幸的是,密文的第 30 位损坏了。请用编辑器模拟损坏,编辑该位,将其反转。
- 使用相同的 key 与 iv 对密文进行解密。
下面就进行实际操作吧。
1、首先新建一个长度至少是 64 字节的文本文件
$ vi /home/shiyanlou/corrupted.txt
按 i 键,输入内容:
i love shiyanlou
i love shiyanlou
i love shiyanlou
i love shiyanlou
按 esc ,再输入 :wq 保存退出。
2、对文本加密
$ openssl enc -aes-128-ecb -e -in corrupted.txt -out cipher_aes_128_ecb.bin \
> -K 0011223344556677889aabbccddeeff \
> -iv 0102030405060708
输入
\后按enter键,>不用输入。

3、接下来我们模拟密文损坏的情况
找到密文文件右击,选择用其他程序打开,再点击 Bless Hex Editor -》打开。

原始的文件中第 30 位是 EA,我们将其改为 FA,以制造损坏的密文。
原始:

修改后:

4、解密损坏的密文文件
$ openssl enc -aes-128-ecb -d -in cipher_aes_128_ecb.bin -out decrypted.txt \
> -K 0011223344556677889aabbccddeeff \
> -iv 0102030405060708

上面的是原始的明文文件,下面是解密损坏的密文文件得到的文件。可以看出解密出来有多少内容是损坏的。
上面使用了ecb模式进行加密,下面再尝试其他方式,看看损坏的结果有什么不一样
CBC模式:

CFB:

OFB:
ofb模式的确是没有影响,不是忘了操作
填充
对于分组密码来说,当明文大小不是分组大小的倍数的时候,就需要使用填充了。请做以下练习:
1.openssl 手册(man openssl)中提到 openssl 使用 pkcs5 标准来做填充。请在查询 pkcs5 标准给出的填充方法后设计实验验证这一点。
2.使用 ECB,CBC,CFB,OFB 四种模式加密同一个文件,说明哪种模式会使用填充,哪种模式不会,为什么有些模式不需要填充。
1、在 /home/shiyanlou 目录下新建一个文件 test20.txt,输入如下内容:
i love shiyanlou!!!
2、对 test20.txt 加密
$ openssl enc -aes-128-cbc -e -in test20.txt -out test20.bin \
> -K 0011223344556677889aabbccddeeff \
> -iv 0102030405060708

可以看出,加密文件的大小为 32 个字节,比原始文件多了 12 个字节。因为我使用了AES-128-CBC,所以每个块都是 16 个字节。原始文件的内容是 20 个字节,所以第一个块是 16 个字节,第二个块是 4 个字节。第二个块不足 16 个字节,所以填充了 12 个字节。

浙公网安备 33010602011771号