Tải bản đầy đủ (.doc) (25 trang)

hàm băm mật mã và mô hình random oracle

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 (595.52 KB, 25 trang )

HỌC VIỆN KỸ THUẬT QUÂN SỰ
KHOA CÔNG NGHỆ THÔNG TIN
O0O
BÀI TẬP MÔN LÝ THUYẾT MẬT MÃ
VÀ BẢO MẬT THÔNG TIN
Tên đề tài: Hàm băm mật mã và mô hình random oracle
Giáo viên hướng dẫn: PGS. TS Nguyễn Hiếu Minh
1
MỤC LỤC
Lời giới thiệu
I. Mô hình random oracle
ượớệở !"#"ộ
ọ$ưởộ%
1. Tổng quan về mô hình
2. Nguyên lý lồng chim
Nếu có n lồng chim bồ câu chứa n+1 con chim bồ câu, thì ít nhất một lồng
chim có chứa 2 con chim. Theo nguyên tắc lồng chim bồ câu nếu có n lồng chim
2
thì chứa kn+1 con chim, vậy nếu có n lồng chim bồ câu thì ít nhất một lồng chứa
k+ 1 con chim.
Giả sử rằng các thông điệp trong một hàm băm là chiều dài 6 bit và bản rút
gọn (digest) chỉ còn 4 bit. Sau đó, số lượng có thể của digest (pigeonholes) là 24
= 16, và số lượng có thể của thông điệp (bồ câu) là 26 = 64. Điều này có nghĩa
là n = 16 và kn + 1 = 64, do đó k là lớn hơn 3. Kết luận là có ít nhất một digest
tương ứng với bốn (k + 1) thông điệp.
3. Bài toán ngày sinh
Nếu kích thước của hàm Hash nhỏ, thì có thể tìm được 2 văn bản có cùng giá trị
hàm băm, tức là có va chạm mà không phụ thuộc vào số lượng biến đổi của hàm, cách
tấn công này có tên ngày sinh nhật. Ý tưởng của phương pháp tấn dựa trên bài toán
ngày sinh nhật sau. Cần phải chọn một nhóm bao nhiêu người để xác suất hai người có
cùng ngày sinh nhật là 0.5? Vấn đề ở chổ là xác suất trùng ngày sinh nhật đối với một


cặp ngẫu nhiên là p’=1/365, còn trong nhóm gồm n người có
2
2/)1( nnn ≈−
cặp khác
nhau. Từ đây dể dàng nhận được đánh giá gần đúng. Xác suất để tồn tại ít nhất một
cặp có cùng ngày sinh là
2/'
2
npp =
, từ đây p=1/2 thì chúng ta thu được
'/1 pn ≈
.
Chúng ta xem sử dụng bài toán ngày sinh nhật để tìm va chạm trong hàm Hash như
thế nào. Giả sử cho H là hàm Hash với kích thước đầu ra là m bít. Chúng ta có N bản
tin khác nhau
NiM
i
1,
)(
=
, tính toán giá trị băm của các bản tin này, giá trị tương ứng
3

)(i
H
. Nếu như hàm Hash là hàm biến đổi giả ngẫu nhiên thì dễ dàng tính được xác
suất sao cho giữa N giá trị
)(i
H
không tìm được hai như nhau.

Đầu tiên chúng ta xem đánh giá dựa trên tính toán gần đúng, sao cho số lượng va
chạm là đủ nhỏ. Chúng ta chọn một số giá trị
)1(
H
. Xác suất để nó không trùn với các
phần còn lại là
1)1(
)21(
−−
−≈
Nm
P
.
Tiếp tục chọn một số giá trị mới
)2(
H
. Xác suất để nó không trùng với phần còn lại

2)2(
)21(
−−
−≈
Nm
P
.
Chúng ta chọn tương tự như vậy đối với giá trị mới của hàm Hash, trong bước thứ I
chúng ta thu được xác suất không trùng là
iNmi
P
−−

−≈ )21(
)(
Tất cả chúng ta cần thực hiện N-1 bước kiểm tra không trùng. Xác suất để không
một giá trị trong chúng không trùng là:

−=−⋅⋅−⋅⋅−⋅−≈
−−−−−−−−
)21()21( )21( )21()21(
21' mmiNmNmNm
P
Với

−=−+++= 2/)1()1( 21 NNN
.
Xác suất tìm thấy va chạm là

−−−−
⋅≈⋅−−≈

−−=−=
12
2)21(1)21(1'1
mmm
Npp
.
Với xác suất va chạm là ½ thì ta có biểu thức:
2/12
12
=⋅
−−m

N
,
Từ đây chúng ta xác định gía trị N
1/2
:
m
N 2
2/1

.
Chúng ta xem tính cách tính chính xác hơn xác suất tìm va chạm trong tập hợp
NiH
i
1,
)(
=
, có thể nhận được bằng cách rất đơn giản sau. Chúng ta chọn
)2(
H
. Xác
suất để
)2(
H
không trùng
)1(
H

)21(
)2( m
p


−=
. Tiếp tục chọn
)3(
H
. Xác suất để
)3(
H
không trùng với
)2(
H

)1(
H
, với điều kiện
)1(
H

)2(
H
không trùng nhau là
)221)(21(
)3( mm
p
−−
⋅−−=
. Một cách tương tự, chúng ta xác định xác suất
)(N
p
để

)(N
H
không trùng với một trong các giá trị
)1(
H
,
)2(
H
,…,
)1( −N
H
, với điều kiện là các giá trị
)1(
H
,
)2(
H
,…,
)1( −N
H
khác nhau từng đôi một. Chúng ta nhận được
4
]2)1(1[
)1()3()2()( mNN
Npppp
−−
⋅−−⋅⋅⋅⋅=
. Như vậy giá trị chính xác của xác suất
không có sự va chạm là:



=
−−−−−
⋅−=⋅−−⋅⋅⋅−−⋅⋅⋅−⋅−==
1
1
)(
)21(]2)1(1[ ]2)1(1[ )221()21('
N
i
mmmmmN
iNipp
.
Từ đây chúng ta xác định xác suất có sự va chạm là p=1-p’. Áp dụng công thức gần
đúng
x
ex

≈−1
. Chúng ta thu được:
]2)1(exp[)2exp()2exp()21('
1
1
1
1
1
1
1
−−


=


=


=

⋅−−=⋅−=⋅−≈⋅−=

∏∏
m
N
i
m
N
i
m
N
i
m
NNiiip
.
Xac suất tồn tại ít nhất một va chạm là:
]2)1(exp[1'1
1−−
⋅−−−=−≈
m
NNpp
.

Từ đây ta dể dạng nhận được điều sau:









≈+
+
p
NN
m
1
1
ln2
12
,
Hay











+
p
N
m
1
1
ln2
12
,










+
p
N
m
1
1
ln2
1
.
Với p=1/2 chúng ta có

m
N 217.1
2/1

. Chúng ta thấy kết quả ở phương án tính này
chính xác hơn phương án đầu tiên. Và từ công thức này chúng ta thấy, trong số 23
người chọn ngẫu nhiên thì có ít nhất một cặp trùng ngày sinh với xác suất là ½. Như
vậy để thực hiện tấn công thì cần bộ nhớ là
m
m 2/
217.1 ⋅
bít và cần thực hiện
2/
217.1
m

tính toán hàm Hash và thực hiện sắp xếp
2/
217.1
m

số. Và từ đây chúng thấy rằng nếu
như m không đủ lớn thì sẽ dễ dàng tìm ra được số lượng bản tin mà có sự va chạm.
Với công nghệ hiện nay thì đòi hỏi
128≥m
bít.
4. Tấn công trên mô hình random oracle
Hàm băm được xem là hàm một chiều khi cho trước giá trị băm, không thể tái
tạo lại thông điệp ban đầu, hay còn gọi là “tiền ảnh” (“pre-image”). Như vậy, trong
trường hợp lý tưởng, cần phải thực hiện hàm băm cho khoảng 2

n
thông điệp để tìm ra
được “tiền ảnh” tương ứng với một giá trị băm.
Nếu tìm ra được một phương pháp tấn công cho phép xác định được “tiền ảnh”
tương ứng với một giá trị băm cho trước thì thuật toán băm sẽ không còn an toànnữa.
5
Cách tấn công nhằm tạo ra một thông điệp khác với thông điệp ban đầu nhưng
có cùng giá trị băm gọi là tấn công “tiền ảnh thứ hai” (second pre-image attack).

Hình Tiêu chuẩn của hàm băm mật mã
Cách tấn công Tiền ảnh 1:
Giả sử y = h(M) , tìm M’ sao cho y = h(M’)
Trong đó: M: là Thông điệp
H : là hàn băm
H(M): là bản thông điệp rút gọn
5. Tấn công trên cấu trúc
II. Hàm băm mật mã
Hình Mô hình tấn công tiền ảnh 1
Thuật toán: Tiềm ảnh 1
Preimage_Attack(D)
{
For (i = 1 to k)
{
Create (M[i])
T ← h(M[i])
If (T = D) return M[i]
}
Return failure
}
Những khó khăn của một cuộc tấn công tiền ảnh 2 có tỉ lệ với 2

n
Một hàm băm mật mã sử dụng một digest của 64 bit. Có bao nhiêu digest
không Eve cần tạo để tìm ra thông báo ban đầu với xác suất hơn 0,5?
Số lượng digest được tạo ra là k ≈ 0,69 × 2n ≈ 0,69 × 264. Đây là một số lượng
lớn. Ngay cả khi Eve có thể tạo ra 230 (gần một tỷ đồng) tin nhắn mỗi thứ hai, nó mất
0,69 × 234 giây hoặc hơn 500 năm. Điều này có nghĩa rằng một thông điệp tiêu hóa
của kích thước 64 bit là an toàn đối với preimage tấn công với, nhưng, như chúng ta sẽ
thấy ngay, không được bảo đảm để tấn công va chạm.
Hoàn tác chỉnh sửa
Cách tấn công Tiền ảnh 2:
6
Tiêu chuẩn của
Hàm băm mật mã
Tiền ảnh 1 Tiền ảnh 2 Đụng độ
Giả sử cho M và H(M) , tìm M’ ≠ M sao cho h(M) = H(M’)
Hình Mô hình tấn công tiền ảnh 2
Thuật toán: tiền ảnh 2
Second_Preimage_Attack(D,M)
{
For (i = 1 to k-1)
{
Create (M[i])
T ← h(M[i])
If (T = D) return M[i]
}
Return failure
}
Những khó khăn của một cuộc tấn công tiền ảnh 2 có tỉ lệ với 2
n
Cách tấn công Đụng độ: Tìm M’ ≠ M sao cho h(M) = h(M’)

Thuật toán: Đụng độ
Collision_Attack(D,M)
{
For (i = 1 to k)
{
Create (M[i])
D[i] ← h(M[i])
for (j = 1 to i-1)
{
7
if (D[i] = D[j] return M[i] and M[j])
}
}
Return failure
}
Những khó khăn của một cuộc tấn công đụng độ có tỉ lệ với 2
n/2
.
Một hàm băm mật mã sử dụng một digest của 64 bit. Có bao nhiêu digest không
cần phải tạo ra Eve để tìm hai thông điệp với cùng digest với xác suất hơn 0,5?
Giải pháp
Số lượng digest được tạo ra là k ≈ 1,18 × 2n / 2 ≈ 1,18 × 232. Nếu Eve có thể kiểm tra
220 (gần một triệu) mỗi thông điệp thứ hai, nó mất 1,18 × 212 giây hoặc ít hơn hai
giờ. Điều này có nghĩa rằng một thông điệp digest kích thước 64 bit không được bảo
vệ chống lại các cuộc tấn công va chạm.
Xen kẽ tấn công đụng độ
Thuật toán: xen kẽ đụng độ
Alternate_Collision_Attack(M[k],M’[k])
{
For (i = 1 to k)

{
D[i] ← h(M[i])
D’[i] ← h(M’[i])
if (D[i] = D’[j] return M[i], M’[j])
}
Return failure
}
Những khó khăn của một cuộc tấn công đụng độ có tỉ lệ với 2
n/2
.
Tóm tắt các cuộc tấn công
Bảng sau cho thấy mức độ khó khăn đối với mỗi đòn tấn công nếu digest là n bit.
Attack Giá trị của khóa k với P = 1/2 Thứ tự
Preimage k ≈ 0.69 x 2
n
2
n
Second Preimage k ≈ 0.69 x 2
n
+ 1 2
n
Collision k ≈ 1.18 x 2
n/2
2
n/2
Alternate collision k ≈ 0.83 x 2
n/2
2
n/2
Các hàm băm mới, đó là khả năng để trở thành tiêu chuẩn NIST, là SHA-512,

trong đó có một 512-bit digest. Chức năng này chắc chắn là khả năng chống các cuộc
tấn công va chạm dựa trên Random Oracle Model. Nó cần 2
512/2
= 2
256
kiểm tra để tìm
thấy một vụ đụng độ với xác suất 1/2.
5. Các cuộc tấn công vào cấu trúc
8
Tấn công hàm hash theo kiểu gặp nhau ở giữa (meet – in – the – middle attack)
Phương pháp tấn công gặp nhau ở giữa áp dụng cho các hàm Hash xây dựng trên
cơ sở mã khối, mà chúng ta tìm hiểu ở phần trước. Phương pháp này cho kết quả tốt
hơn phương pháp tấn công theo ngày sinh nhật. Trong tấn công theo kiểu ngày sinh
nhật tìm được va chạm nhưng giá trị nhận được của hàm Hash đối với tìm kiếm va
chạm là ngẫu nhiên. Tấn công đầu tiên được đề xuất là tấn công trên hàm Hash xây
dựng trên cơ sở sơ đồ Rabin xem hình 11.1.
Sơ đồ này dựa trên thuật toán mã khối an toàn. Sơ đồ dựa trên ý tưởng về tính toán
phức tạp xác định khóa khi biết đầu vào và đẩu ra của khối dữ liệu. Khối dữ liệu Mi
được sử dụng như khóa tương ứng với một vòng tính toán của hàm Hash. Tìm kiếm va
chạm liên quan đến bài toán tính toán khóa. Ví dụ, tấn công có thể thay thế một số
khối M
k
thành M’
k
. Điều này dẫn đến nhận được giá trị mới của vòng hàm hash H’
k
.
Có thể tồn tại một số khóa mã M’
k+1
, mà chúng ta nhận được đẳng thức sau:

1
'
'
'
1
)(
1
++
==
+
kkMk
HHEH
k
.
Nếu như cách thám mã tìm được
1
'
+k
M
đã cho thì thay thế khối dữ liệu
k
M

1+k
M
thành
k
M '

1

'
+k
M
, tức là ta đã tìm được bản tin mới, mà có giá trị hàm Hash bằng với
giá trị hàm Hash của bản tin ban đầu. Nếu như thuật toán mã khối là vững chắc đối với
phép tấn công trên cơ sở biết bản tin, thì phép tấn công đã cho trên hàm Hash có độ
tính phức tạp cao.
Chúng ta xem cụ thể phép tấn công này. Giả sử cho bản tin M, giá trị hàm Hash
của M là H. Mục đích của phép tấn công là tìm ra bản tin khác M’ mà gía trị hàm Hash
của M’ cũng bằng H. Chúng ta chia bản tin
), ,,, ,,(
121 nkk
MMMMMM
+
=
thành hai
phần
), ,,(
21
)1(
k
MMMM =

), ,(
1
)2(
nk
MMM
+
=

. Phần đẩu tiên của bản tin được
biến dạng nhiều lần và mỗi sự biến dạng đó giá trị hàm Hash được tính bằng
)1(
H
. Giả
sử nhận được N
1
gía trị
)1(
H
từ N
1
phương án của phần thứ nhất (xem hình …). Phần
thứ hai của bản tin
)2(
M
cũng biến dạng nhiều lần, từ mỗi biến dạng đó hàm Hash được
tính theo thuật toán khác, ở đây chúng ta tính theo thứ tự ngược và sử dụng hàm giải
mã D, tương ứng vơi hàm mã hóa E (xem hình…). Giả sử thu được N
2
giá trị
)2(
H
từ
N
2
phương án của phần hai.
Khi số lượng N
1
và N

2
đủ lớn thì có thể tìm được cặp giá trị bằng nhau trong số
)1(
H

)2(
H
vớ xác suất lớn. Giả sử rằng nó tương ứng với hai bản tin là
)1(
'M

)2(
'M
. Rõ
9
ràng rằng bản tin
MMMM ≠= )','('
)2()1(
mà H(M)=H(M’). Vậy đã tìm ra được sự va
chạm. Giờ chúng ta xác định xem cần bộ nhớ và độ khó của phương pháp tấn công
này.
Chúng ta giả sử rằng N
1
và N
2
tồn tại giá trị nhỏ hơn
m
2
, m là kích thước của giá trị
băm. Như thế, với giá trị xác suất gần đúng đủ chính xác có thể tiếp nhận, sao cho giá

trị đầu tiên
)1(
H
từ tập
{ }
)1(
H
không trùng với một giá trị nào của tập
{ }
)2(
H
bằng
2
)21(
1
N
m
p

−≈
.
Xác suất để không một giá trị nào của tập
{ }
)1(
H
trùng với một giá trị của tập
{ }
)2(
H
bằng

12
)21('
NN
m
p

−≈
Như vậy xác suất để tìm ra ít nhất một cặp trùng nhau giữa tập
{ }
)1(
H
và tập
{ }
)2(
H

mm
NN
m
NNNNpp
−−−
⋅≈⋅−−≈−−=−≈ 2)21(1)21(1'1
2121
21
.
Bây giờ với điều kiện
2/12
21
=⋅
−m

NN
đốiv với trường hợp
NNN ==
21
dễ dàng
xác định giá trị N
1/2
, với xác suất va chạm là ½:
1
2/1
2


m
N
.
Để nhận được đánh giá chính xác hơn khi
2/
21
2
m
NN

==
có thể nhận gía trị
p=0.63. Như vậy cần bộ nhớ cần thiết cho phép tấn công là
1
22
−m
m

bít, độ khó tấn
công là
1
21
2
+
≈+
m
NN
.
III. Tổng quan về lý thuyết mật mã và bảo mật thông tin
Mật mã học là ngành khoa học ứng dụng toán học vào việc biến đổi thông
tin thành một dạng khác với một mục đích là che dấu nội dung, ý nghĩa thông tin
cần mã hóa.
Các ứng dụng của mật mã học và bảo mật thông tin rất đa dạng và phong
phú tùy vào đặc trưng mỗi hệ thống sẽ có những đặc trưng riêng như: Tính bảo
mật thông tin, tính toàn vẹn thông tin, Xác thực trong liên lạc và nội dung trong
liên lạc, chống lại sự thoái thác trách nhiệm.
Các phương pháp mã hóa
- Mã hóa đối xứng: Là quá trình mã hóa và giải mã một thông điệp sử
dụng cùng một mã khóa gọi là khóa bí mật hay còn gọi là khóa đối xứng. Một số
phương pháp mã hóa đối xứng như là mã hóa cổ điển, mã hóa khối
10
- Mã hóa bất đối xứng: còn được gọi là phương pháp mã hóa khóa công cộng
giúp cho việc trao đổi mã khóa trở nên dễ dàng hơn. Nội dung của khóa công
cộng (public key) không cần phải giữ bí mật như đối với khóa bí mật trong các
phương pháp mã hóa quy ước.
1. Đảm bảo tính toàn vẹn dữ liệu
Hàm băm mật mã học là hàm băm và có tính chất là hàm 1 chiều. Từ khối dữ
liệu hay giá trị băm đầu vào chỉ có thể đưa ra 1 giá trị băm duy nhất. Như chúng ta đã

biết đối với tính chất của hàm 1 chiều. Một người nào đó dù bắt được giá trị băm họ
cũng không thể suy ngược lại giá trị, đoạn tin nhắn băm khởi điểm.
Hàm băm thường được dùng trong bảng băm nhằm giảm chi phí tính toán khi
tìm một khối dữ liệu trong một tập hợp. Giá trị băm đóng vai trò gần như một khóa để
phân biệt các khối dữ liệu.
Giá trị đầu vào(tin nhắn, dữ liệu ) bị thay đổi tương ứng giá trị băm cũng bị
thay đổi. Do vậy nếu 1 kẻ tấn công phá hoại, chỉnh sửa dữ liệu thì server có thể biết
ngay lập tức.
2. Tính an toàn của hàm băm đối với hiện tượng đụng độ
Hàm băm được xem là an toàn đối với hiện tượng đụng độ khi rất khó tìm được
hai thông điệp có cùng giá trị băm.
Nhận xét: Trong một tập hợp mà các phần tử mang một trong N giá trị cho
trước với xác suất bằng nhau, chúng ta cần khoảng N phép thử ngẫu nhiên để tìm ra
một cặp phần tử có cùng giá trị.
Như vậy, phương pháp hàm băm được xem là an toàn đối với hiện tượng đụng
độ nếu chưa có phương pháp tấn công nào có thể tìm ra cặp thông điệp có cùng giá trị
hàm băm với số lượng tính toán ít hơn đáng kể so với ngưỡng 2
n/2
, với n là kích thước
(tính bằng bit) của giá trị băm.
Phương pháp tấn công dựa vào đụng độ:
- Tìm ra 2 thông điệp có nội dung khác nhau nhưng cùng giá trị băm.
- Ký trên một thông điệp, sau đó, người ký sẽ không thừa nhận đây là chữ ký
của mình mà nói rằng mình đã ký trên một thông điệp khác.
- Như vậy, cần phải chọn 2 thông điệp “đụng độ” với nhau trước khi ký.
3. Tính một chiều
Hàm băm được xem là hàm một chiều khi cho trước giá trị băm, không thể tái
tạo lại thông điệp ban đầu, hay còn gọi là “tiền ảnh” (“pre-image”). Như vậy, trong
trường hợp lý tưởng, cần phải thực hiện hàm băm cho khoảng 2
n

thông điệp để tìm ra
được “tiền ảnh” tương ứng với một giá trị băm.
Nếu tìm ra được một phương pháp tấn công cho phép xác định được “tiền ảnh”
tương ứng với một giá trị băm cho trước thì thuật toán băm sẽ không còn an toànnữa.
Cách tấn công nhằm tạo ra một thông điệp khác với thông điệp ban đầu nhưng có cùng
giá trị băm gọi là tấn công “tiền ảnh thứ hai” (second pre-image attack).
4. Cấu trúc của Hàm băm mật mã
11
Có thể chứng minh cấu trúc bảo mật của hàm băm mật mã bao gồm hai
thành phần có thể được nghiên cứu độc lập với nhau. Thành phần đầu tiên là
hàm nén mà ánh xạ một đầu vào với chiều dài cố định tới một đầu ra có chiều
dài cố định. Thành phần thứ hai của cấu trúc là miền mở rộng, đưa ra một hàm
nén, kết quả của hàm với đầu vào có độ dài tùy ý.
Compression function. Từ quan điểm của nhà lý luận, một hàm một
chiều là một thành phần cơ bản thô sơ nhất, từ đó nhiều công cụ mã hóa khác có
thể được bắt nguồn. Kết quả của một cuộc hội thảo do Simon cung cấp các bằng
chứng mạnh mẽ rằng khả năng chịu xung đột của hàm băm không thể được xây
dựng dựa trên hàm một chiều. Thay vào đó, tác giả thiết kế hàm băm chống
xung đột dựa trên một khối mã hóa thô sơ-một khối mật mã.
Một khối mật mã là một hoán vị khóa E: {0, 1}
n
x {0, 1}
k


{0, 1}
n
Về mặt kỹ thuật, Một khối mật mã dùng để nén đầu vào của nó - nó ánh
xạ k + n bit tới n bit. Tuy nhiên, Một khối mật mã thậm chí không phải là one-
way: để đảo ngược E trên w, cố định bất kỳ khoá k

0
và giải mã w dưới khoá này.
Nếu w giải mã cho ra x, sau đó E(k
0
, x) = w. Tuy nhiên, có tới 12 cấu trúc đơn
giản xây dựng dựa trên kết quả của một khối mã hoá trong một hàm nén chống
xung đột. Hai đề án thường được sử dụng nhất trong các hàm băm như sau:
Davies-Meyer: H(x, y) = E
y
(x)

y
Miyaguchi-Preneel: H(x, y) = E
x
(y)

x

y
Bằng chứng của bảo mật của những đề án này và khối mã hóa - dựa trên
giả định rằng các thuật toán mã hoá cơ bản là không thể phân biệt từ một khái
niệm trừu tượng cụ thể, gọi là mã hóa ý tưởng, vượt xa các yêu cầu bảo mật tiêu
chuẩn cho khối mã hóa.
Domain extender. Tên miền mở rộng là một cấu trúc chung mà biến đổi
một hàm nén với đầu vào có độ dài cố định vào một hàm băm với đầu vào tùy ý.
Tên miền mở rộng đơn giản và được sử dụng phổ biến nhất là cấu trúc
Merkle -Damgard và nó hoạt động như sau:
12
Cho một hàm nén C: {0, 1}
n

x {0, 1}
m


{0, 1}
n
n-bit liên tục IV.
Input: Thông điệp M
1. Break M into m-bit blocks M1,. . . ,Mk, padding if necessary;
2. Let M
k+1
be encoding of |M|;
3. Let h
0
= IV;
4. For i = 1 to k + 1 let hi = C(h
i-1
,M
i
);
5. Output h
k+1
.
Cấu trúc lặp đi lặp lại hàm nén C: output của C, cùng với khối tiếp theo
của thông điệp, trở thành đầu vào cho các ứng dụng tiếp theo của C.
Băm của khối cuối cùng, trong đó có chứa một mã hóa chiều dài của
thông điệp, là băm của toàn bộ thông điệp. Lưu trữ tạm thời đầu ra của hàm nén,
h
i
, Được gọi là chuỗi biến hoặc trạng thái nội (hình 1).


Hình 1: Cấu trúc Merkle-Damgard.
Có một sự linh hoạt nhất định trong hai bước đầu tiên của cấu trúc
Merkle-Damgard. Mã hóa bất kỳ sẽ thực hiện miễn là nó đáp ứng ba điều kiện
sau đây:
- M được mã hoá như một số nguyên của các khối m-bit.
- Mã hóa là xung đột tự do;
- Độ dài của M được đóng gói trong khối cuối cùng.
13
Cấu trúc Merkle-Damgard tương thích với dòng API, nơi một thông điệp
được cung cấp một khối tại một thời điểm vào một công cụ tìm kiếm mật mã.
Chiều dài của nó không cần phải được biết đến cho đến khi khối cuối cùng trở
nên có hiệu lực. Mặt khác, cập nhật thậm chí một bit của thông điệp có thể kích
hoạt sự ước lượng lại của toàn bộ bảng băm.
Nếu hàm nén là có khả năng chống xung đột, như vậy nó là kết quả cấu
trúc
Tuy nhiên, cấu trúc Merkle-Damgard đưa ra một hàm với nhiều cấu trúc
thuộc tính, tạo ra một số lỗ hổng bảo mật bất ngờ như minh họa trong mục 4 .
Trong thực tế, cấu trúc Merkle-Damgard là lý do quan trọng nhất giải
thích tại sao nó là sai (nguy hiểm, liều lĩnh, thiếu hiểu biết) để suy nghĩ về hàm
băm như là hộp đen. Việc cấu trúc được lặp đi lặp lại được thiết kế để đáp ứng
một mục tiêu rất khiêm tốn, đó là mở rộng tên miền của hàm chống xung đột, và
không nên mong đợi sẽ được đảm bảo bảo mật xa hơn.
1. Giới thiệu hàm băm (hash)
Đây là hàm có tham số đầu vào là văn bản có chiều dài bất kỳ và chiều ra là một
bản tóm lượt có chiều dài cố định.
Như đã nói trong phần chữ ký số, hàm hash có vai trò rất quan trọng, ngoài tránh
được sự giả mạo chữ ký, nó còn giúp cho quá trình ký diễn ra nhanh hơn rất nhiều, bởi
hàm hash có tốc độ lớn, nhưng quan trọng nhất là nó làm chữ ký ngắn đi rất nhiều điều
này có vai trò rất quan trọng trong thực tế khi làm việc với số lượng lớn các chữ ký.

Để tạo ra hàm Hash thì hàm hash phải thỏa mãn các yêu cầu sau:
1. Đối số của hàm hash là bản tin có chiều dài bất kỳ;
2. Giá trị của hàm hash có chiều dài không đổi;
3. Hàm H(x) cần phải có tính toán hiệu quả, tức là thuật toán Hash khi thực
hiện trên phần cứng và phần mềm cần phải có công suất lớn. Phải đảm bảo
được rằng quá trình ký và kiểm tra lên giá trị của hàm hash nhanh hơn so
với quá trình ký và kiểm tra trên bản thân bản tin;
4. Cho y là giá trị của hàm hash, thì khó về mặt tính toán để tìm được x thỏa
h(x)=y, tức là hàm hash phải là hàm một chiều;
14
5. Hàm hash là hàm không va chạm, tức là khi cho trước bản tin x, không thể
thực hiện được về mặt tính toán để tìm được bản x’

x sao cho h(x)=h(x’).
6. Hàm hash là hàm không va chạm mạnh, khi không thể thực hiện được về
mặt tính toán để tìm được hai bản tin x và x’, với x’

x mà h(x)=h(x’).
Cấu trúc chung của hàm băm Hash gồm các phần sau:
1. Cho trước một thông điệp M có độ dài bất kỳ. Tùy theo thuật toán được sử
dụng, chúng ta có thể cần thêm thông điệp các bit để nhận được thông điệp
có độ dài là bội số của chiều dài cố định cho trước để phục vụ cho việc tính
toán. Chia thông điệp thành từng khối có kích thước bằng nhau tức là
M=(M
1
, M
2
, …M
s
).

2. Gọi H
i
là trạng thái có kích thước n bit, n là chiều dài của giá trị hàm băm, F
là hàm nén thực hiện thao tác trộn khối dữ liệu với trạng thái hiện hành:
• Khởi tạo H
0
, bằng véc tơ khởi tạo nào đó.
• Thực hiện trộn: H
i
=F(H
i-1
,M
i
), i

[1,s].
3. Giá trị của H
s
là giá trị của hàm băm.
Nếu hàm hash được cho là bền vững, khi có một sự thay đổi bất kỳ đối số của nó
( tức là bản tin đầu vào) thì giá trị của nó cũng thay đổi ngẫu nhiên, tức là mỗi bít
trong n bít có xác suất bị thay đổi là ½. Một phương pháp tấn công đơn giản trên hàm
một chiều hash là lựa chọn bản tin sao cho giá trị hàm hash của nó bằng với giá trị
hàm hash đã cho hay nói cách khác đây là phương pháp véc cạn, chúng ta gọi số lượng
bản tin cần chọn là N mà thỏa mãn được điều trên. Chúng ta thấy xác suất để giá trị
hàm hash của một bản tin bất kỳ không trùng với giá trị H đã cho bằng
n−
− 21
, n là
chiều dài của giá trị hàm hash. Như thế xác suất để không một bản tin nào từ N bản tin

khác nhau mà giá trị của bản tin đó không trùng với H bằng
( )
N
n
p

−= 21'
. Xác suất để
tồn tại một bản tin mà giá trị hàm hash của nó bằng H cho trước là:
Nn
pp )21(1'1

−−=−=
.
Sử dụng công thức Niutơn, chúng ta nhận được giá trị gần đúng sau:
Nxx
NNN
x
NN
Nxx
N
−≈
−−


+−=− 1
!3
)2)(1(
!2
)1(

1)1(
32
, nếu như x nhỏ,
Nên chúng ta có:
n
Np

⋅≈ 2

n
pN 2⋅≈
.
&'()*+,
1
2


n
N
%-ớ.ỹậ/ệ"(01
ấ,ểựệượế,"2ủớ/%3ế
15
ư40ượ5ốớấ"ếư6
ề7.2."ếọị
128

n
%
Thuật toán hàm băm an toàn SHA
Thuật toán hàm băm an toàn SHA (Secure Hash Algorithm) được chấm nhận trong

số các chuẩn của Mỹ năm 1992 và nó được ứng dụng cùng với thuật toán chuẩn chữ
ký số DSS. Khi đầu vào là một bản tin M có chiều dài bất kỳ, đầu ra là là 160 bít rút
gọn.
Chúng ta xem làm việc của thuật toán chi tiết hơn.
Trong SHA-1 sử dụng hàm f(t, B, C, D), với 0≤t≤79; B, C và D –là các từ 32 bít.
f(t, B, C, D) = (B ∧ C) ∨ ((¬B) ∧ D) khi 0≤t≤19
f(t, B, C, D) = B ⊕ C ⊕ D khi 20≤t≤39
f(t, B, C, D) = (B ∧ C) ∨ (B ∧ D) ∨ (C ∧ D) khi 40≤t≤59
f(t, B, C, D) = B ⊕ C ⊕ D khi 60≤t≤79
và sử dụng các hằng số:
K
t
= 5A827999 khi 0≤t≤19
K
t
= 6ED9EBA1 khi 20≤t≤39
K
t
= 8F1BBCDC khi 40≤t≤59
K
t
= CA62C1D6 khi 40≤t≤79
Thuật toán Hash SHA-1 được miểu tả bởi các bước sau:
Đầu vào: bản tin có chiều dài <2
64
bít.
1) Mở rộng bản tin: thêm vào bít để chiều dài bản tin là bội của 512. Quá trình
thêm diễn ra như sau. Thêm bít 1 vào cuối bản tin, sau đó thêm vào một số bít 0
để nhận bản tin có chiều dài là đồng dư với 448 modulo 512, và cuối cùng thêm
vào 64 bít, 64bít này biểu diễn chiều dài của bản tin ban đầu. Bản tin được thêm

vào bao gồm các khối M
1
, M
2
, … , M
n
, chiều dài mỗi khối là 512 bít.
2) Khởi tạo các biến
H0 := 67452301, H1 := EFCDAB89, H2 := 98BADCFE,
H3 := 10325476, H4 := C3D2E1F0
3) i := 1
4) Chia khối M
i
thành 16 từ 32 bít w
0
, w
1
, …, w
15
.
5) Đối với các t: 16≤t≤79 w
t
:= (w
t-3
⊕ w
t-8
⊕ w
t-14
⊕ w
t-16

)<<<1, ở đây lệnh
“<<<x” là lệnh dịch trái x bít.
16
6) A := H0, B := H1, C := H2, D := H3, E := H4.
7) Đối với tất cả các t từ 0 đến 79
TEMP := (A <<< 5 + f(t, B, C, D) + E + w
t
+ K
t
) mod 2
32
;
E := D; D := C; C := B <<< 30; B := A; A := TEMP.
8) H0 := H0 + A, H1 := H1+B, H2 := H2 + C, H3 := H3 + D, H4 := H4 + E,
Tất cả các lệnh cộng theo modulo 2
32
9) Nếu i<n, thì i := i+1 và chuyển sang bước 4.
Đầu ra: bản băm rút gọn có chiều dài 160 bít là liên kết của các từ 32 bít H0 | H1 |
H2 | H3 | H4.
Chú ý83!9:;+ừ56,ữậ,ề
.ưề ơ ảậố!9:;2 ở 7".
ượ2ảụểỉ2ả,ắ<<ủếạ
.ủ!9:%
Thuật
toán
Kích thước tính theo bit
Số
chu
kỳ
Các thao

tác
Đụng
độ
Độ
an
toàn
Kết
quả
Trạng
thái
Khối
Thông
điệp
tối đa
Từ
SHA-1 160 160 512 2
64
-1 32 80
+, and, or,
xor, rotl
có 80
SHA-0 160 160 512 2
64
-1 32 80
+, and, or,
xor, rotl
2
63
thao
tác

80
SHA-
256/224
256/224 256 512 2
64
-1 32 64
+, and, or,
xor, shr, rotr
chưa
112/
128
SHA-
512/384
512/384 512 1024 2
128
-1 64 80
+, and, or,
xor, shr, rotr
chưa
192/
256

Đặc điểm của các thuật toán băm SHA
2. SHA-512
Giải thuật SHA – 1 và SHA - 512
• Secure Hash Algorithm (SHA) phát triển bởi National Institute of
Standard and Technology (NIST)
• Đầu vào: thông điệp với độ dài tối đa 264 bits
• Đầu ra: giá trị băm (message digest) có độ dài 160 bits
• Giải thuật gồm 5 bước thao tác trên các khối 512 bits

Bước 1: nhồi thêm dữ liệu
 Thông điệp được nhồi thêm các bits sao cho độ dài l ≡ 448 mod 512
hay l = n * 512 + 448 (n,l nguyên)
17
 Thông điệp luôn luôn được nhồi thêm dữ liệu
 Số bits nhồi thêm nằm trong khoảng 1 đến 512
 Phần dữ liệu nhồi thêm bao gồm một bit 1 và theo sau là các bit 0
Bước 2: thêm vào độ dài
 Độ dài của khối dữ liệu ban đầu được biểu diễn dưới dạng nhị phân 64-
bit và được thêm vào cuối chuỗi nhị phân kết quả của bước 1
 Độ dài được biểu diễn dưới dạng nhị phân 64-bit không dấu
 Kết quả có được từ 2 bước đầu là một khối dữ liệu có độ dài là bội số của
512. Khối dữ liệu được biểu diễn:
- Bằng một dãy L khối 512 - bit Y
0
, Y
1
,…, Y
L-1
- Bằng một dãy N từ (word) 32- bit M
0
, M
1
, M
N-1
. Vậy N = L x 16
Bước 3: khởi tạo bộ đệm MD (MD buffer)
 Một bộ đệm 160-bit được dùng lưu trữ các giá trị băm trung gian và kết
quả. Bộ đệm được biểu diễn bằng 5 thanh ghi 32- bit với các giá trị khởi
tạo ở dạng bigiendian (byte có trọng số lớn nhất trong từ nằm ở địa chỉ

thấp nhất) như sau:
A = 01 23 45 67
B = 89 AB CD EF
C = FE DC BA 98
D = 76 54 32 10
E = C3 D2 E1 F0
 Các giá trị này tương đương với các từ 32 -bit sau:
A = 01 23 45 67
B = 89 AB CD EF
C = FE DC BA 98
D = 76 54 32 10
E = C3 D2 E1 F0
18
Bước 4: xử lý các khối dữ liệu 512;bit
 Trọng tâm của giải thuật bao gồm 4 vòng lặp thực hiện tất cả 80 bước.
 4 vòng lặp có cấu trúc như nhau, chỉ khác nhau ở các hàm logic f1, f2, f3,
f4
 Mỗi vòng có đầu vào gồm khối 512 - bit hiện thời và một bộ đệm 160 -
bit ABCDE. Các thao tác sẽ cập nhật giá trị bộ đệm
 Mỗi bước sử dụng một hằng số Kt (0 ≤ t ≤ 79)
Kt = 5A827999 (0 ≤ t ≤ 19)
Kt = 6ED9EBA1 (20 ≤ t ≤ 39)
Kt = 8F1BBCDC (40 ≤ t ≤ 59)
Kt = CA62C1D6 (60 ≤ t ≤ 79)
 Đầu ra của 4 vòng (bước 80) được cộng với đầu ra của bước CVq để tạo
ra CVq+1
Bước 5: xuất kết quả
 Sau khi thao tác trên toàn bộ L blocks. Kết quả của khối thứ L là bảng
băm 160- bit
 Giải thuật được tóm tắt như sau:

CV0 = IV
CVq+1 = SUM32(CVq, ABCDEq)
MD = CVL
 Với
IV = giá trị khởi tạo của bộ đệm ABCDE
ABCDEq = đầu ra của hàm nén trên khối thứ q
L = số khối 512- bit của thông điệp
SUM32 = phép cộng modulo 232 trên từng từ (32 bits) của đầu vào
MD = giá trị băm
Giải thuật SHA-1 – Hàm nén
Giải thuật thực hiện tất cả 80 bước, mỗi bước được mô tả như sau:
A ← E + f(t, B, C, D) + S5(A) + Wt + Kt
B ← A
C ← S30(B)
D ← C
E ← D
Trong đó
A,B,C,D,E = các từ trong bộ đệm
t = số thứ tự của bước
F(t,B,C,D) = làm logic tại bước t
S
k
= dịch vòng trái k bits
Wt = từ thứ t của khối dữ liệu
Kt = hằng số
+ = phép cộng modulo 232
19
Các hàm f
Bước Hàm Giá trị
(0 ≤ t ≤ 19) f

1
= f(t,B,C,D)
(B C) ˅ ( ̚ B ˄ D)
(20 ≤ t ≤ 39) f
2
= f(t,B,C,D) B xor C xor D
(40 ≤ t ≤ 59) F
3
= f(t,B,C,D) (B ˄ C) ˅ (B ˄ D) ˅ (C ˄
D)
(60 ≤ t ≤ 79) F
4
= f(t,B,C,D) B xor C xor D
Từ 16 từ 32ibit từ khối dữ liệu đầu vào, mở rộng thành 80 từ Wt
– Với 0 ≤ t ≤ 15, giá trị Wt lấy trực tiếp từ khối dữ liệu
– Với t > 15 : Wt = S
1
(W
t-16
xor Wt
-14
xor Wt
-8
xor Wt
-3
)
Xây dựng hàm băm trên cơ sỡ mật mã đối xứng
Một trong các phương pháp hiệu quả để xây dựng hàm hash là xây dựng trên cơ sở
hàm mật mã khối. Giả sử E là hàm mã khối an toàn (có thể sử dụng hàm mật mã là
hàm biến đổi một chiều) với kích thước khối là m bít, cho bản tin đầu vào được chia ra

n khối m bít:
), ,,(
21 n
MMMM =
. Hàm tính giá trị băm có thể viết dưới dạng sau:
),(
1 iii
MHEH

=
,i=1,2,…,n.
ở đây H
0
là giá trị ban đầu đặc biệt. Giá trị băm của hàm H=H
n
.
20
Sơ đồ cấu trúc đơn giản nhất xây dựng hàm Hash mang tên Rabin được miêu tả
như hình 11.1.
E
M
1
H
0
E
M
2
H
1
H

2
E
M
i
H
i-1
H
i
E
M
n
H
n-1
H
n
Hình 11.1. Sơ đồ tạo hàm Hash Rabin
Sơ đồ hàm Hash Rabin có thể viết dưới dạng công thức:
niHEH
iMi
i
,2,1),(
1
==

,
Phương pháp tấn công tổng hợp lên hàm Hash xây dựng trên sơ đồ Rabin là tấn
công theo kiểu gặp nhau ở giữa. Cách tấn công này không phụ thuộc vào hàm mã khối
cụ thể nào. Có thể tránh được phép tấn công này nếu chọn hàm mã khối với kích thước
khối
128


m
bít, ví dụ như AES, RC6…vv.
Chúng ta có thể liệt kê một số sơ đồ khác, phục vụ cho việc xây dựng hàm Hash
được miêu tả trong bảng sau:
Số thứ tự Công thức
1
iiHi
MMEH
i
⊕=

)(
1
2
11
)(
1
−−
⊕⊕⊕=

iiiiHi
HMHMEH
i
3
1
)(
1

⊕⊕=


iiiHi
HMMEH
i
4
iiiHi
MHMEH
i
⊕⊕=


)(
1
1
5
11
)(
−−
⊕=
iiMi
HHEH
i
6
11
)(
−−
⊕⊕⊕=
iiiiMi
HMHMEH
i

7
11
)(
−−
⊕⊕=
iiiMi
HMHEH
i
8
11
)(
−−
⊕⊕=
iiiMi
HHMEH
i
9
iiHMi
MMEH
ii
⊕=


)(
1
10
11
)(
1
−−⊕

⊕=

iiHMi
HHEH
ii
11
1
)(
1
−⊕
⊕=

iiHMi
HMEH
ii
12
11
)(
1
−−⊕
⊕=

iiHMi
MHEH
ii
Dưới đây là biểu diến một số sơ đồ tương ứng với bảng trên …
21
E
H
0

M
1
H
1
E
H
i-1
M
i
H
i
E
H
n-1
M
n
H
n
a)
E
M
1
H
0
H
1
E
M
i
H

i-1
H
i
E
M
n
H
n-1
H
n
b)
E
M
1
H
0
H
1
E
H
i-1
H
i
c)
M
i
E
H
n-1
H

n
M
n
Hình 11.2.Sơ đồ biểu diễn hàm Hash tương ứng với phương án 1 (a), 5(b) và 10 (c)
ở bảng…
Trên cơ sở ba tham số H
i-1
, M
i-1
và M
i
có thể xây dựng rất nhiều phương án xây
dựng hàm Hash khác với việc sử dụng một thanh ghi có kích thước lớn.
Thế nhưng chúng ta quan tâm nhất là xây dựng trên cơ sở hàm một chiều F không
có đầu vào phụ. Các phương án được nêu ra trên hình 11.3, các hàm F phải có đầu vào
128

m
bít.
22
M
i
H
i-1
F
M
i-1
H
i
a)

M
i
H
i-1
F
M
i-1
H
i
b)
M
i
H
i-1
F
H
i
c)
M
i
H
i-1
F
H
i
d)
Hình 11.3. Sơ đồ xây dựng hàm Hash trên cơ sở biến đổi khối một chiều
Hàm một chiều có thể xây dựng trên cơ sở hàm mật mã khối bền vững E, ví dụ có
thể xây dựng F theo công thức sau:
)()( XEXXF

K
⊕=
,
ở đây K là một số khóa cố định đã biết. Đối với một thuật toán E
K
vững chắc thì
hàm đã cho là hàm một chiều, bởi vì chúng ta không biết véc tơ được hình thành bởi
đầu ra của E
K
.
3. WHIRLPOOL
Whirlpool. Whirlpool được thiết kế bởi Paulo Barreto và Vincent Rijmen
và gửi các đáp ứng các cuộc gọi mã hoá thô sơ ban hành bởi Nessie (đề án mới
của châu âu cho chữ ký, toàn vẹn và mã hoá) vào năm 2000. Whirlpool đã được
lựa chọn cùng với SHA-256, 384, 512 như là một phần danh mục đầu tư của
Nessie.
Thiết kế của Whirlpool kết hợp với tên miền mở rộng Merkle-Damgard
với một khối mã hoá dựa trên hàm nén. Khối mã hoá là một biến thể của AES,
nó cơ bản là khác với SHACAL, và nó được chuyển thành một hàm nén bằng
cách sử dụng cấu trúc Miyaguchi-Preneel. Whirlpool không nhằm vào bất kỳ
23
kiến trúc đặc thù nào, mặc dù 32 - hoặc 64-bit bộ vi xử lý cho phép một số tối
ưu hóa không thể triển khai thực hiện trong 8-bit.
Tài liệu tham khảo
- Bài giảng môn Lý thuyết mật mã và bảo mật thông tin của PSG, TS Nguyễn Hiếu
Minh.
- Cryptography & Network Security – The McGraw-Hill Companies.
- Handbook of Applied Cryptography, by A. Menezes, P. Van Oorschot, and S.
Vanstone, CRC Press, 1996
II. Hàm băm mật mã học

1. Hàm băm
Hàm băm (tiếng Anh: hash function) là hàm sinh ra các giá trị băm tương ứng với
độ dài cố định với một khối dữ liệu đầu vào không giới hạn kích thước. Hàm băm
thường được dùng trong bảng băm nhằm giảm chi phí tính toán khi tìm một khối dữ
liệu trong một tập hợp (nhờ việc so sánh các giá trị băm nhanh hơn việc so sánh những
khối dữ liệu có kích thước lớn).
2. Hàm băm mật mã học
Trong ngành mật mã học, một hàm băm mật mã học (tiếng Anh: Cryptographic
hash function) là một hàm băm với một số tính chất bảo mật nhất định để phù hợp việc
sử dụng trong nhiều ứng dụng bảo mật thông tin đa dạng, chẳng hạn như chứng thực
(authentication) và kiểm tra tính nguyên vẹn của thông điệp (message integrity). Hàm
băm mật mã là hàm toán học chuyển đổi một thông điệp có độ dài bất kỳ thành một
dãy bit có độ dài cố định (tùy thuộc vào thuật toán băm). Dãy bit này được gọi là
thông điệp rút gọn (message digest) hay giá trị băm (hash value), đại diện cho thông
điệp ban đầu hoặc chữ ký số (digital fingerprint).
Dễ dàng nhận thấy rằng hàm băm h không phải là một song ánh. Do đó, với
thông điệp x bất kỳ, tồn tại thông điệp x’ ≠ x sao cho h(x)= h(x’). Lúc này, ta nói rằng
“có sự đụng độ xảy ra”.
Một hàm băm h được gọi là an toàn (hay “ít bị đụng độ”) khi không thể xác định
được (bằng cách tính toán) cặp thông điệp x và x’ thỏa mãn x≠x’ và h(x) = h(x’).
Trên thực tế, các thuật toán băm là hàm một chiều, do đó, rất khó để xây dựng lại
thông điệp ban đầu từ thông điệp rút gọn. Hàm băm giúp xác định được tính toàn vẹn
dữ liệu của thông tin: mọi thay đổi, dù là rất nhỏ, trên thông điệp cho trước, ví dụ như
đổi giá trị 1 bit, đều làm thayđổi thông điệp rút gọn tương ứng.
Tính chất này hữu ích trong việc phát sinh, kiểm tra chữ ký điện tử, các đoạn mã
chứng nhận thông điệp, phát sinh số ngẫu nhiên, tạo ra khóa cho quá trình mã hóa…
24
Hàm băm là nền tảng cho nhiều ứng dụng mã hóa. Có nhiều thuật toán để thực
hiện hàm băm, trong số đó, phương pháp SHA-1 và MD5 thường được sử dụng khá
phổ biến từ thập niên 1990 đến nay.

25

×