Crypto Lab – One-Way Hash Function and MAC
1 Overview
本实验的学习目的是让学生熟悉单向哈希函数以及消息认证码(MAC),在完成本课实验后,学生应当对密码学概念有更深入的理解并且能通过使用工具或者编程为一段指定的信息生成哈希值以及消息认证码。
2 Lab Environment
2.1 Installing OpenSSL
安装OpenSSL。在这个实验室中,将使用openssl命令和库。虚拟机已经下载了目录下所需的文件/home/seed/openssl-1.0.1
。要配置和安装openssl库,请使用openssl-1.0.1文件夹并运行以下命令
。
$ sudo make
$ sudo make test
$ sudo make install
2.2 Installing a hex editor
安装十六进制编辑器。在这个实验室中,需要能够查看和修改二进制格式的文件。虚拟机中安装了一个名为GHex
的十六进制编辑器。它允许用户从任何文件加载数据,查看和编辑十六进制或ascii码。注:也可以使用另一个名为Bless的hex编辑器;这个工具在虚拟机中可能没有安装,可以使用以下命令自己安装它。(此处不安装Bless,直接使用GHex
)
$ sudo apt-get install bless
3 Lab Tasks
3.1 Task 1: Generating Message Digest and MAC
生成消息摘要和MAC。在本实验中,将认识各种单向哈希算法。你可以使用 openssl dgst
命令为一个文件生成哈希值。输入 man openssl
和 man dgst
查看手册。
使用指定的单向哈希算法替换 dgsttype
部分,比如 -md5, -sha1, -sha256
等等,至少使用 3 种算法,描述你观测到的结果。可以通过键入“man openssl
”找到支持的单向哈希算法。
新建一个文件 test1.txt,其内容如下(文本内容随意):
观察不同算法为文件生成的哈希值(此处用-md5, -sha1, -sha256
这3种算法)
3.2 Task 2: Keyed Hash and HMAC
本节实验中,要为文件生成 keyed hash
(比如 MAC)。使用-hmac
选项,选项后所带参数就是 key
。命令格式如下:
请分别使用 HMAC-MD5, HMAC-SHA256 和 HMAC-SHA1
生成 keyed hash
,并配以不同长度的 key
。是否总是需要在 HMAC 中使用一个固定长度的 key?如果是这样,key 的长度是多少?如果不是,为什么?
由上述结果可以知道,不需要使用一个固定长度的key,无论密钥长度是多少,都可以正常输出结果,这是单向哈希函数的性质。
3.3 Task 3: The Randomness of One-way Hash
单向哈希函数的随机性。为了理解单向函数的特性,需要做一些关于 MD5 和 SHA256 的练习
- 创建一个任意长度的文本文件。
- 使用指定的哈希算法为该文件生成哈希值 H1。
- 翻转该文件的任意一位,你可以使用 ghex 或者 bless 进行编辑。
- 为修改后的文件生成哈希值 H2。
- 观察 H1 与 H2 是否相似,请描述你的观察。
- 写一个程序计算 H1 与 H2 相同位的数量。
编写实验程序compare.py,此处使用Python语言,具体如下
# compare.py
# Calculate the number of identical bits for H1 and H2
# @Author: huang
# @Date: 2020-06-16
from os import urandom
import os, tempfile
import binascii
# Flip any bit of a byte
def flipBit(x, kth):
x = ord(x)
if (x & 1 << kth ) != 0:
return chr(x & ~(1 << kth))
else:
return chr(x | ( 1 << kth))
# Hexadecimal string to binary string
def byte_to_binary(n):
return ''.join(