Năm 2013, tác giả Fatma Ahmed và các cộng sự [1] đã giới thiệu một thuật toán AES cải biên với ngân hàng các hộp thế hoạt động giống như cơ chế khối quay (Rotor) và ma trận MDS phụ thuộc khóa - đặt tên là SDK-AES. Thuật toán SDK-AES được thiết kế để phụ thuộc khóa và có khả năng kháng lại tấn công tần số (Frequency Attack).
Khác với AES, thuật toán SDK-AES có thể mã hóa các khối bản rõ có độ dài 128 byte tạo ra các khối bản mã có độ dài tương tự. Độ dài khóa có thể là 128, 192 hoặc 256 byte. Số lượng tổng thể của các vòng tùy thuộc vào độ dài khóa, có thể là 10, 12 hoặc 14 vòng tương ứng. Theo [1], giả thiết độ dài khóa là 128 byte. Đầu vào của thuật toán mã hóa và giải mã là các khối có độ dài 128 byte. Khối này được chép lại thành một mảng trạng thái dạng ma trận 16x8 của các byte, ma trận này sẽ được thay đổi ở mỗi giai đoạn của quá trình mã hóa hoặc giải mã. Sau giai đoạn cuối cùng, mảng trạng thái được chép lại vào một ma trận đầu ra. Tương tự, khóa 128 byte cũng được mô tả bởi một ma trận 16x8 của các byte. Khóa này sau đó được mở rộng vào một mảng các từ của lược đồ khóa; mỗi từ gồm 4 byte và lược đồ khóa tổng thể bao gồm 32x11 từ. Quá trình mã hóa và giải mã của SDK-AES tương đối giống với AES. Hình 1 chỉ ra cấu trúc tổng thể của thuật toán SDK-AES.
Hình 1. Cấu trúc của thuật toán SDK-AES
Cấu trúc hàm vòng của thuật toán SDK-AES gần tương tự như AES. Sự khác nhau của hai thuật toán này là các hộp thế và ma trận MDS, đây là những thành phần bí mật và phụ thuộc khóa. Ngoài ra, trong vòng cuối cùng của quá trình mã hóa, hộp thế lại được dịch vòng một lần nữa.
Ngân hàng hộp thế
Trong thuật toán SDK-AES, ngân hàng các hộp thế phụ thuộc khóa hoạt động giống cơ chế khối quay [2]. Ngân hàng hộp thế chứa hai hộp thế, hộp thế đầu tiên là hộp đã được sử dụng trong AES. Để duy trì cho cấu trúc của mã khối đơn giản, hộp thế thứ hai được xây dựng từ hộp thế thứ nhất bằng cách dịch chuyển một lượng, lượng này được tính từ khóa của người dùng. Ở bước đầu tiên, tính tổng kiểm tra (Checksum) “Adler-32” cho khóa của người dùng. Kết quả đầu ra có độ dài 32 bit. Theo các tác giả, việc sử dụng thuật toán tổng kiểm tra sẽ đưa ra một kết quả khác, khi khóa của người dùng được thay đổi. Kết quả đầu ra từ Checksum sẽ được chia thành bốn khối con, mỗi khối có độ dài 8 bit. Bốn khối con đó sẽ được cộng XOR với nhau để tạo ra một khối có độ dài 8 bit, khối này biểu diễn con số sẽ sử dụng để dịch chuyển hộp thế đầu tiên để sinh ra hộp thế thứ hai.
Trong quá trình mã hóa, byte đầu vào được ánh xạ tới 1 byte mới thông qua ngân hàng hộp thế. Đầu tiên, byte đầu vào được ánh xạ bởi hộp thế thứ nhất. Đầu ra sẽ là đầu vào của hộp thế thứ hai. Nếu hộp thế thứ nhất này dịch vòng 1 byte thì sau 256 lần hộp thế sẽ trở lại vị trí ban đầu của nó và hoạt động này sẽ được lặp lại với tất cả 256 byte. Tuy nhiên, hộp thế thứ hai sẽ được dịch vòng bất quy tắc. Sự dịch vòng này bao gồm hai bước. Bước thứ nhất là dịch vòng hộp thế thứ hai trong vòng 10 sau khi ánh xạ mỗi byte bởi các số lẻ (1, 3, 5 và 7). Đầu tiên, dịch vòng hộp thế thứ hai bởi 1 byte cho đến khi dịch vòng hết 256 byte, sau đó dịch vòng 3 byte cho 256 byte đầu vào tiếp theo. Tiếp đó, dịch vòng 5 byte cho 256 byte đầu vào tiếp theo. Cuối cùng, dịch vòng 7 byte cho đến khi có 256 byte đầu vào. Ở bước thứ hai, sau khi vòng 10 kết thúc, dịch vòng hộp thế thứ hai 1 byte. Hai bước trên đảm bảo rằng hộp thế thứ hai dịch vòng bất quy tắc. Bởi sau khi mã hóa mỗi khối bản rõ, hộp thế thứ hai sẽ ở trong một sự sắp xếp khác, kể cả khi lặp lại dữ liệu đầu vào thì đầu ra sẽ hoàn toàn là khác nhau.
Ý tưởng cơ bản là làm cho hộp thế giống như hệ mật khối quay đảm bảo được độ an toàn và quá trình giải mã đơn giản. Trong thuật toán giải mã, không thực hiện dịch vòng các hộp thế mà chỉ trừ đầu ra từ nghịch đảo của hộp thế thứ hai với số lần mà các byte hộp thế thứ hai đã được dịch vòng. Chỉ thực hiện dịch vòng hộp thế thứ hai và giữ nguyên hộp thế thứ nhất, hộp thế thứ hai chỉ có người gửi và người nhận mới biết.
Biến đổi ShiftRows
Dữ liệu đầu vào được sắp thành 16 hàng và 8 cột. Biến đổi ShiftRow được thực hiện theo cách: giữ nguyên hàng đầu tiên và hàng thứ 9 của mảng trạng thái. Với hàng 2, thực hiện dịch vòng trái 1 byte. Với hàng 3, thực hiện dịch vòng trái 2 byte. Tiếp tục cho đến hàng 8, dịch vòng trái 7 byte. Sau đó, thực hiện dịch vòng trái hàng 10 với 1 byte, hàng 11 với 2 byte, cho đến hàng 16 với 7 byte. Biến đổi ShiftRow ngược thực hiện dịch vòng theo hướng ngược lại của mỗi hàng trong 16 hàng.
Ma trận MDS phụ thuộc khóa
Trong SDK-AES, các tác giả thiết kết các ma trận MDS động mới phụ thuộc khóa của người dùng. Số lượng các ma trận là 8, mỗi ma trận đều phụ thuộc khóa đó. Trong quá trình mã hóa, chỉ sử dụng một ma trận từ 8 ma trận cho mọi khối dữ liệu. Ma trận được lựa chọn phụ thuộc vào các khóa con và bản rõ. Các ma trận mới là tự nghịch đảo để ma trận tương tự có thể được sử dụng cho thuật toán giải mã, do đó làm giảm độ phức tạp của hệ thống.
Ma trận MDS mới là một ma trận vòng 4x4. Mã MDS là (12,8,5). Thuộc tính MDS của ma trận này được kiểm tra, nghĩa là một mã (12,8,5) là mã MDS nếu d = n - k +1. Điều này có thể thực hiện bằng cách kiểm tra số nhánh của phép biến đổi. Đầu vào với 1 hoặc 2 byte hoạt động được nhân với ma trận trên và đầu ra được kiểm tra, nếu tổng số các byte hoạt động bao gồm các byte hoạt động đầu vào và các byte hoạt động đầu ra là bằng 5 thì nó thỏa mãn thuộc tính MDS. Ma trận MDS mới được kiểm tra đối với thuộc tính tự nghịch đảo. Các tác giả thiết kế nó bằng cách cung cấp các điều kiện tự nghịch đảo từ ma trận dưới đây:
Với điều kiện:
Vì vậy, lựa chọn các phần tử cho ma trận MDS mới thỏa mãn các điều kiện trên. Sau đó, chọn b1 = b3 = 1 . Vì phép nhân với 1 là “free” nên có thể nâng cao tính hiệu quả trong tính toán với các ma trận MDS. Các phần tử b0 và b2 là phụ thuộc khóa. Ở bước đầu tiên, lấy 32 bit (đầu ra từ tổng kiểm tra của khóa) và chia nó thành 8 khối con, mỗi khối có độ dài 4 bit. Giá trị của mỗi khối con biểu diễn phần tử b0 trong mỗi ma trận D-MDS (8 khối con, tương ứng với 8 giá trị b0 cho 8 ma trận MDS). Phần tử b2 được tính từ phần tử nghịch đảo theo phép cộng của b0 trong GF(24).
Trong SDK-AES, dữ liệu được sao chép vào một ma trận 16x8 của các byte. Đầu tiên, chia mảng trạng thái của dữ liệu thành các mảng con, mỗi mảng là ma trận 4x4 của các byte. Do đó, thu được 8 mảng trạng thái con. Mỗi phần tử trong ma trận tích là tổng của các tích các phần tử của một hàng và một cột. Trong trường hợp này, các phép cộng và phép nhân đều được thực hiện trên GF(28). Đảm bảo rằng, mỗi byte sẽ ảnh hưởng tới tất cả các byte khác bằng cách thực hiện “tráo đổi hàng” sau khi nhân với ma trận MDS trên. Phương trình (4) biểu diễn việc thực hiện “tráo đổi hàng”.
Mở rộng khóa SDK-AES
Thuật toán mở rộng khóa SDK-AES lấy một khóa gồm 32 từ (128 byte) và tạo ra một mảng tuyến tính 32x11 từ. Mảng này đủ để cung cấp một khóa vòng gồm 32 từ cho biến đổi AddRoundKey khởi tạo và biến đổi này cho 10 vòng mã hóa. Thủ tục mở rộng khóa của SDK-AES giống với thủ tục mở rộng khóa của AES.
Kết luận
Các mã khối động với những thành phần “động” có khả năng làm cho các nhà mã thám khó khăn hơn trong thám mã. Do đó, việc nghiên cứu các cách “động khóa” mã khối là một chủ đề nên được đầu tư nghiên cứu. Bài viết này đã giới thiệu một cách tiếp cận trong việc làm động mã khối. Đây có thể là một tham khảo hay cho các nhà nghiên cứu về mã khối và mã khối động.
TÀI LIỆU THAM KHẢO [1]. Fatma Ahmed and Dalia Elkamchouchi, “Strongest AES with S-Boxes Bank and Dynamic KeyMDS Matrix (SDK-AES)”, International Journal of Computer and Communication Engineering, Vol. 2, No. 4, July 2013, pp. 1-5. [2]. W. O. Chan, “Cryptanalysis of SIGABA”, Master’s Thesis, Department of Computer Science, San Jose State University, May 2007. |