Tải bản đầy đủ (.pdf) (31 trang)

Tìm hiểu và nghiên cứu về hàm băm mật mã (có sản phẩm demo bằng Java)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.6 MB, 31 trang )

BAN CƠ YẾU CHÍNH PHỦ
HỌC VIỆN KỸ THUẬT MẬT MÃ

BÀI TẬP LỚN
Môn học: Mật mã ứng dụng trong an toàn thông tin
Đề tài: Tìm hiểu và nghiên cứu về hàm băm mật mã
Giáo viên hướng dẫn: Hoàng Đức Thọ
Sinh viên thực hiện: 1. Trần Minh Đức
2. Vũ Văn Hưởng
3. Đỗ Thị Thanh Huyền
4. Lê Văn Hưng
5. Đỗ Thành Hưng

Hà Nội, tháng 12 năm 2019
1

Hà Nội, tháng 11 năm 2019


MỤC LỤC
MỤC LỤC.......................................................................................................... 2
DANH SÁCH CÁC KÝ HIỆU TỪ VIẾT TẮT .................................................. 3
DANH SÁCH CÁC BẢNG................................................................................ 4
DANH SÁCH CÁC HÌNH VẼ ........................................................................... 5
LỜI MỞ ĐẦU .................................................................................................... 6
Chương I: Tổng quan về hàm băm mật mã ......................................................... 7
1.1. Khái quát về hàm băm mật mã.................................................................. 7
1.1.1. Định nghĩa hàm băm mật mã .............................................................. 7
1.1.2. Cấu trúc của hàm băm mật mã ............................................................ 8
1.2. Phân loại các hàm băm mật mã ............................................................... 10
1.2.1. Lớp các hàm băm không có khóa...................................................... 10


1.2.2. Lớp các hàm băm có khóa ................................................................ 10
1.3. Các ứng dụng cơ bản của hàm băm mật mã ............................................ 12
1.4. Giới thiệu một số họ hàm băm phổ biến ................................................. 17
1.5. Một số kiểu tấn công lên hàm băm mật mã ............................................. 19
1.5.1. Tấn công dựa trên “Nghịch lý ngày sinh” ......................................... 19
1.5.2. Phương pháp tấn công gặp nhau ở giữa (meet in the middle attack) .. 19
1.5.3. Tấn công vét cạn............................................................................... 20
Chương II: Thuật toán SHA-256 ...................................................................... 21
2.1. Tổng quan về SHA ................................................................................. 21
2.2. SHA-256 ................................................................................................ 22
2.2.1 Ứng dụng của SHA-256 .................................................................... 22
2.2.2 Các bước làm việc trong SHA-256 .................................................... 22
Chương III: Cài đặt thuật toán SHA-256 .......................................................... 27
KẾT LUẬN ...................................................................................................... 30
TÀI LIỆU THAM KHẢO ................................................................................ 31

2


DANH SÁCH CÁC KÝ HIỆU TỪ VIẾT TẮT
SHA

Secure Hash Algorithm

MD

Message-Digest algorithm

MAC


Message Authentication Code

HMAC

Hash based Message Authentication Code

IPSEC

Internet Protocol Securit

NIST

National Institute of Standards and Technology

DKIM

DomainKeys Identified Mail

TLS

Transport Layer Security

PGP

Pretty Good Privacy

3


DANH SÁCH CÁC BẢNG

Bảng 1.1: Một số hàm băm phổ biến và thông số tương ứng ............................ 17

4


DANH SÁCH CÁC HÌNH VẼ
Hình 1.1: Ánh xạ giữa thông điệp và giá trị băm không phải là song ánh…… ....8
Hình 1.2: Cấu trúc Mekle-Damrgard .................................................................. 8
Hình 1.3: Mô hình sử dụng hàm băm để xác thực thông báo ............................ 13
Hình 1.4: Mô hình sử dụng hàm băm trong lược đồ chữ ký số ......................... 14
Hình 1.5: Chứng thực mật khẩu, theo tính chống trùng, ................................... 15
Hình 1.6: Ứng dụng hàm băm khi tải dữ liệu trên mạng ................................... 16
Hình 2.1: Hàm nén SHA-256 ........................................................................... 26
Hình 2.2: SHA-256 message schedule………………………………………....26
Hình 3.1: Giao diện chương trình chức năng băm file ...................................... 27
Hình 3.2: Chọn file cần băm ............................................................................. 28
Hình 3.3: Giá trị băm trả về khi thực hiện băm file ........................................... 28
Hình 3.4: Chức năng băm thông điệp nhập vào từ bàn phím ............................. 29
Hình 3.5: Giá trị băm trả về khi thực hiện băm thông điệp nhập vào
từ bàn phím…………………………………………………………………….29

5


LỜI MỞ ĐẦU
Ngày này, với sự phát triển nhanh chóng của Internet và các ứng dụng giao
dịch điện tử trên mạng, nhu cầu bảo vệ thông tin đi kèm cũng ngày càng được
quan tâm và có ý nghĩa quan trọng. Một trong những công việc quan trọng của
giao dịch điện tử chính là quá trình chứng thực nguồn gốc nội dung thông tin (chữ
ký điện tử) và xác thực tính toàn vẹn dữ liệu. Để làm được điều này, chúng ta cần

phải áp dụng ứng dụng chuẩn mật mã nâng cao, trong đó ứng dụng xây dựng các
hàm băm mật mã là một trong những vấn đề cần được nghiên cứu và giải quyết.
Trong bài báo cáo này, chúng em sẽ đi tìm hiểu về các nội dung sau:
• Chương I: Tổng quan về hàm băm mật mã
- Tìm hiểu về khái niệm, tính chất, phân loại, cấu trúc và ứng dụng của
hàm băm mật mã.
• Chương II: Thuật toán SHA-256
- Trình bày về một trong những thuật toán băm được sử dụng rộng rãi
hiện nay là SHA-256. Chi tiết về các bước của thuật toán này.
• Chương III: Cài đặt thuật toán SHA-256
- Sử dụng ngôn ngữ lập trình Java để cài đặt thuật toán SHA-256, thực
hiện demo băm đoạn thông điệp nhập vào từ bàn phím.

6


Chương I: Tổng quan về hàm băm mật mã
1.1. Khái quát về hàm băm mật mã
1.1.1. Định nghĩa hàm băm mật mã
Các hàm băm đóng vai trò cơ bản trong mật mã hiện đại. Hàm băm ℎ là một
hàm toán học chuyển đổi các xâu bit có độ dài hữu hạn tùy ý thành các xâu bit có
độ dài 𝑛 cố định. Đầu ra này được gọi là mã băm (hay kết quả băm, giá trị băm,
vết, hay tóm lược thông báo). Hàm băm được đặc trưng bởi hai tính chất sau:
a) Tính chất nén: ℎ sẽ ánh xạ một đầu vào 𝑥 có độ dài bit hữu hạn tùy ý
tới một đầu ra ℎ(𝑥) có độ dài bit 𝑛 hữu hạn (tùy vào thuật toán băm được sử
dụng).
b) Tính chất dễ dàng tính toán: Với ℎ cho trước và một đầu vào 𝑥, có thể
dễ dàng tính được ℎ(𝑥).
Hàm băm mật mã là hàm băm mà ngoài hai tính chất cơ bản trên còn phải thỏa
mãn ba tính chất an toàn được nêu dưới đây:

a) Tính kháng tiền ảnh (tính một chiều): Đối với hầu hết đầu ra được xác
định trước, không có khả năng tính toán để tìm một đầu vào bất kỳ mà khi
băm sẽ cho ra đầu ra tương ứng (tức là cho trước một giá trị tóm lược 𝑦, không
thể tìm một tiền ảnh 𝑥. sao cho ℎ (𝑥 ) = 𝑦).
b) Tính kháng tiền ảnh thứ hai: Không có khả năng tính toán để tìm một
đầu vào thứ hai bất kỳ mà có cùng đầu ra như với đầu vào đã được xác định
trước (tức là cho trước 𝑥 ∈ 𝑋, không có khả năng tính toán để tìm tiền ảnh
thứ hai 𝑥 + ∈ 𝑋 sao cho 𝑥 + ≠ 𝑥và ℎ(𝑥 + ) = ℎ(𝑥)).
c) Tính kháng va chạm: Không có khả năng tính toán để tìm hai đầu vào
bất kỳ 𝑥, 𝑥 + ∈ 𝑋sao cho 𝑥 + ≠ 𝑥 và ℎ(𝑥 + ) = ℎ(𝑥 ).
Kích thước của thông điệp đầu vào 𝑥 là bất kỳ còn kích thước của giá trị băm ℎ
của thông điệp là nhỏ vậy nên việc trùng giá trị băm là không thể loại bỏ. Tính
chống trùng của hàm băm là yêu cầu rằng việc tìm ra hai thông điệp đầu vào 𝑥
như vậy thì phải là rất khó khăn về mặt thời gian và tính toán.
7


Không gian
thông điệp
Không gian
giá trị băm

x1

h1

xi

h2


x2

Hình 1.1: Ánh xạ giữa thông điệp và giá trị băm không phải là song ánh
1.1.2. Cấu trúc của hàm băm mật mã
Theo định nghĩa hàm băm mật mã ta thấy rằng bản chất của hàm băm chính
là một hàm nén. Hiện tại hầu hết các hàm băm mật mã áp dụng cấu trúc hàm băm
Merkle- Damrgard (MD5, SHA-1, SHA-2) hoặc cấu trúc Sponge (SHA-3).
Cấu trúc Mekle-Damrgard:

(b) Mô tả chi tiết
đầu vào ban đầu x
(a) Mô tả ở mức cao

Hàm băm

Đầu vào độ dài tùy ý

Tiền xử lý
Thêm các bit đệm (padding)

Hàm
nén lặp

Thêm độ dài khối
Đầu ra có độ
dài cố định

Đầu ra

Đầu vào đã định dạng


x = x1 x 2 … x t

Xử lý lặp

Biến đổi đầu
ra có lựa chọn

x

Hàmnénɰ
i

ɰ

H

i

H

t

g

Đầu ra h ( x ) = g

Hình 1.2: Cấu trúc Mekle-Damrgard
8


(Ht )


Hầu hết các hàm băm không có khóa ℎ được thiết kế như các xử lý lặp để băm
các đầu vào có độ dài hữu hạn tùy ý, bằng việc xử lý các khối đầu vào có độ dài
cố định, như chỉ ra trong hình 1.2 .
Đầu vào hàm băm là một thông báo 𝑥 có độ dài hữu hạn tùy ý được chia
thành các khối bằng nhau có độ dài cố định là 𝑟-bit. Bước tiền xử lý này thường
gồm việc thêm các bit mở rộng (gọi là padding) để thông báo 𝑥 có độ dài bit là
bội của độ dài khối 𝑟, và (vì các lý do an toàn) thường gồm 1 khối hoặc một
phần khối để chỉ độ dài bit của đầu vào chưa được thêm vào. Mỗi khối 𝑥0 được
dùng làm đầu vào có độ dài cố định cho hàm băm bên trong 𝑓 (hàm nén của ℎ,
thực hiện tính một kết quả trung gian mới có độ dài bit là 𝑛) là một hàm của kết
quả trung gian trước đó có độ dài là 𝑛 bit và khối đầu vào tiếp theo 𝑥023.
Gọi 𝐻0 là ký hiệu phần kết quả sau bước thứ 𝑖, xử lý chung cho hàm băm lặp
với đầu vào 𝑥 = 𝑥3 𝑥6 … 𝑥8 có thể được mô tả như sau:
𝐻9 = 𝐼𝑉; 𝐻0 = 𝑓(𝐻0<3, 𝑥0 ),1 ≤ 𝑖 ≤ 𝑡; ℎ(𝑥 ) = 𝑔(𝐻8 )
𝐻0<3 được coi như biến chuỗi giữa bước 𝑖 − 1 và bước 𝑖, và 𝐻9 là giá trị khởi
đầu được định nghĩa trước hay gọi là giá trị khởi đầu 𝐼𝑉. Biến đổi đầu ra có lựa
chọn 𝑔 được dùng trong bước cuối cùng để ánh xạ biến chuỗi 𝑛 −bit thành một
kết quả 𝑚 −bit 𝑔(𝐻8 ), 𝑔 thường là ánh xạ đồng nhất 𝑔(𝐻8 ) = 𝐻8 .
Cấu trúc Sponge: là một cấu trúc mới, được nghiên cứu và áp dụng trong
hàm SHA-3.

9


1.2. Phân loại các hàm băm mật mã
Dựa trên những tham số đầu vào của các hàm băm, các hàm băm được phân
thành hai lớp. Gồm lớp hàm băm có khóa và lớp hàm băm không có khóa.

1.2.1. Lớp các hàm băm không có khóa
Một hàm băm không có khóa là một hàm ℎ: 𝑋 → 𝑌
Trong đó:
• 𝑋 là một tập các thông báo có thể
• 𝑌 là một tập hữu hạn các giá trị tóm lược thông báo hoặc các thẻ xác thực
có thể.
Một số họ hàm băm hiện có thuộc lớp này như: Họ hàm băm MD (MD2,
MD4, MD5), họ hàm băm SHA (SHA-1, SHA-224, SHA-256, SHA-384.., SHA3).
1.2.2. Lớp các hàm băm có khóa
Các hàm băm có khóa được sử dụng để xác thực thông báo và thường được
gọi là các thuật toán tạo mã xác thực thông báo (MAC)
1.2.2.1 Định nghĩa hàm băm có khóa:
Một họ hàm băm có khóa là một bộ bốn (𝑋, 𝑌, 𝐾, 𝐻) thỏa mãn các điều kiện:
1) 𝑋 là một tập các thông báo có thể.
2) 𝑌 là một tập hữu hạn các giá trị tóm lược thông báo hoặc các thẻ xác
thực có thể.
3) 𝐾 là không gian khóa, là một tập hữu hạn các khóa có thể.
4) Đối với mỗi khóa 𝑘 ∈ 𝐾, có một hàm băm ℎG ∈ 𝐻. Mỗi ℎG : 𝑋 → 𝑌.
Trong định nghĩa ở trên, 𝑋 có thể là một tập hữu hạn hoặc vô hạn; 𝑌 luôn luôn
là một tập hữu hạn. Nếu 𝑋 là một tập hữu hạn, thì hàm băm đôi khi được gọi là
hàm nén (compression function). Trong trường hợp này, chúng ta luôn giả thiết
rằng |𝑋| ≥ |𝑌| và thường giả thiết với điều kiện mạnh hơn là |𝑋| ≥ 2|𝑌|. Điều
này có nghĩa là không thể tránh khỏi các va chạm. Nếu hàm ℎ là ngẫu nhiên theo
10


nghĩa tất cả các đầu ra là đồng xác suất thì có khoảng 28<3 các đầu vào ánh xạ tới
mỗi đầu ra (𝑡là số bit đầu vào, 𝑛 là số bit đầu ra, 𝑡 > 𝑛) và 2 đầu vào được chọn
ngẫu nhiên sẽ có cùng đầu ra với xác suất 21.2.2.2. Mã xác thực thông báo

Định nghĩa mã xác thực thông báo (MAC-Message Authentication Code)
Thuật toán mã xác thực thông báo là một họ các hàm ℎM được tham số hóa
bởi một khóa bí mật 𝑘, với các tính chất:
a. Tính chất dễ tính toán: với một hàm ℎM đã biết, cho trước một giá trị 𝑘
và một đầu vào 𝑥, ℎM (𝑥) là dễ tính toán. Kết quả này gọi là giá trị MAC hoặc
MAC.
b. Tính chất nén: ℎM ánh xạ một đầu vào 𝑥 có độ dài bit tùy ý hữu hạn thành
một đầu ra ℎM (𝑥) có độ dài bit cố định 𝑛.
c. Tính chất kháng tính toán: cho trước không hoặc nhiều cặp text-MAC
(𝑥0 , ℎM (𝑥0 )), không thể tính toán để tìm một cặp text-MAC bất kỳ (𝑥, ℎM (𝑥 ))
cho một đầu vào mới 𝑥0 ≠ 𝑥0 (bao gồm cả khả năng ℎM (𝑥 ) = ℎM (𝑥0 ) với 𝑖 nào
đó).
Kỹ thuật xác thực bằng thuật toán MAC được mô tả chung như sau: Giả sử
có hai thực thể tham gia liên lạc được gọi là 𝐴 và 𝐵. Hai thực thể 𝐴 và 𝐵 phải chia
sẻ một khóa bí mật chung 𝑘. Khi 𝐴 cần gửi một thông báo cho 𝐵, thì , 𝐴 tính mã
xác thực thông báo như một hàm của thông báo và khóa:
𝑀𝐴𝐶 = 𝑀𝐴𝐶(𝑘, 𝑥)
Trong đó: 𝑥 là thông điệp đầu vào, 𝑘 là khóa bí mật đã chia sẻ, MAC là mã xác
thực thông báo. Thông báo được nối với giá trị MAC và được truyền cho người nhận.
Người nhận xác thực thông báo này bằng cách tính lại MAC từ thông báo 𝑥 nhận
được bằng khóa bí mật 𝑘 đã chia sẻ, sau đó so sánh với MAC nhận được kèm theo
thông báo. Nếu hai giá trị này giống nhau thì thông báo được xác thực. Do chỉ có
người gửi và người nhận biết khóa bí mật 𝑘, do đó không ai khác có thể tạo được
11


MAC hợp lệ. Hơn nữa, bất kỳ việc sửa đổi thông báo ban đầu cũng sẽ tạo ra một
MAC khác và nó sẽ không được xác thực.
Mã xác thực thông báo dựa trên hàm băm (Hash based Message Authentication
Code-HMAC): Một hàm băm (như SHA) không được thiết kế để sử dụng như một

hàm MAC và không thể được sử dụng trực tiếp cho mục đích xác thực thông báo, vì
nó không dựa trên một khóa bí mật. Đã có một số đề xuất cho sự kết hợp của một
khóa bí mật vào một thuật toán băm hiện tại. Cách tiếp cận này tạo ra một hàm MAC
và được ký hiệu là HMAC. HMAC đã được sử dụng trong một số ứng dụng an toàn
như IPSEC, SSL… và HMAC cũng đã được ban hành như một tiêu chuẩn NIST
(FLIP 198).

1.3. Các ứng dụng cơ bản của hàm băm mật mã
Hàm băm mật mã được đánh giá là một thuật toán mật mã linh hoạt nhất. Nó
được sử dụng trong nhiều ứng dụng an toàn và các giao thức Internet. Sau đây là
một số ứng dụng quan trọng của hàm băm mật mã:
Xác thực thông báo: Xác thực thông báo làm một cơ chế được sử dụng để
xác thực tính toàn vẹn của một thông báo. Xác thực thông báo đảm bảo rằng dữ
liệu nhận được là chính xác giống như khi nó được gửi (tức là không bị sửa đổi,
chèn, xóa hay phát lại), và trong nhiều trường hợp định danh của người gửi là
được bảo vệ. Khi một hàm băm được sử dụng để cung cấp cơ chế xác thực thông
báo, giá trị hàm băm thường được gọi là một mã băm. Có một số phương pháp sử
dụng mã băm để cung cấp cơ chế xác thực thông báo như hình 1.3:
Theo Hình 1.3 (a): hai thực thể liên lạc 𝐴 và 𝐵 có một khóa bí mật 𝐾 đã chia
sẻ. Khi 𝐴 cần gửi một thông báo cho 𝐵, thì 𝐴 tính mã băm 𝐻 = 𝐻(𝑀). Mã băm
được nối vào thông báo 𝑀 và được mã hóa bằng khóa bí mật 𝐾 để tạo bản mã
𝐸G (𝑀||𝐻 (𝑀)) truyền cho 𝐵. Người nhận 𝐵 xác thực thông báo này như sau: trước
tiên 𝐵 giải mã bản mã nhận được bằng khóa bí mật 𝐾 đã chia sẻ, sau đó tính lại
mã băm từ thông báo 𝑀 và so sánh với mã băm nhận được kèm theo thông báo.
Nếu hai giá trị này giống nhau thì thông báo được xác thực. Do chỉ có người gửi
𝐴 và người nhận 𝐵 biết khóa bí mật 𝐾, do đó thông báo phải đến từ 𝐴 và không
12


bị sửa đổi trái phép. Trong lược đồ này, mã băm được sử dụng để đảm bảo tính

xác thực thông báo, còn hàm mã hóa 𝐸 được sử dụng để đảm bảo tính bí mật của
thông báo.
Người gửi A

Người nhận B

M

||

E

H

M

D

So sánh

H

K

(a)

M

K


H

H(M)

H

M

||

K
So sánh

E

D

EK ( H ( M ) )

(b)

M

||

M

K

EK ( M || H ( M ))


H

||

S

So sánh
S

||

H

H(M||S)
(c)

||

M

E

D

K

K

M


S

||

H
So sánh

S
(d)

||

H

H(M||S)
EK ( M || H ( M || S ))

Hình 1.3: Mô hình sử dụng hàm băm để xác thực thông báo
Theo Hình 1.3 (b), duy nhất mã băm được mã hóa bằng mật mã khóa bí mật.
Điều này sẽ làm giảm gánh nặng xử lý cho những ứng dụng không cần giữ bí mật
thông báo, mà chỉ cần đảm bảo tính toàn vẹn của thông báo.
Theo Hình 1.3 (c), duy nhất hàm băm được sử dụng để xác thực thông báo. Kỷ
thuật này yêu cầu hai thực thể liên lạc 𝐴 và 𝐵 phải chia sẻ một tham số bí mật 𝑆. 𝐴
tính giá trị băm trên 𝑀 và 𝑆 như sau: 𝐻 = 𝐻(𝑀||𝑆) và bổ sung vào thông báo gửi
cho 𝐵. Do 𝐵 cũng có tham số bí mật 𝑆 nên có thể tính lại giá trị băm để xác thực.
13


Hơn nữa, tham số bí mật 𝑆 không được gửi đi nên đối phương không thể sửa đổi

thông báo mà không bị phát hiện.
Theo Hình 1.3 (d), một hàm mã hóa khóa bí mật được bổ sung vào sơ đồ trên để
đảm bảo thêm tính bí mật của thông báo.
Chữ ký số: Chữ ký số là một chuỗi số, kết quả của phép biến đổi mật mã trên
thông báo nhằm cung cấp một phương tiện để triển khai tính xác thực của nguồn gốc
thông báo, tính toàn vẹn của dữ liệu và tính không thể chối bỏ của người ký.
Khi hàm băm được sử dụng trong lược đồ chữ ký số, giá trị băm của thông báo
được mã hóa bởi một khóa riêng của người gửi. Bất kỳ ai, biết khóa công khai của
người gửi đều có thể xác thực tính toàn vẹn của thông báo. Hình 1.4 mô tả 2 phương
pháp sử dụng giá trị băm để cung cấp một chữ ký số.
M

||

PRA

H

(a)

H

M

E

PU A

So sánh


D

EPRA ( H ( M ) )
S

M

PRA

||

E

D

M

H
PU A
So sánh

H

E

(b)

K
EK (M || EPRA ( H ( M ) ))


K

D
EK ( H ( M ) )

Hình 1.4: Mô hình sử dụng hàm băm trong lược đồ chữ ký số
Các ứng dụng khác:
• Lưu trữ mật khẩu
Hầu hết các ứng dụng phần mềm ngày nay đều có chứng thực người sử dụng.
Nghĩa là để sử dụng ứng dụng, người sử dụng phải qua một cơ chế chứng thực
tên người sử dụng và mật khẩu.
14


Giả sử mật khẩu được lưu giữ dưới dạng thông thường, không mã hóa, tại một
nơi nào đó trên máy tính cá nhân hay máy chủ, trong một tập tin dữ liệu hay trong
hệ quản trị cơ sở dữ liệu. Như vậy sẽ xuất hiện một nguy cơ là một người khác có
thể mở được tập tin dữ liệu hoặc cơ sở dữ liệu, và xem trộm được mật khẩu. Như
vậy mật khẩu không thể được giữ bí mật tuyệt đối.
Phương pháp bảo vệ mật khẩu hiệu quả nhất hiện nay là dùng hàm băm. Khi
người sử dụng đăng ký mật khẩu, giá trị băm của mật khẩu được tính bằng một
hàm băm nào đó (SHA-1, SHA-2…) Giá trị băm đươc lưu trữ vào tập tin hay cơ
sở dữ liệu. Vì hàm băm là một chiều, nên dù biết được giá trị băm và loại hàm
băm, kẻ tấn công cũng không thể suy ra được mật khẩu. Khi người sử dụng đăng
nhập, mật khẩu đăng nhập được tính giá trị băm và so sánh với giá trị băm đang
lưu trữ. Do tính chống trùng, chỉ có một mật khẩu duy nhất có giá trị băm tương
ứng, nên không ai khác ngoài người sử dụng có mật khẩu đó mới có thể đăng nhập
ứng dụng.

m


Tính giá trị băm

h

Lưu trữ

a) Lưu trữ mật khẩu
Lưu trữ
h
m ¢



Tính giá trị băm

So sánh

b) Chứng thực mật khẩu, theo tính chống
trùng, nếu h ' = h thì m ' = m

Hình 1.5: Chứng thực mật khẩu, theo tính chống trùng,
nếu ℎ+ = ℎ thì 𝑚+ = 𝑚

15


• Ứng dụng tải dữ liệu trên mạng
Khi chúng ta tải dữ liệu trên mạng, nếu chất lượng mạng không tốt thì có thể
xảy ra lỗi trong quá trình tải làm cho tập tin tại máy khách khác với tập tin trên

máy chủ.
Hàm băm có thể giúp chúng ta phát hiện ra những trường hợp lỗi như vậy
bằng cách sau: Gọi tập tin cần tải xuống trên máy chủ là 𝑋, và giá trị băm theo
MD5 của tập tin 𝑋 mà máy chủ đã tính sẵn và cung cấp trên trang điện tử là 𝐻T
(có thể xem bằng mắt). Gọi 𝑌 là tập tin mà người sử dụng tải được tại máy tính
sử dụng. Người sử dụng sẽ tính giá trị MD5 𝐻U cho tập tin 𝑌. Như vậy nếu 𝐻T
trùng khớp với 𝐻U thì theo tính chống trùng của hàm băm, tập tin 𝑌 hoàn toàn
giống tập tin 𝑋 và quá trình tải xuống không xảy ra lỗi.

Internet

Hình 1.6: Ứng dụng hàm băm khi tải dữ liệu trên mạng

16


1.4. Giới thiệu một số họ hàm băm phổ biến
Đã có rất nhiều hàm băm được công bố và được sử dụng trong thực tế (bao
gồm cả các hàm băm có khóa và các hàm băm không có khóa). Bảng 1.1 cho
chúng ta một số hàm băm với các thông số tương ứng:
Thuật

Kích

Kích

Kích

Kích


Kích

Độ an

toán

thước đầu

thước đầu

thước

thước

thước

toàn (bit)

vào (bit)

ra (bit)

trạng thái

khối (bit)

word (bit)

trong (bit)
MD4


< 2VW

128

128

512

32

64

MD5

< 2VW

128

128

512

32

64

SHA-1

< 2VW


160

160

512

32

80

SHA-256

< 2VW

256

256

512

32

128

SHA-384

< 236X

384


512

1024

64

192

SHA-512

< 236X

512

512

1024

64

256

Bảng 1.1: Một số hàm băm phổ biến và thông số tương ứng


Hàm băm MD5
Ronald Rivest là người đã phát minh ra các hàm băm MD2, MD4 (1990) và

MD5 (1991). Hàm băm MD5 được phát triển lên từ MD4 và trước đó là MD2, là

một cải tiến của MD4 và là hàm băm được sử dụng rất rộng rãi, nguyên tắc thiết
kế của hàm băm MD5 là nguyên tắc chung cho rất nhiều hàm băm khác.
Hàm băm MD5 nhận thông báo đầu vào có độ dài tối đa 2VW bit. Thông báo
này được thực hiện đệm sau đó chia thành các khối con với độ dài 512 bit. Các
khối con 512 bit này sẽ là đầu vào của thuật toán băm, bên trong thuật toán mỗi
khối 512 bit lại được chia ra 16 khối 32 bit và đi qua bốn vòng lặp của MD5.
Mỗi khối thống báo con 512 bit qua xử lý sẽ cho đầu ra là một khối 128 bit,
chính là giá trị băm của thông báo đầu vào tương ứng. Theo cấu trúc MekleDamrgard giá trị băm này sẽ là đầu vào để xử lý khối thông báo con tiếp theo.
Tiếp tục xử lý, đầu ra cuối cùng là một khối 128 bit, là giá trị băm nhận được của
thông báo đầu vào.
17


Hàm băm MD5 đã được cải tiến để khắc phục những hạn chế và những điểm
mất an toàn trong MD4. Mặc dù năm 1993, Den Boer và Bosselaers đã tìm ra các
va chạm trong việc sử dụng hàm nén của MD5, nhưng tới nay MD5 vẫn được sử
dụng rộng rãi trong các ứng dụng thực tế do độ an toàn nó mang lại vòn đủ đáp
ứng nhu cầu.


Họ các Hàm băm SHA
Thuật toán băm an toàn (SHA) đã được NIST và NSA thiết kế xây dựng. Sau

đó được NIST đề xuất làm chuẩn hàm băm an toàn (SHS) bao gồm các thuật toán
băm: SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 và SHA-3.
Các thuật toán hàm băm SHA gồm 2 bước: tiền xử lý và tính toán giá trị băm.
Bước tiền xử lý bao gồm các thao tác:
- Mở rộng thông báo.
- Phân tích thông báo đã mở rộng thành các khối 𝑚-bit
- Khởi tạo giá trị băm ban đầu.

Bước tính toán giá trị băm bao gồm các thao tác:
- Làm 𝑁 lần các công việc sau:
+ Tạo bảng phân bố thông báo (message schedule) từ khối thứ 𝑖.
+ Dùng bảng phân bố thông báo cùng với các hàm, hằng số, các thao
tác trên word để tạo giá trị băm 𝑖.
- Sử dụng giá trị băm cuối cùng để tạo thông báo rút gọn.
Thông báo 𝑀 được đệm thêm các bit theo quy tắc đệm trước khi thực hiện
băm, nhằm đảm bảo thông báo đầu vào cho thuật toán băm có độ dài là bội số 512
hoặc 1024 bit, tùy thuộc vào thuật toán băm.
Tiếp theo thông báo sẽ được phân tích thành 𝑁 khối 𝑚 bit. Đối với các hàm
băm SHA-1, SHA-256 giá trị 𝑚 là 512 bit, và đối với các hàm băm SHA-384 và
SHA-256 thì 𝑚 là 1024 bit. Những khối thông báo con này sẽ là đầu vào cho thuật
toán băm.
18


1.5. Một số kiểu tấn công lên hàm băm mật mã
1.5.1. Tấn công dựa trên “Nghịch lý ngày sinh”
Giả sử ℎ: 𝑋 → 𝑍 là một hàm băm; 𝑋, 𝑍 hữu hạn và giả sử |𝑋| ≥ 2|𝑍|. Đặt
|𝑋| = 𝑚, |𝑍| = 𝑛. Nếu chọn ngẫu nhiên 𝑟 phần tử khác nhau từ tập 𝑋 là
𝑥3 ,𝑥6 ,…𝑥[ rồi tính 𝑍3 = ℎ(𝑥3 )…𝑍[ = ℎ(𝑥[ ), sau đó xác định xem có xảy ra
đụng độ hay không, nghĩa là xem có tồn tại 𝑥0 , 𝑥\ (𝑖 ≠ 𝑗) thỏa mãn ℎ (𝑥0 ) =
ℎ(𝑥\ ) hay không.
Áp dụng kết quả của bài toán ngày sinh nhật đã biết ta có: Nếu các mã
băm 𝑍 = ℎ(𝑥) có độ dài 64 bit, tức là 𝑛 = 2VW và nếu chọn 𝑟 ≈ √𝑛 = 2`6 thì
xác suất gặp đụng độ sẽ là 50%.
Việc sản sinh ra 𝑟 = 2`6phần tử 𝑍3 ,𝑍6 ,…𝑍[ nằm trong khả năng tính toán
thực tế nên bài toán ngày sinh chỉ ra cho ta thấy rằng việc dùng mã băm có độ dài
64 bit là không an toàn.
Với hàm băm cụ thể như SHA-1, độ dài đầu ra của mã băm là 160 bit, nên

nếu chọn 2X9 giá trị băm thì xác suất gặp đụng độ là 50%, các nhà mã thám luôn
mong muốn tìm ra một tấn công lên SHA-1 với độ phức tạp dưới 2X9 phép toán
băm (gọi là giới hạn lý thuyết cho hàm băm độ dài 160 bit), năm 2005 ba nhà
khoa học Trung Quốc Xiaoyun Wang, Yiqun Lisa Yin và Hongbo Yu đã giới
thiệu một phương pháp tìm va chạm của hàm băm SHA-1 với độ phức tạp tính
toán nhỏ hơn 2Va phép toán băm.
1.5.2. Phương pháp tấn công gặp nhau ở giữa (meet in the middle attack)
Giả sử chúng ta dùng hàm băm có độ dài giá trị băm là 𝑚 bit.
Kẻ tấn công muốn đưa thông báo 𝑀 để A ký, nhưng A không muốn ký. Trong
khi đó, A sẵn sàng ký thông báo 𝑀+ . Kẻ tấn công sản sinh ra 2b⁄6 biến thể khác
nhau của M (có nội dung thống nhất) và 2b⁄6 biến thể khác nhau của 𝑀+ .
Hai tập thông báo đó được so sánh để tìm ra cặp có cùng mã băm. Xác suất
thành công của phương pháp này đã được chứng minh là khoảng 86%.

19


Kẻ tấn công sau khi tìm được cặp 𝑀0 và 𝑀\+ có cùng giá trị băm sẽ đưa 𝑀\+ cho
A ký, và gửi 𝑀0 cùng chữ ký này cho người nhận Người nhận chắc chắn tin tưởng
vào chữ ký đó sau khi đã kiểm tra cẩn thận.
Nếu 𝑚 = 64 bit thì 2b⁄6 = 2`6 giá trị này nằm trong khả năng tính toán. Vì
vậy kẻ tấn công rất dễ đạt được mục đích.
Trên đây ta thấy độ dài của mã băm rất quan trọng. Độ dài giá trị băm 64 bit
là không an toàn. Đó là lý do vì sao các hàm băm có ứng dụng thực tế đều có độ
dài đầu ra từ 128 bit trở lên.
1.5.3. Tấn công vét cạn
Trong khoa học máy tính tấn công vét cạn là phương thức tấn công tổng quát
nhất, nội dung chính của kiểu tấn công này trong việc tấn công hàm băm là:
Kẻ tấn công có trong tay giá trị băm ℎ(𝑚) của thông điệp 𝑚 với độ dài là 𝑛
bit, thực hiện chọn ngẫu nhiên một thông điệp 𝑚+ và tính xem ℎ(𝑚+ ) = ℎ(𝑚) hay

không, nếu chúng bằng nhau có nghĩa là kể tấn công đã thành công, còn nếu không
thì kẻ tấn công tìm một bức thông điệp khác và tính giá trị băm cho đến khi tìm
được va chạm. Giả sử mã băm là một biến ngẫu nhiên có phân phối chuẩn thì xác
suất để tìm được thông điệp 𝑚+ thỏa mãn là 1⁄2L .
Ta thấy kiểu tấn công này không phụ thuộc vào cấu trúc của hàm băm hay
chiều dài thông điệp đầu vào mà nó chỉ phụ thuộc vào chiều dài đầu ra của hàm
băm, do đó để nâng cao tính bảo mật chúng ta cần cho đầu ra càng lớn thì tính bảo
mật càng cao. Tuy nhiên cách tấn công này không hiệu quả vì không gian đầu vào
quá lớn, trong trường hợp xấu nhất thuật toán duyệt qua tất cả các đầu vào có thể
để tìm được va chạm, điều này là không thể.
Yêu cầu tài nguyên cho việc tấn công này bùng nổ tổ hợp với chiều dài đầu
ra của hàm băm, như vậy có nghĩa là nếu ta tăng chiều dài đầu ra càng lớn thì khả
năng để tấn công thành công càng thấp, gọi chiều dài đầu ra là 𝑛 bit thì có thể
chúng ta cần thử tới 2L lần để tìm được một tấn công thành công.

20


Chương II: Thuật toán SHA-256
2.1. Tổng quan về SHA
SHA (Secure Hash Algorithm) là thuật toán băm an toàn dùng để chuyển
một đoạn dữ liệu nhất định thành một đoạn dữ liệu có chiều dài không đổi với
xác suất khác biệt cao.
Thuật toán SHA được gọi là an toàn vì theo chuẩn FIPS 180-2 phát hành
ngày 1 tháng 8 năm 2002:
• Cho một giá trị băm nhất định được tạo nên bởi một trong những thuật toán
SHA, việc tìm lại được đoạn dữ liệu gốc là không khả thi.
• Việc tìm được hai đoạn dữ liệu nhất định có cùng kết quả băm tạo ra bởi
một trong những thuật toán SHA là không khả thi.
• Bất cứ thay đổi nào trên đoạn dữ liệu gốc, dù nhỏ, cũng sẽ tạo nên một giá

trị băm hoàn toàn khác với xác suất rất cao.
SHA gồm 5 thuật toán là SHA-1 (trả lại kết quả dài 160 bit), SHA-224 (trả
lại kết quả dài 224 bit), SHA-256 (trả lại kết quả dài 256 bit), SHA-384 (trả
lại kết quả dài 384 bit) và SHA- 512 (trả lại kết quả dài 512 bit).
Các tính chất của các thuật toán băm an toàn:
Kích thước (đơn vị bit)
Thuật toán

Độ an toàn
Thông điệp

(đơn vị:

rút gọn

bit)

Thông điệp

Khối

Từ

SHA-1

< 264

512

32


160

80

SHA-224

< 264

512

32

224

112

SHA-256

< 264

512

32

256

128

SHA-384


< 2128

1024

64

384

192

SHA-512

< 2128

1024

64

512

256

21


2.2. SHA-256
SHA-256 cùng với SHA-224, SHA-384 và SHA-512 là bốn giải thuật
thuộc họ SHA và gọi chung là SHA-2. Về giải thuật, các biến thể của SHA-2
không khác nhau. Mặc dù chúng sử dụng giá trị biến và hằng số cũng như độ

dài từ,… khác nhau.
Hiệu suất của SHA-256 phụ thuộc vào độ dài của thông điệp băm.
2.2.1 Ứng dụng của SHA-256
Hàm băm SHA-256 được triển khai trong một số ứng dụng và giao thức
bảo mật được sử dụng rộng rãi, bao gồm TLS và SSL, PGP, SSH, S/MIME
và IPsec
SHA-256 tham gia vào quá trình xác thực các gói phần mềm Debian và
trong tiêu chuẩn ký tin nhắn DKIM. Các nhà cung cấp Unĩ và Linux đang
chuyển sang SHA-256 để băm mật khẩu an toàn.
Bitcoin sử dụng SHA-256 cho việc xác minh giao dịch và tính toán.
2.2.2 Các bước làm việc trong SHA-256
SHA-256 hoạt động giống như MD4, MD5 và SHA-1. Gồm 2 bước cơ bản:
• Bước 1: Tiền xử lý
Ø Mở rộng thông điệp
Thông điệp M được mở rộng trước khi thực hiện băm. Mục đich của việc mở
rộng này là để đảm bảo rằng thông điệp mở rộng có độ dài là bội số của 512.
Giả sử độ dài của thông điệp M là l bit. Thêm bit 1 vào cuối thông điệp,
theo sau là k bit 0 (k là số không âm nhỏ nhất sao cho l + 1 + k ≡ 448(mod512)).
Sau đó thêm khối 64 bit biểu diễn nhị phân của l.
Ví dụ: thông điệp “abc”(8 bit ASCII) có độ dài 8 × 3 = 24. Thêm bít 1 vào
cuối và 448 – (24+1) =423 bit 0. Cuối cùng là thêm độ dài của thông điệp.
Lúc này độ dài thông điệp mở rộng sẽ là 512 bit.
01100001 01100010 01100011 1

22


Ø Phân tích thông điệp
Sau khi thông điệp đã được mở rộng, thông điệp cần được phân tích thành
N khối 512 bit: M(1), M(2),…, M(N). Mỗi khối này lại được chia thành 16 từ 32

bit.M0(i) chứa 32 bit đầu của khối i, M1(i) chứa 32 bit tiếp theo,…
Ø Giá trị băm khởi tạo H(0) là chuỗi 8 từ 32 bit ở dạng hexa. Những từ này thu
được bằng cách lấy 32 bit đầu tiên của các phần tử thập phân của căn bậc hai
của tám số nguyên tố đầu tiên.
= 6a09e667
= bb67ae85
= 3c6ef372
= a54ff53a
= 510e527f
= 9b05688c
= 1f83d9ab
= 5be0cd19

• Bước 2: Tính toán giá trị băm
Việc tính toán giá trị băm được thực hiện như sau:
For i = 1 to N (N là số khối của thông điệp mở rộng)
{
Ø Khởi tạo a,b,c,d,e,f,g,h với giá trị băm trung gian thứ (i-1) (= giá trị
băm ban đầu khi i =1)
a⃪
b ⃪

h ⃪
23


Ø Áp dụng chức năng nén của SHA-256 để cập nhật các biến
a,b,c,d,e,f,g,h For j = 0 to 63
{
Tính Ch(e,f,g), Maj(a,b,c),

T1 ⃪ h +

,

+ Kj + Wj

T2 ⃪

+ M a j(a,b,c)

h⃪ g
g⃪ f
f ⃪e
e ⃪ d + T1
d⃪ c
c⃪b
b⃪a
a ⃪ T1 + T2
}
Ø Tính toán giá trị băm trung gian thứ i, H(i)

⃪ a+
⃪ b+




⃪ h +




}
24

và Wj


H(N) = (

,

,…,

) là mã băm của thông điệp M

Định nghĩa hàm sử dụng trong SHA-256: Mỗi hàm hoạt động theo 1 từ 32 bit có
đầu ra là 1 từ 32 bit. Các hàm được định nghĩa như sau:
Ch(x,y,z) = (x ⋀ y) Å (¬x ⋀ z)
Maj(x,y,z) = (x ⋀ y) Å (x ⋀ z) Å (y ⋀z)
= R2(x) Å R13 (x) Å R22(x)
= R6(x) Å R11 (x) Å R25(x)
s0(x)= R7(x) Å R18(x) Å S3(x)
s1(x)= R17(x) Å R19(x) Å S10(x)
Trong đó:
Å : phép XOR
⋀ : phép AND
¬ : phép phủ định
+ : phép cộng modul 232
Rn : quay phải n bit
Sn : dịch phải n bit

Các khối thông điệp W0, W1,…, W63 được tính toán như sau:
Wj =

for j = 0,1,…,15

và For j = 16 to 63
{
Wj s1(Wj-2) + Wj + s0(Wj-15) + Wj-16
}
25


×