3.7. SMS4¶
SM4 (trước đây là SMS4) là thuật toán mã hóa khối của Trung Quốc để bảo vệ mạng không dây. Thuật toán được phát triển vào năm 2006.
Phần này mình dịch từ [17] hoặc bản dịch tiếng Anh là [23].
Input, output và độ dài khóa của SMS4 đều là \(128\) bit. Thuật toán gồm \(32\) vòng.
Plaintext \(128\) bit sẽ được chia thành \(4\) phần độ dài \(32\) bit (gọi là word). Giả sử plaintext là \(P\) có \(128\) bit sẽ được biểu diễn thành
Từ khóa ban đầu là \(K\), thuật toán sinh khóa sinh ra các khóa \(K_0\), ..., \(K_{31}\). Mỗi khóa con độ dài \(32\) bit.
SMS4 sử dụng mô hình Feistel tổng quát (hay generalized Feistel model).
3.7.1. Mã hóa¶
Ở vòng thứ \(i\), với \(i = 0, 1, \ldots, 31\), ta tính word mới \(X^{i+4}\) theo công thức

Hình 3.16 Một vòng SMS4¶
Ciphertext sẽ là viết ngược của bốn word ở vòng cuối cùng, nói cách khác là
3.7.2. Round function¶
Biến đổi \(T\) gồm hai phần là hoán vị (không tuyến tính) \(\tau\) và hoán vị (tuyến tính) \(L\). Nói cách khác là \(T(\cdot) = L(\tau(\cdot))\).
Hoán vị không tuyến tính có dạng
với \(a_i\) là các byte của \(X\), nghĩa là \(X\) có \(32\) bits sẽ được chia thành bốn khối độ dài \(8\) bits là \(a_0\), \(a_1\), \(a_2\) và \(a_3\).
Bảng S-box có thể xem ở một trong hai tài liệu trên.
Hoán vị tuyến tính có dạng
trong đó \(\lll\) là phép dịch vòng bit sang trái.
3.7.3. Thuật toán sinh khóa con¶
Khóa \(K\) ban đầu (\(128\) bit) được chia thành bốn word
Các khóa con \(K_0, K_1, \ldots, K_{31}\) được sinh ra theo quy tắc sau. Với mỗi \(i = 0, 1, \ldots, 31\) thì
với \(HK_i = MK_i \oplus FK_i\) với \(i = 0, 1, 2, 3\). Trong đó \(FK\) là một mảng được định nghĩa sẵn
Hàm \(T'\) khác với hàm \(T\) ở trên, thay vì dùng \(L\) thì dùng \(L'\) có dạng
\(CK\) cũng là một mảng cố định. \(CK_i\) với \(i = 0, 1, \ldots, 31\) là bảng sau
3.7.4. Giải mã¶
Để giải mã ta dùng round function ở trên nhưng theo thứ tự ngược lại.