







Preview text:
Stream Ciphers 2: Attacks and common mistakes
Ở phần 2 này, slide và video bài học ã ề cập ến chủ ề chính là các cuộc tấn công vào
cơ chế mã hóa One Time Pad và các nguy cơ liên quan khi sử dụng Stream Cipher.
Các khía cạnh ược tìm hiểu bao gồm cách thức hoạt ộng của One Time Pad, các cuộc
tấn công phổ biến vào nó, và những sai lầm thường gặp trong các hệ thống mã hóa sử dụng cơ chế này.
1. Cơ chế mã hóa One Time Pad
One Time Pad là phương pháp mã hóa trong ó thông iệp gốc (plaintext - m) ược
XOR với một khóa bí mật (k) có ộ dài bằng với thông iệp. Khóa này chỉ ược sử dụng
một lần. Quá trình giải mã cũng thực hiện bằng cách XOR bản mã (ciphertext - c) với
cùng khóa k ể lấy lại bản rõ m ban ầu.
Khi khóa ược chọn ngẫu nhiên phân phối ều, One Time Pad ảm bảo hệ mật hoàn
hảo (perfect secrecy) theo ịnh nghĩa của Shannon.
Một trong các phương pháp thực tế tạo OTP là sử dụng bộ sinh số giả ngẫu nhiên
(Pseudo Random Generator - PRG) mở rộng một khóa ngắn thành một chuỗi dài bằng
với thông iệp. Tức là thay vì sử dụng một chuỗi pad ngẫu nhiên thật sự, chúng ta sử
dụng chuỗi pad giả ngẫu nhiên ược mở rộng từ khóa ngắn input. Lúc này, tính bảo mật
không còn dựa vào "bảo mật tuyệt ối" nữa, vì hệ mã dòng không thể hoàn toàn an toàn.
Thay vào ó, tính bảo mật phụ thuộc vào các tính chất của bộ sinh số giả ngẫu nhiên.
2. Khó khăn trong sử dụng One Time Pad
Khóa bắt buộc phải dài bằng thông iệp, do ó việc quản lý khóa là khó khăn. Đây
cũng là lý do phảo sử dụng bộ sinh số giả ngẫu nhiên (Pseudo Random Generator -
PRG) ể tạo khóa giả ngẫu nhiên từ một seed ngắn hơn.
3. Cuộc tấn công vào One Time Pad
Tấn công lặp lại khoá (Two Time Pad Attack): One Time Pad chỉ an toàn khi mỗi
khóa chỉ ược sử dụng một lần. Nếu cùng một khóa ược dùng ể mã hóa nhiều thông iệp
(two-time pad), kẻ tấn công có thể dễ dàng khôi phục lại các thông iệp mà không tốn quá nhiều công sức.
Giả sử chúng ta có hai thông iệp m1 và m2, ược mã hóa bằng cùng một chuỗi pad,
dẫn ến hai bản mã C1 và C2. Nếu kẻ tấn công chặn ược C1, C2 và tính XOR giữa C1
và C2, chuỗi pad sẽ bị triệt tiêu, và kết quả chỉ còn lại là XOR giữa hai thông iệp m1 và m2.
C1 XOR C2 = (m1 XOR PRG(k)) XOR (m2 XOR PRG(k))
= m1 XOR m2 XOR (PRG(k) XOR PRG(k)) = m1 XOR m2
Các ký tự tiếng Anh có ủ tính dư thừa ể kẻ tấn công có thể phục hồi hoàn toàn cả
hai thông iệp từ phép XOR này. Đặc biệt, mã hóa ASCII cũng có tính dư thừa ủ ể khôi
phục lại các thông iệp gốc từ XOR giữa chúng.
4. Ví dụ thực tế về tấn công Two-Time Pad
Project Venona (1941 – 1946): Trong chiến tranh thế giới thứ hai, Liên Xô sử dụng
One Time Pad ể mã hóa thông iệp. Tuy nhiên, do quá trình tạo khóa thủ công từ việc
gieo xúc xắc rất tốn thời gian, họ ã sử dụng lại khóa cho nhiều thông iệp. Kết quả là
tình báo Hoa Kỳ ã chặn ược những bản mã dùng chung khoá này. Sau vài năm, họ ã
giải mã ược ến khoảng 3.000 thông iệp gốc, chỉ bằng cách chặn ược các bản mã như trên.
Windows NT và PPTP (Point-to-Point Transfer Protocol): Giao thức cho client
muốn giao tiếp an toàn với server. Client và server cùng chia sẻ một khoá bí mật và cả
hai cùng dùng khoá ó ể mã hoá tin nhắn gửi cho nhau. PPTP xem toàn bộ tương tác từ
client ến server là một luồng và tất cả các thông iệp từ server ến client cũng ược xử lý
như một luồng dài. Một khóa ược dùng chung ể mã hóa cả 2 luồng dữ liệu nói trên,
gây ra hiện tượng Two-Time Pad, dẫn ến việc thông tin có thể bị giải mã. Bài học ở ây
là không bao giờ nên sử dụng cùng một khóa ể mã hóa lưu lượng theo cả hai hướng.
Trên thực tế, có thể sử dụng một cặp khóa riêng biệt, trong ó một khóa ể mã hóa các
thông iệp từ server ến client và khóa kia ược sử dụng ể mã hóa các thông iệp theo hướng ngược lại.
WEP (Wired Equivalent Privacy): Giao thức mã hóa cho Wi-Fi này sử dụng một
giá trị 24-bit IV cùng với khóa dài hạn K ể mã hóa các khung dữ liệu. IV bắt ầu từ số
0, tăng lên từng ơn vị cho mỗi gói dữ liệu (Để ảm bảo khóa chỉ ược dùng ể mã hóa
một thông iệp duy nhất). IV ược gửi dưới dạng rõ cùng với văn bản mã hóa, do ó người
nhận biết khóa K, biết IV là gì, và có thể tính toán lại PRG của IV kết hợp với K. Sau
ó, giải mã văn bản mã hóa ể khôi phục văn bản gốc M.
Vấn ề còn ở IV chỉ dài 24 bit. Điều ó có nghĩa là chỉ có 2^24 giá trị IV có thể có,
và sau hơn 16 triệu khung ược truyền, IV phải bắt ầu lặp lại, và về cơ bản ta có một
'two-time pad'. Khi ó IV kết hợp với K, sẽ ược sử dụng ể mã hóa hai khung khác nhau,
và kẻ tấn công sau ó có thể giải mã văn bản rõ của cả hai khung.
Một vấn ề tồi tệ hơn là trên nhiều card 802.11, nếu bạn khởi ộng lại card, IV sẽ ặt
lại về giá trị 0. Do ó, mỗi khi khởi ộng lại card, về cơ bản bạn sẽ mã hóa tải dữ liệu
tiếp theo bằng IV (là 0) kết hợp với K. Như vậy trong WEP, cùng một pad có thể ược
sử dụng ể mã hóa nhiều thông iệp khác nhau, như trường hợp IV lặp lại sau khi khởi
ộng lại, hoặc lặp lại sau mỗi hơn 16 triệu khung...
Một vấn ề nữa với WEP là các IV không ược sinh ngẫu nhiên mà là tăng lên từng
ơn vị cho mỗi gói dữ liệu, tức là rất liên quan ến nhau. Đồng thời, mỗi pad ều có cấu
trúc IV kết hợp với cùng một khoá k, tức là có phần hậu tố (dài, thường là 128 – 24 =
104 bit) giống nhau, khiến các pad trở nên không còn ngẫu nhiên. Fluhrer, Mantin và
Shamir ã phát hiện vào năm 2001 rằng sau khoảng một triệu khung hình, bạn có thể
khôi phục khóa bí mật. Thậm chí các cuộc tấn công tốt hơn cũng ã xuất hiện trên thực
tế, cho thấy hiện nay chỉ cần khoảng 40.000 khung là ủ. Và do ó, chỉ trong vài phút,
bạn thực sự có thể khôi phục khóa bí mật trong bất kỳ mạng WEP nào.
Một giải pháp cho WEP là lấy khóa dài hạn k, ưa trực tiếp thông qua PRG ể sinh ra
một chuỗi bit dài, trông về cơ bản là ngẫu nhiên. Từ chuỗi output ta có thể lấy phân
oạn ban ầu làm khoá cho khung dữ liệu (frame) 1, phân oạn thứ hai sẽ ược sử dụng
làm khóa cho khung hai, và cứ thế tiếp tục…Bây giờ mỗi khung có một khóa giả ngẫu
nhiên và các khóa này không có mối quan hệ với nhau.
5. Vấn ề với mã hóa Stream Cipher
Tính chất dễ thay ổi (malleability): Stream Cipher có khả năng dễ bị chỉnh sửa bản
mã mà không bị phát hiện. Kẻ tấn công có thể sửa ổi bản mã và kết quả sẽ ảnh hưởng
trực tiếp ến bản rõ (plaintext) sau khi giải mã, tạo ra các tác ộng không mong muốn.
Ví dụ, với bản rõ m, bản mã sau ó sẽ là m XOR k. Bây giờ kẻ tấn công chặn ược
bản mã, mặc dù không biết văn bản thuần túy là gì nhưng kẻ tấn công vẫn có thể làm,
ngoài việc nghe lén, là chủ ộng sửa ổi bản mã. Giả sử rằng kẻ tấn công XOR bản mã
với một giá trị p nhất ịnh, bản mã trở thành m XOR k XOR p. Như vậy khi chúng ta
giải mã sẽ thu ược m XOR p:
(m XOR k XOR p) XOR k = m XOR p XOR (k XOR k) = m XOR p
Như vậy, kẻ tấn công có thể sửa ổi bản mã mà không bị phát hiện. Điều này tác ộng
rất cụ thể khi kẻ tấn công có thể sửa bản mã ể cho ra kết quả bản rõ mong muốn sau khi ược giải mã.
Như ở ví dụ sau, với bản tin “From: Bob” ược mã hoá bằng Stream Cipher, kẻ tấn
công có thể dễ dàng sửa ổi bản mã ể ảm bảo bản mã mới khi ược giải mã sẽ ra kết quả
“From: Eve”. Cụ thể, kẻ tấn công dễ dàng tính ược mã hexa tương ứng của các ký tự,
với “B”, “o”, “b”, “E”, “v”, “e” tương ứng là 42, 6F, 62, 45, 76, 65. Như vậy, phần ệm
p cần XOR với bản mã có thể dễ dàng xác ịnh qua:
426F62 XOR 457665 = 071907
6. Sai lầm khi sử dụng Stream Cipher trong thực tế
Mã hóa ĩa cứng: Ví dụ chúng ta ang có một tệp (Bắt ầu bằng “To Bob” như (1)
trong hình). Khi ược lưu trữ trên ĩa, tệp ược chia thành các khối và ược mã hóa, như
trong hình là “To Bob” sẽ vào khối ầu tiên và phần nội dung còn lại sẽ vào các khối
sau ó. Kẻ tấn công khi nhìn vào ĩa sẽ không biết nội dung của thông iệp là gì.
Nhưng giả sử sau ó người dùng tiếp tục và sửa ổi tệp. Bây giờ “To Bob” ược thay
thế bằng “To Eve”, trong khi phần nội dung còn lại vẫn giữ nguyên. Khi người dùng
lưu tệp ã sửa ổi này vào ĩa, tệp ó sẽ ược mã hoá lại, và ược chia thành các khối như ở
trên. Bây giờ kẻ tấn công nhìn vào ĩa, so sánh trước và sau khi chỉnh sửa, sẽ thấy thứ
duy nhất thay ổi là phân oạn nhỏ ở ầu tệp, trong khi các phần còn lại vẫn giống nhau.
Vì vậy, kẻ tấn công, mặc dù không biết iều gì thực sự ã xảy ra bên trong tệp, nhưng
vẫn biết chính xác vị trí diễn ra các chỉnh sửa, từ ó suy ra thông tin về nội dung thay
ổi. Trên thực tế, vì lý do này, không nên sử dụng mã hóa luồng ể mã hóa ĩa.
7. Kết luận và bài học rút ra
Không bao giờ sử dụng lại khóa trong mã hóa Stream Cipher hoặc One Time Pad cho nhiều thông iệp.
Tạo khóa ộc lập cho từng luồng dữ liệu trong giao tiếp hai chiều, ảm bảo không sử
dụng chung khóa giữa hai chiều.
Tránh sử dụng Stream Cipher cho mã hóa ĩa cứng vì nó không ảm bảo tính toàn vẹn
và có thể tiết lộ vị trí của các thay ổi trong dữ liệu.