
Bảng 4: Các hệ số Pearson giữa mô hình và thời gian
Giá trị hệ số Pearson đối với khóa К1 lớn hơn gấp 3 lần đối với bất kỳ khóa nào trong số ba khóa còn lại. Điều này nói lên sự phụ thuộc tuyến tính cao giữa mô hình và dữ liệu thật và cũng là khẳng định việc sử dụng khóa chính К1.
Hệ số tương quan Pearson có thể áp dụng thậm chí không cần quá trình trung bình hóa các giá trị. Trong trường hợp đó giá trị sẽ nhỏ hơn rất nhiều so với các giá trị trung bình, nhưng vẫn có thể thấy rằng khóa đúng sẽ cho hệ số tương quan lớn hơn cả (thể hiện trong dòng “không trung bình hóa” Bảng 4).
Như vậy, đầu tiên là về mặt trực quan, sau là với sự trợ giúp của hệ số tương quan, có thể nhận thấy rằng mô hình thời gian đối với khóa К1đúng theo dữ liệu thực tế hơn cả. Tuy nhiên, có thể thấy rõ là cách thức này không thể áp dụng cho việc kiểm tra tất cả các giá trị có thể của khóa chính, vì vậy cần áp dụng phương pháp khác cho phép tìm được khóa theo từng phần. Phương pháp này được tiến hành trong ví dụ tiếp theo. Ví dụ này có thể xem xét như một tấn công được áp dụng thực tế.
Tấn công đối với khóa chưa biết
Vấn đề để tấn công đạt hiệu quả là cần tìm khóa theo từng phần 6 bit, việc này giống với việc kiểm tra tính chính xác 64 bit nêu trên (khi làm việc với 4 khóa). Các giá trị 6 bit khóa sẽ cho mối liên hệ tuyến tính tốt nhất giữa mô hình và thực tế, và cũng chính là khóa chính xác.
Thời gian làm việc của mã có thể biểu diễn dưới dạng sau đối với việc tìm 6 bit khóa:
Thời gian thực hiện thao tác DES_P phụ thuộc vào:
4 bit biến var của vòng đầu tiên a*HW(var[1,1:4]) (6 bit khóa vòng đầu tiên tham gia vào hình thành 4 bit biến var);
Tất cả các bit còn lại của biến var ngoại trừ 4 bit của vòng đầu tiên a*(∑ HW(var[:,1:32]));
Hằng số thời gian Т;
Hàm nhiễu đo đạc Δ(t).
Như vậy, thời gian làm việc của thuật toán có thể viết ở dạng:
t = a*HW(var[1,1:4]) + a*(∑ HW(var[:,1:32])) + Т + Δ(t)
Việc lấy 6 bit khóa và 4 bit biến var là do: khối Feistel lấy 32 bit thanh ghi R và thực hiện phép đảo đặc biệt E() để có được 48 bit. Giá trị này sau đó được cộng với 48 bit khóa. Trong vòng đầu tiên chúng ta không biết giá trị R, và chưa có khóa. Sau đó kết quả phép cộng được chia thành 8 khối 6 bit. Mỗi bộ 6 bit được đưa vào bảng riêng Sbox. Mỗi bảng trong 8 bảng sẽ thay thế 6 bit đầu vào bằng 4 bit đầu ra, vì thế ở đầu ra nhận được 32 bit biến var và giá trị này ảnh hưởng tới thời gian làm việc của bộ mã.
Nếu chúng ta nhóm thời gian làm việc của tất cả các thao tác mã hóa mà khoảng cách Hamming HW(var[1,1:4]) giống nhau thì giá trị thời gian trung bình sẽ tiến tới giá trị:
μ(t) = μ(a*HW(var[1,1:4])) + μ(a*(∑ HW(var[:,1:32]))) + μ(Т) + μ(Δ(t)) = a*HW(var[1,1:4]) + μ(a*(∑ HW(var[:,1:32]))) + Т + μ(Δ(t))
Như vậy, khi tiến hành sẽ lấy các giá trị HW(var[1,1:4])giống nhau và các giá trị ∑ HW(var[:,1:32]) khác nhau (lấy các bản rõ mà HW(var[1,1:4]) giống nhau. Vì thế tổng ∑ HW(var[:,1:32]) sẽ khác nhau, suy ra giá trị trung bình μ(a*(∑ HW(var[:,1:32]))) sẽ tiến tới hằng số (nếu không tính tới 04 bit đầu tiên μ(∑ HW(var[:,1:32]) thì sẽ tiến tới 254), và cũng giống như trong ví dụ cũ sẽ tiến tới giá trị μ(Δ(t)).
04 bit đầu tiên của biến có thể ghi lại dưới dạng sau:
var[1,1:4] = Sbox{E(R)[1,1:6] xor K[1,1:6]}
Trong đó:
E(R)[1,1:6] là 6 bit đầu tiên của thanh ghi R sau thao tác E();
K[1,1:6] là 6 bit khóa đầu tiên;
Sbox{} là bảng hoán vị Sbox.
Thực hiện thay biểu thức đối với var[1,1:4]:
μ(t) = a*HW(Sbox{E(R)[1,1:6] xor K[1,1:6]}) + μ(a*(∑ HW(var[:,1:32]))) + Т + μ(Δ(t))
Các giá trị μ(a*(∑ HW(var[:,1:32]))), μ(Δ(t)) sẽ tiến tới giá trị trung bình của chúng, khi chúng được tính đối với các bản rõ ban đầu khác nhau. Khi đó đối với trung bình hóa số lượng rất lớn thì giá trị μ(a*(∑ HW(var[:,1:32]))) + Т + μ(Δ(t)) có thể thay bằng hằng số const:
μ(t) = a*HW(Sbox{E(R)[1,1:6] xor K[1,1:6]}) + const
Để có thể tìm được khóa trong biểu thức này cần phải lựa chọn các bản rõ với giá trị HW(Sbox{E(R)[1,1:6] xor K[1,1:6]}) giống nhau cho mỗi giá trị khóa 6 bit, trung bình hóa thời gian thực thi chúng và so sánh với mô hình. Thuật toán tìm kiếm khóa sau cùng sẽ được viết ở dạng chương trình sau:
For each key = 0:63
For each i = 1:N
P = plaintext(i) // bản rõ
[L, R] = IP(P) // Phần trái và phải sau khi thực hiện hoán vị đầu tiên
hw_var[i] = HammingWeight( Sbox1(E(R)[0:5] XOR key) ) // Khoảng cách Hamming đối với 04 bit biến var
EndFor
// Hệ số tương quan giữa N giá trị thời gian đo được và N giá trị khoảng cách Hamming được tính toán
pcc(key) = ComputePearsonCorrelation(t, hw_var)
EndF
Thuật toán này đã được viết trên ngôn ngữ C++ và các hệ số tương quan tính toán được thể hiện trên Hình 4. Để tính hệ số tương quan cần sử dụng hàng triệu đo đạc. Tổ hợp bit khóa 000010=2 cho sự tương quan cao hơn 4 lần so với các giá trị khác. Chính vì vậy tổ hợp bit này có thể là tổ hợp đúng.
Hình 4: Đồ thị tương quan cho tất cả các giá trị khóa 6 bit có thể
Sau khi tìm được 6 bit khóa đầu tiên, có thể tìm các khóa tiếp theo cho đến khi khôi phục được hoàn toàn khóa. Việc thu thập các giá trị thời gian có thể mất vài tiếng cho đến vài tuần phụ thuộc vào hệ thống tính toán. Còn việc phân tích dữ liệu đã thu được thông thường diễn ra nhanh hơn nhiều, chỉ mất khoảng vài giờ mặc dù vẫn có sự phụ thuộc vào tình huống nhất định. Thông thường, các phần mềm thương mại thực hiện tấn công kênh kề theo thời gian không công khai, nhưng việc sử dụng kiến thức và các đoạn mã như đã trình bày ở trên là hoàn toàn khả thi.
Kết luận
Bài báo này giúp người đọc có những hiểu biết sâu sắc hơn về tấn công kênh kề và là bước khởi đầu để phát triển nó. Trong những bài khác, sẽ tiếp tục tìm hiểu về các nghiên cứu tấn công phần cứng, xem xét việc sử dụng nguồn tiêu thụ của thiết bị như thế nào để có thể phá mã và khôi phục khóa thế nào khi lợi dụng những lỗi tính toán (tấn công năng lượng vi sai đối với thuật toán AES-128).
Theo ATTT
Post a Comment
Click to see the code!
To insert emoticon you must added at least one space before the code.