Tải bản đầy đủ
DỰA TRÊN THỬ NGHIỆM TẤN CÔNG

DỰA TRÊN THỬ NGHIỆM TẤN CÔNG

Tải bản đầy đủ

26

Một cách tổng quát, giả sử một hàm băm có n giá trị (tức n là chiều dài
của chuỗi đầu ra) băm khác nhau, nếu chúng ta có k giá trị (input) băm từ k
thông tin khác nhau được chọn ngẫu nhiên, thì xác suất để không xảy ra đụng
độ là:
(1-

1
n

Với

)(1-

i
n

2
n

)....(1-

k −1
n

k −1

<<1 thì

k −1
i =1

∏ (1 − )
i =1

∏ (1 −

)=

i
n

k −1



i
n

)

∏e n =e
−i

− k ( k −1)
2n

i =1

Do đó xác xuất để xảy ra đụng độ là

ε=1-e

1
k 2 - k ≈ 2nlog
, suy ra k ≈

1
1− ε

1− ε

2n log

− k (k − 1)

2n

Do đó ta thấy với hàm băm có chiều dài đầu ra là 128 bít thì chúng ta
128
cần k ≈ ln 2 * 2 2 ≈ ln2* 2 64 ≈ 10 38 đầu vào để tìm được hai thông điệp khác

nhau nhưng cho cùng giá trị băm (hash value) với xác xuất là 0.5. Có nghĩa là
cho trước giá trị băm, chúng ta cần thử 10 38 giá trị M để hash value = H(M).
Để làm được điều này với máy tính có tốc độ sử lý 1 phép tính mất 1
microsecond mất 10 24 năm.
Bằng sự suy luận chúng ta cũng thấy rằng với chiều dài giá trị băm là
128 bít chúng ta cần thử 1019 đầu vào M, M’ sao cho H(M) = H(M’). Để làm
được điều này với máy tính có tốc độ sử lý 1 phép tính mất 1 microsecond
mất 317000 năm [17].
Thống kê 1 số kiểu tấn công hàm băm.

27

Bảng 3.2. Kiểu tấn công các hàm băm
3.2.2. Tấn công mở rộng chiều dài trên MD5 (Length-Extension Attack)
Tấn công mở rộng chiều dài là một loại tấn công khá phổ biến đối với
các hàm băm được xây dựng trên cấu trúc lặp Merkle-Damgård như MD0MD5 và SHA0-SHA2. Với phương pháp tấn công này, một người có thể dựa
trên giá trị băm h(m) và chiều dài len(m) của thông điệp m để tính giá trị băm
h(m||pad(m)||m') với bất kỳ thông điệp m' nào.
Trong các hàm băm được xây dựng trên cấu trục lặp Merkle-Damgård,
thông điệp đầu vào được chia ra thành một chuỗi các khối (block) có kích
thước bằng nhau và được xử lý theo thứ tự bằng một hàm nén một chiều (oneway compression function). Trong thuật toán MD5, hàm nén nhận vào 2 giá
trị - một giá trị móc nối (chaining value) có kích thước 128-bit và một khối
(block) thông điệp có kích thước 512-bit - và tạo ra một giá trị móc nối 128bit khác được sử dụng làm đầu vào cho bước lặp tiếp theo. Thông điệp ban
đầu được đệm (padded) để có kích thước là một bội số của 512-bit và được

28

chia thành một chuỗi các khối có kích thước 512-bit. Hàm nén được tính một
cách lặp lại với một giá trị móc nối ban đầu và khối thông điệp đầu tiên. Sau
khi khối thông điệp cuối cùng được xử lý, giá trị móc nối cuối cùng là kết quả
hàm băm của thông điệp ban đầu.

Hình 3.3. Cấu trúc lặp Merkle-Damgård (sao chép từ Wikipedia)
Do cấu trúc lặp của thuật toán, một người có thể chỉ dựa vào giá trị băm
và chiều dài của một thông điệp để tính giá trị băm của một thông điệp dài
hơn được bắt đầu bằng thông điệp ban đầu, bao gồm cả giá trị đệm đã được
thêm vào để cho thông điệp ban đầu có kích thước là một bội số của 512-bit
(hình 3).

Hình 3. 4. Tấn công mở rộng chiều dài

29

Đối với cơ chế tạo chữ ký như đã được mô tả trong phần 2, chúng ta có
thể sử dụng phương pháp tấn công mở rộng chiều dài để tính chữ ký của bất
kỳ thông điệp m' nào với m' bắt đầu bằng m||p, với p là giá trị được đệm vào
SECRET||p trong cấu trúc lặp Merkle-Damgård.
signature1 = MD5(SECRET||m)
signature2 = MD5(SECRET||m||p||x)
Ví dụ, dựa trên thông điệp yêu cầu chuyển hướng được gởi từ website
bán hàng về cho khách hàng (như trong bước 2 của hình 1), một người có thể
làm giả một thông điệp xác nhận thanh toán thành công được gởi về từ cổng
thanh toán (như trong bước 4 của hình 1), và gởi thông điệp này đến website
bán hàng để hoàn tất việc mua hàng.
response1

=

“amount=100000&merchant_id=1230&order_id=567&signature=[sig1]”
m1=“1000001230567"
sig1=MD5(SECRET||m1)
x=10000056701156
m2=m1||p1||x
sig2 = MD5(SECRET || m2)
3.2.3. Tấn công thuật toán
Hàm băm MD5 bị tấn công vào năm 2004 bởi Wang. Cơ sở của việc tấn
công này là dựa trên phép toán XOR ( ∆X =X’ ⊕ X, X có thể là các message
block, chaining variable….) và phép trừ mod 2 32 ( ∆X =X’-X mod 2 32 ).
Trong việc tấn công MD5 chúng ta sẽ xem xét phương pháp tấn công
của Wang. Có nghĩa là tìm hai khối message M = (M 0 , M 1 ) và M’= (M’ 0 , M’
1

) có chiều dài 1024 bít (M 0 , M 1 , M’ 0 , M’ 1 mỗi khối có chiều dài 512 bít) mà

sau khi băm hai message này cho cùng giá trị băm.

30

Các ký hiệu.
-

M 0 = (m , m 1 , m 2 ,…m 15 ), M’ 0 =(m’ , m’ 1 , m’ 2 ,….m’ 15 ) diễn tả hai
0

0

message. ∆M = ( ∆m0 , ∆m1 , ∆m2 ,… ∆m15 ) diễn tả sự khác nhau của hai khối
message. ∆mi =m’ i - m i sự khác biệt của từ thứ i.
-

a i , b i , c i , d i diễn tả chaining varibale của vòng thứ 4i-3, 4i-2, 4i-1, 4i,

của message M , với i ≤ 1 ≤ 16.
-

x i, j diễn ta bít thứ j của x i với chú ý rằng bít có ý nghĩa nhất (the most

sigfinication bit) ở vị trí thứ 32 và bít có ít ý nghĩa nhất(the least sigfinication
bit) ở vị trí thứ 1.
-

∆xi , j =x’ i, j - x i, j = ± 1 sự khác biệt được tạo ra bởi sự thay đổi bít thứ j

của x i . Ký hiệu x i [j] diễn tả sự thay đổi bít thứ j từ 0 thành 1, x i [-j] diễn tả
thay đổi bít thứ j từ 1 thành 0.
-

∆xi [j 0 , j 1 , …, j l ]=x i [j 0 , j 1 , …, j l ] diễn tả sự khác nhau, được tạo ra bởi

sự thay đổi các bít j 0 , j 1 , …, j l .
Chúng ta lựa chọn sự khác biệt với hai phép lặp như sau.
∆H 0

M 0 , M '0 )
M 1 , M '1 )
(
→ ∆H1 (

→ ∆H = 0

Với điều kiện.
∇M 0 = M’ 0 - M 0 = (0, 0, 0, 0, 2 31 , 0, 0, 0, 0, 0, 0, 2 15 , 0, 0, 2 31 , 0)

∇M 1 = M’ 1 - M 1 = (0, 0, 0, 0, 2 31 , 0, 0, 0, 0, 0, 0, -2 15 , 0, 0, 2 31 , 0)

∆ H 1 = (2 31 , 2 31 +2 25 , 2 31 +2 25 , 2 31 +2 25 )
∆ H 1 = ( ∆ a, ∆ b, ∆ c, ∆ d ) là sự khác biệt của bốn biến chaining variable cho
vòng lặp đầu tiên.

31

Chúng ta lựa chọn ∇M 0 để không chỉ đảm bảo vòng 3 và vòng 4 có sự
khác biệt với khả năng cao mà còn hủy sự khác biệt đầu ra ở các vòng 3, 4.
Sự khác biệt có thể tham khảo các bảng 1. Các cột của bảng này có ý nghĩa
tương tự nhau, ở đây tôi chỉ mô tả ý nghĩa của bảng 1. Cột đầu tiên diễn tả
bước thực hiện, cột thứ hai diễn tả các chaining variable của M 0 , cột thứ 3
diễn tả message word của M 0 , cột thứ 4 diễn tả sự dịch bít (shift bit), cột thứ 5
diễn tả sự khác biệt chaining variable, cột thứ 6 diễn tả sự khác biệt đầu ra của
M 0 và M’ 0 , cột thứ 7 diễn tả giá trị bít của M’ 0 . Các ô rỗng là không có sự
khác biệt.
Điều kiện đủ để xảy ra sự đụng độ
Trong phần này tôi sẽ mô tả tập các điều kiện để đảm bảo sự đụng độ
xảy ra trong bước thứ 8. Tính chất khác biệt của đầu ra trong bước thứ 8.
( ∆c 2 , ∆d 2 , ∆a 2 , ∆b1 ) → ∆b2 .
Mỗi một chaining variable thỏa mãn các điều kiện sau.
b’ 1 = b 1 .
a’ 2 = a 2 [ 7, ..., 22,−23].
d’ 2 = d 2 [−7, 24, 32].
c’ 2 = c 2 [7, 8, 9, 10, 11,−12,−24,−25,−26, 27, 28, 29, 30, 31, 32, 1, 2, 3, 4,
5,−6].
b’ 2 = b 2 [1, 16,−17, 18, 19, 20,−21,−24].
Tại bước thứ 8 b 2 và b’ 2 được tính theo công thức sau.
b 2 =c 2 + ((b 1 +F(c 2 , d 2 , a 2 ) +m 2 +t 2 ) <<<22.
b’ 2 =c’ 2 + ((b’ 1 + F(c’ 2 , d’ 2 , a’ 2 )+m’ 2 +t 2 ) <<<22.

32

Hàm tuyến tính được sử dụng trong bước này là.
φ 7 =F(c 2 , d 2 , a 2 ) =(c 2 ^d 2 ) V (⌐c 2 ^a 2 ).

Trong các biểu thức trên c 2 xuất hiện hai lần, ở bên trái và bên phải của
biểu thức. Để phân biệt chúng ta ký hiệu c 2F diễn tả c 2 ở trong F và c 2NF diễn
tả c 2 ở ngoài F.
Chúng ta có ∆b1 = 0 và ∆m7 =0, chúng ta biết rằng ∆b2 = ∆c 2NF + ( ∆φ 7 <<<22).
Chúng ta đặt cố định 1 trong 2 biến trong F để F thành hàm 1 biến cố định
[5].

Điều kiện cho những bít khác không trong ∆b2 .
2

Điều kiện d 2,11 = 1và b 2,1 = 0 đảm bảo sự thay đổi với bít đầu tiên của b
.
i.

Nếu d 2,11 = a 2,11 =1 thì chúng ta có ∆φ7,11 =1.

ii.

Sau khi <<<22 thì ∆φ7,11 thì sẽ ở vị trí 1((22+11) mod 32=1).

iii.
-

NF
NF
Vì ∆C 2,1 =0 do đó ∆b2,1 = ∆C 2,1 + ∆φ7,11 =1.

Điều kiện d 2, 26 = a 2, 26 =1, b 2,16 =0 và b 2,17 =1 đảm bảo sự thay đổi của

những bít 16 và 17 trong b 2 .
-

Điều kiện d 2, 28 = a 2, 28 =0, b 2,i =0, i=18, 19, 20 và b 2, 21 =1 đảm bảo sự

thay đổi trong những bít 19, 20, 21 trong b 2 .
-

Điều kiện d 2,3 = a 2,3 =0 và b 2, 24 =1 đảm bảo sự thay đổi trong bít thứ 24

của b 2 . Điều này có thể dễ dàng chứng minh như sau.

33

∆C 2NF [−24, −25, −26, 27] + ( φ 7 [3] <<<22) =2 23 -2 24 =-2 23

Điều kiện cho những bít bằng không trong ∆b2 .
-

Điều kiện c 2,17 =0 đảm bảo cho những bít thay đổi từ bít 7 thành bít thứ
12 trong c’ 2NF , bít thứ 17 của a’ 2 là không thay đổi. Đó là dễ dàng
chứng minh được điều này từ ∆C 2NF [−24,−25,−26, 27]+( φ 7 [3]<<<22)=2
23

-

-2 24 =-2 23 .

Điều kiện d 2,i = a 2,i đảm bảo những bít thay đổi trong c 2NF là không thay
đổi trong b 2 , i = {1, 2, 4, 5, 25, 27, 29, 30, 31}.

-

Điều kiện c 2,i = 1 đảm bảo bít thứ i thay đổi trong a 2 là không thay đổi
trong b 2 , i = {13, 14, 15, 16, 18, 19, 20, 21, 22, 23}.

-

Điều kiện d 2,6 = a 2, 6 =0 đảm bảo bít thứ 6 trong c 2F là không thay đổi
trong b 2 .

-

Điều kiện a 2,32 đảm bảo sự thay đổi bít thứ 32 trong c 2F , và d 2 là không
thay đổi trong b 2 .

-

Điều kiện d 2,i =0 đảm bảo bít thứ i trong a 2 và bít thứ i trong c 2F là
không thay đổi trong b 2 , i={8, 9, 10}.

-

Điều kiện d 2,12 =0 đảm bảo bít thứ 12 trong a 2 và c 2F là không thay đổi
trong b 2 .

-

Điều kiện a 2, 24 =0 đảm bảo bít thứ 24 trong c 2F và d 2 là không thay đổi
trong b 2 .

-

Sự thay đổi trong bít thứ 7 của c 2F , d 2 ,a 2 là không thay đổi trong b 2 .

34

Bằng kỹ thuật tương tự chúng ta có thể tìm ra tập các điều kiện để để
đảm bảo sự đụng độ xảy ra với khả năng cao [7].
Modify single message
Đây là kỹ thuật modify message để message sau khi được băm thỏa
mãn tất cả các điều kiện đủ của 16 bước đầu tiên. Tất nhiên lúc đầu message
sau khi được băm không thỏa mãn điều kiện đủ của 16 bước đầu tiên.
Chọn ngẫu nhiên M 0 thỏa mãn tất cả các điều kiện trong 16 bước đầu tiên,
sau đó ta tính tất cả các chaining variable, nếu chaining variable nào không
thõa mãn các điều kiện ta có thể modify chúng, rồi sau đó tính lại các giá trị
của từng khối message block.
Ví dụ để thỏa mãn 3 điều kiện của c 1 (c 1 có nghĩa là giá trị của biến c
chaining variable ở bước 1) chúng ta modify như sau.
new ← old
c1

c1

old

old

old

- c 1, 7 .2 6 - c 1,12 .2 11 - c 1, 20 .2 19

← ((c new - c 1old )>>>17) + m old
m new
2
1
2

Và modify tất cả các chaining variable khác một các tương tự.
Modify multiple messages
Đây là kỹ thuật modify message để message sau khi được băm thỏa
mãn tất cả các điều kiện của vòng 2 và tất nhiên các message cũng phải thỏa
mãn vòng 1.
Chúng ta nhận xét rằng đó là có thể có một cách để làm thỏa mãn một phần
điều kiện của 32 bước đầu tiên, kỹ thuật này gọi là modify multiple
messages.

35

Ví dụ nếu a 2,5 = 1 và theo điều kiện thì a 2,5 = 0 (các điều kiện này chúng ta
xem trong bảng 2) chúng ta có thể modify m 1 , m 2 , m 3 , m 4 , m 5 để sự modify
này phát sinh đụng độ từ bước thứ 2 → 6, mà các điều kiện ở 16 vòng đầu tiên
vẫn không bị phá vỡ. Chúng ta có thể modify m 5 như sau [7].

Bảng 3. 3. Modify multiple message m 5
Sau đó người ta sẽ dùng hai kỹ thuật modify message trên để xây dựng thuật
toán tấn công MD5.
Kỹ thuật tấn công MD5.
1. Lặp lại các bước sau đây cho đến khi M 0 được tìm thấy.
a) Lựa chọn ngẫu nhiên M 0 .
b) Modify M 0 theo kỹ thuật single message modify.
c) M’ 0 = M 0 + ∇ M 0 .
d) Kiểm tra lại xem tất cả các điều kiện bằng việc tính lại H 0 , H’ 0 .
2. Lặp lại tất cả các bước sau cho đến khi đụng độ thì được tìm thấy.
a) Lựa chọn ngẫu nhiên M 1 .
b) Modify M 1 theo kỹ thuật modify multiple message.
c) M’ 1 = M 1 + ∇ M 1 .

36

d) Kiểm tra nếu cặp message này dẫn đến đụng độ hay không ( ∆H =0
có nghĩa là đã xảy ra đụng độ).
3.2.4. Tấn công theo nguyên lý vét cạn

Trong khoa học máy tính tấn công vét cạn là một cách rất tổng quá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à kiểm tra
tất cả đầu vào sau đó băm giá trị này bằng một hàm băm, cuối cùng kiểm tra
giá trị này với giá trị băm cho trước, nếu chúng bằng nhau có nghĩa là attacker
đã tấn công thành công, còn nếu không thì attacker tìm một bức thông điệp
khác và băm chúng bằng hàm băm cho đến khi nào chúng tạo ra giá trị băm
mong muốn. 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 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 càng dài thì tính bảo mật càng
cao. 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à n ⇒
chúng ta cần thử 2 n lần để tìm được một tấn công thành công.
3.3.

Đánh giá độ an toàn MD5 dựa trên việc sử dụng các bộ xử lý đồ

họa GPU để tính toán khôi phục mật khẩu
Vì MD5 là hàm một chiều nên việc giải mã rất phức tạp và yêu cầu
năng lực tính toán rất lớn, do đó khó có thể giải mã MD5 bằng phương pháp
tấn công thuật toán. Theo cách làm hiện nay là với một không gian mật khẩu,
chương trình sẽ tiến hành tạo giá trị băm mọi mật khẩu đó bằng MD5 rồi đem
so sánh với giá trị MD5 của mật khẩu cần giải mã, nếu các giá trị giống nhau
thì ta đã tìm được mật khẩu đúng, ngược lại chương trình sẽ phải tiếp tục xác
minh phần còn lại của không gian mật khẩu cho tới khi có giá trị đúng.(Tấn
công thử-sai). Ở đây, tôi xây dựng không gian mật khẩu bằng cách tiếp cận
đầy đủ. Đặc biệt, đối với một tập hợp các ký tự đầu vào - ví dụ như các chữ