Professional Documents
Culture Documents
AES4
AES4
AES4
1
Hình 1: Sơ đồ khối bộ giải mã AES-128
2) Mạch logic khối aes128_key_expansion_inv
Khối này thực hiện chức năng tính khóa vòng đảo InvKeyExpansion đã trình bày
ở bài 2.
Khối này sử dụng một thanh ghi round_key_reg[127:0] để lưu lại giá trị khóa vòng
sau mỗi lần tính toán.
Các bạn hãy xem từ MUX, dưới cùng của hình, lên sẽ hình dung được hoạt động của
mỗi lần lặp tính khóa vòng (round key).
round_num[3:0] sẽ cho biết khóa vòng thứ mấy đang được tính, nếu nó bằng 0 thì
khóa vòng số 10 round_key_10[127:0] sẽ nối đến key_in[127:0] và đưa vào mạch logic để
tính ngược về khóa vòng số 9.
Từ lần tính tiếp theo trở đi, round_num[3:0] bằng 1 đến 10, giá trị được dùng để tính
toán sẽ lấy từ thanh ghi round_key_reg[127:0] để tính các khóa vòng số 8, số 7, ... và khóa
mã ban đầu.
Ở đây 32 bit cuối [31:0] được XOR với 32 bit kế tiếp [63:32] trước khi đi qua các
bước tinh toán sau:
RotWord: đảo byte MSB xuống LSB
SubWord: ứng với function aes128_sbox()
2
AddRcon: lấy ngõ ra SubWord XOR với giá trị Rcon chọn từ
function aes128_rcon_inv(). Function này chọn Rcon theo giá trị
của round_num[3:0]. Thứ tự giá trị Rcon được dùng bị đảo so với quá trình mã hóa.
Kết quả sau khi AddRcon sẽ được dùng để tạo ra các bit MSB [127:96]
của round_key[127:0] và lưu vào thanh ghi round_key_reg[127:0].
4
Ngõ vào chức năng InvMixColumns, ứng với ngõ ra chức
năng InvSubByte.
after_addRoundkey[127:0] sẽ được lưu vào thanh ghi plainText_reg[127:0] sau mỗi
lần tính toán. Giá trị thanh ghi này sẽ lần lượt đi qua các chức năng:
InvShiftRows: chuyển đổi vị trí các byte trong 1 hàng
InvSubBytes: tính bằng function aes128_sbox_inv()
InvMixColumns: tính bằng function mixcolInv()
Chi tiết về các function, các bạn có thể tìm thấy trong RTL code
5
4) Kết quả tổng hợp trên FPGA
RTL code đã được tổng hợp trên Quartus II (Altera-Intel).
6
//output
wire [127:0] plain_text;
wire decipher_ready;
//
aes128_cipher_inv_top aes128_cipher_inv_top (
//input
clk_sys,
rst_n,
cipher_text,
round_key_10,
decipher_en,
//output
plain_text,
decipher_ready
);
7
decipher_ready);
#10
decipher_en = 1;
cipher_text = 128'hdaba0685a6b6ef1d096f7980accf3ac5;
round_key_10 = 128'ha5a5a5a5a5a5a5a5a5a5a5a5a5a5a5a5;
#10
decipher_en = 0;
#120
$display ("---- plain_text: %32h - READY: %1b\n", plain_text[127:0],
decipher_ready);
$stop;
end
endmodule
Trong test này, tác giả chỉ để 2 trường hợp giúp bạn nào quan tâm có thể thử nhanh.
Kết quả chạy mô phỏng như sau:
# ---- plain_text: 00112233445566778899aabbccddeeff - READY: 1
# ---- plain_text: fc018ee7550032a7cafeb9db263f00fd - READY: 1