Tải bản đầy đủ (.pdf) (96 trang)

Bài tập môn học cơ sở an toàn và bảo mật thông tin viết chương trình mã hóa và giải mã file dữ liệu bằng mật mã aes

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.14 MB, 96 trang )

HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA CÔNG NGHỆ THÔNG TIN
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

BÀI TẬP MƠN HỌC CƠ SỞ AN TỒN VÀ BẢO MẬT THƠNG TIN

VIẾT CHƯƠNG TRÌNH MÃ HĨA VÀ GIẢI MÃ FILE DỮ
LIỆU BẰNG MẬT MÃ AES

Ngành: Công nghệ thông tin
Chuyên ngành: Kỹ thuật phần mềm nhúng và di động

Sinh viên thực hiện:
Đỗ Thị Nga CT030239


NHẬN XÉT VÀ CHO ĐIỂM CỦA GIÁO VIÊN
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................


....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................
....................................................................................................................................


MỤC LỤ


LỜI MỞ ĐẦU................................................................................................ 1
CHƯƠNG 1. TỔNG QUAN ĐỀ TÀI............................................................ 2
1.1 Giới thiệu về hệ mật mã AES............................................................ 2
1.2 Thuật toán mã hóa AES..................................................................... 2
1.3 Mục tiêu đề tài................................................................................. 3
CHƯƠNG 2. XÂY DỰNG CHƯƠNG TRÌNH.......................................... 4
2.1 Ý tưởng bài tốn.............................................................................. 4
2.2 Các hàm mã hóa................................................................................. 4
2.2.1 SubBytes.................................................................................... 4
2.2.2 ShiftRows.................................................................................... 5
2.2.3 MixColumns.............................................................................. 7
2.2.4 AddRoundKey........................................................................... 9
2.3 Các hàm giải mã...........................................................................

10

2.3.1 InvSubBytes.............................................................................. 10
2.3.2 InvShiftRowss........................................................................... 11
2.3.3 InvMixColumn........................................................................ 12
2.3.4 AddRoundKey........................................................................


14

2.4 Chương trình thực hiện mã hóa và giải mã.................................... 15
2.4.1 Chương trình thực hiện mã hóa................................................ 15
2.4.2 Chương trình thực hiện giải mã................................................ 17
CHƯƠNG 3. KẾT QUẢ THỰC NGHIỆM................................................ 20
3.1 Thực nghiệm mã hóa với khóa 128 bit.......................................... 20
3.2 Thực nghiệm mã hóa với khóa 192 bit.......................................... 21
3.3 Thực nghiệm mã hóa với khóa 256 bit.......................................... 22
PHỤ LỤC................................................................................................... 24



LỜI MỞ ĐẦU
Ngày nay, với sự phát triển mạnh mẽ của công nghệ thông tin, các nền
tảng kỹ thuật số, áp dụng trong công việc học tập càng trở lên phổ biến, đặc biệt
khi đại dịch covid vẫn diễn ra phức tạp trên khắp thế giới, nhiều địa phương đưa
ra các lệnh giãn cách. Việc sử dụng các phương tiện truyền thơng của người dùng
càng địi hỏi u cầu cao hơn về độ an tồn bảo mật thơng tin.
Nhiều hệ mã đã được tạo ra nhằm che giấu thông tin, bảo mật thơng tin người
dùng. Mã hóa AES (Advanced Encryption Standard) tuy được phát triển từ cuối
những năm 90s nhưng AES vẫn thực hiện tốt chức năng mã hóa, được áp dụng
làm tiêu chuẩn mã hóa.
Với mong muốn được tìm hiểu về mã AES, nhóm thực hiện báo cáo với
đề tài đề tài “Viết chương trình mã hóa và giải mã file dữ liệu bằng mật mã
AES”. Với mục tiêu trên, báo cáo sẽ được trình bày gồm các chương và bố cục
sau:
Chương 1: Tổng quan về đề tài
Chương 2: Xây dựng chương trình

Chương 3: Kết quả thực nghiệm
Tuy nhiên, do thời gian thực hiện báo cáo mơn học có hạn và kiến thức
còn nhiều hạn chế, nên đề tài vẫn cịn rất nhiều những thiếu sót, điểm bất cập và
các vấn đề chưa thể xử lý triệt để. Nhóm em rất mong nhận được sự góp ý của
thầy và các bạn để báo cáo hồn thiện hơn. Nhóm em xin chân thành cảm ơn!

1


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

CHƯƠNG 1. TỔNG QUAN ĐỀ TÀI
1.1 Giới thiệu về hệ mật mã AES
AES (viết tắt của từ tiếng anh: Advanced Encryption Standard, hay Tiêu
chuẩn mã hóa nâng cao) là một thuật tốn mã hóa khối được chính phủ Hoa Kỳ áp
dụng làm tiêu chuẩn mã hóa.


Thuật tốn được xây dựng dựa trên Rijndael Cipher phát triển bởi 2 nhà
mật mã học người Bỉ: Joan Daemen và Vincent Rijmen.



AES làm việc với các khối dữ liệu 128bit và độ dài khóa 128bit, 192bit
hoặc 256bit. Các khóa mở rộng sử dụng trong chu trình được tạo ra bởi
thủ tục sinh khóa Rijndael.



Hầu hết các phép toán trong thuật toán AES đều thực hiện trong một

trường hữu hạn của các byte. Mỗi khối dữ liệu 128 bit đầu vào được chia
thành 16byte, có thể xếp thành 4 cột, mỗi cột 4 phần tử hay một ma trận
4x4 của các byte, gọi là ma trận State.



Tùy thuộc vào độ dài của khóa khi sử dụng 128bit, 192bit hay 256bit mà
thuật toán được thực hiện với số lần lặp khác nhau.

1.2 Thuật tốn mã hóa AES
Tiêu chuẩn mã hóa nâng cao (AES-Advanced Encryption Standard) là mật
mã khóa đối xứng và nó là mật mã khối lặp đi lặp lại với kích thước khối cố định
là 128 bit và độ dài khóa thay đổi, tức là có thể là 128, 192 hoặc 256 bit. Các phép
biến đổi khác nhau hoạt động dựa trên các kết quả trung gian, được gọi là State.
State là một mảng hình chữ nhật gồm các byte và vì kích thước khối là 128 bit,
tức là 16 byte, nên mảng có kích thước 4x4. Khóa mật mã được mơ tả tương tự
như một mảng hình chữ nhật có bốn hàng. Số cột của khóa mật mã AES được

2

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

thay đổi theo độ dài khóa, với khóa 128 bit có số cột là 4, khóa 192 bit có 6 cột và
khóa 256 bit có 8 cột. Khóa sẽ thực hiện mở rộng khóa để tạo các khóa vịng,
khóa có kích thước 128 bit có 10 vịng, khóa 192 có 12 vịng và khóa 256 thực
hiện 14 vịng. Một dữ liệu đầu vào được mã hóa với một khóa cho trước thơng
qua các phép tốn SubBytes, ShiftRows, MixColumns và AddRound Key tương

ứng để tạo ra bản mã. Bản mã này cũng thực hiện các phép toán ngược
InvSubBytes, InvShiftRows, InvMixColumn và AddRound Key để được bản dữ
liệu ban đầu. Hình dưới đây mơ tả cấu trúc của thuật tốn AES.

Hình 1. 1. Cấu trúc thuật toán mã AES
1.3 Mục tiêu đề tài
 Thực hiện mã hóa và giải mã một file dữ liệu sử dụng mật mã AES.


Dữ liệu sau khi được thực hiện giải mã và mã hóa sẽ được lưu ra một file
khác.



Sử dụng ngơn ngữ lập trình java.
3

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66



Thực hiện mã hóa và giải mã với 3 khóa có độ dài 128 bit, 192 bit và 256
bit.



Xác định thời gian mã hóa và giải mã.


4

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

CHƯƠNG 2. XÂY DỰNG CHƯƠNG TRÌNH
2.1 Ý tưởng bài tốn
Chương trình thực hiện đọc file dữ liệu, tiếp đó sử dụng thuật tốn AES
để mã hóa dữ liệu. Chương trình cho phép người dùng chọn file mã hóa, file ghi
sau khi mã hóa, nhập khóa từ bàn phím và tính tốn thời gian hoạt động của
chương trình. Dữ liệu được mã hóa (giải mã) sẽ được lưu ra file người dùng lựa
chọn.
2.2 Các hàm mã hóa
2.2.1 SubBytes
Nhiều mật mã khối khác nhau sử dụng một phép thay thế đặc biệt được
gọi là "S-box". AES cũng có bảng S-box này, nó gọi là "Chuyển đổi SubBytes".
Bảng S-box cung cấp một phép biến đổi có thể đảo ngược các phân đoạn của văn
bản rõ trong q trình mã hóa, với phép chuyển ngược lại trong q trình giải mã.
Với AES, nó là một hàm đơn giản được áp dụng lặp đi lặp lại cho mỗi byte trong
các giai đoạn mã hóa, trả về một byte. Mỗi giá trị trong số 256 byte có thể có
được chuyển đổi thành giá trị byte khác với phép biến đổi SubBytes, là một hoán
vị đầy đủ, có nghĩa là mọi phần tử đều được thay đổi và tất cả 256 phần tử có thể
được biểu diễn là kết quả của một sự thay đổi, sao cho khơng có hai phần tử khác
byte được thay đổi thành byte tương tự.

5


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

Hình 1. 2 . Thực hiện SubBytes
Chương trình thực hiện SubBytes:
void SubBytes(char[] state) {
for (int i = 0; i < 16; i++) {
state[i] = sbox[state[i]];
}
}
Thực hiện SubBytes cho từng phần tử của mảng state qua bảng sbox ta được một
mảng 4x4 mới.
2.2.2 ShiftRows
Trong hoạt động này, mỗi hàng của trạng thái được dịch chuyển theo chu
kỳ sang trái, tùy thuộc vào chỉ số hàng là một hoán vị được thực hiện từng hàng
trên mảng State, độc lập với khóa.


Hàng thứ nhất được dịch sang trái 0 vị trí.
6

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66




Hàng thứ 2 được dịch sang trái 1 vị trí.



Hàng thứ 3 được dịch sang trái 2 vị trí.



Hàng thứ 4 được dịch sang trái 3 vị trí.

Hình 1. 3. Hàm ShiftRows
Chương trình thực hiện của hàm ShiftRows
void ShiftRows(char[] state) {
char tmp[] = new char[16];
tmp[0] = state[0];//tmp theo cot
tmp[1] = state[5];
tmp[2] = state[10];
tmp[3] = state[15];

tmp[4] = state[4];

7

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

tmp[5] = state[9];
tmp[6] = state[14];

tmp[7] = state[3];

tmp[8] = state[8];
tmp[9] = state[13];
tmp[10] = state[2];
tmp[11] = state[7];

tmp[12] = state[12];
tmp[13] = state[1];
tmp[14] = state[6];
tmp[15] = state[11];
for (int i = 0; i < 16; i++) {
state[i] = tmp[i];
}
}
Thực hiện dịch trái hàng thứ 2 một byte, hàng thứ 3 hai byte, hàng thứ 4 ba byte
ta được các vị trí so với mảng state ban đầu.
2.2.3 MixColumns
Trong bước MixColumns, bốn byte của mỗi cột của trạng thái được kết
hợp bằng cách sử dụng sự biến đổi. Hàm MixColumns lấy bốn byte làm đầu vào

8

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

và xuất ra bốn byte, trong đó mỗi byte đầu vào ảnh hưởng đến cả bốn byte đầu ra.
Cùng với ShiftRows, MixColumns cung cấp sự khuếch tán trong mật mã.

Trong quá trình hoạt động này, mỗi cột được chuyển đổi bằng cách sử
dụng một ma trận cố định (ma trận nhân với cột cho giá trị mới của cột trong
state)

Hình 1. 4 . Hàm MixColumns
Chương trình thực hiện của hàm MixColumns
void MixColumns(char[] state) {
char[] tmp = new char[16];
tmp[0] = (char) (mul2[state[0]] ^ mul3[state[1]] ^ state[2] ^ state[3]);
tmp[1] = (char) (state[0] ^ mul2[state[1]] ^ mul3[state[2]] ^ state[3]);
tmp[2] = (char) (state[0] ^ state[1] ^ mul2[state[2]] ^ mul3[state[3]]);
tmp[3] = (char) (mul3[state[0]] ^ state[1] ^ state[2] ^ mul2[state[3]]);
9

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

tmp[4] = (char) (mul2[state[4]] ^ mul3[state[5]] ^ state[6] ^ state[7]);
tmp[5] = (char) (state[4] ^ mul2[state[5]] ^ mul3[state[6]] ^ state[7]);
tmp[6] = (char) (state[4] ^ state[5] ^ mul2[state[6]] ^ mul3[state[7]]);
tmp[7] = (char) (mul3[state[4]] ^ state[5] ^ state[6] ^ mul2[state[7]]);

tmp[8] = (char) (mul2[state[8]] ^ mul3[state[9]] ^ state[10] ^ state[11]);
tmp[9] = (char) (state[8] ^ mul2[state[9]] ^ mul3[state[10]] ^ state[11]);
tmp[10] = (char) (state[8] ^ state[9] ^ mul2[state[10]] ^ mul3[state[11]]);
tmp[11] = (char) (mul3[state[8]] ^ state[9] ^ state[10] ^ mul2[state[11]]);

tmp[12] = (char) (mul2[state[12]] ^ mul3[state[13]] ^ state[14] ^ state[15]);

tmp[13] = (char) (state[12] ^ mul2[state[13]] ^ mul3[state[14]] ^ state[15]);
tmp[14] = (char) (state[12] ^ state[13] ^ mul2[state[14]] ^ mul3[state[15]]);
tmp[15] = (char) (mul3[state[12]] ^ state[13] ^ state[14] ^ mul2[state[15]]);
for (int i = 0; i < 16; i++) {
state[i] = tmp[i];
}
}
2.2.4 AddRoundKey
Đối với khóa 128 bit hàm AddRoundKey được áp dụng từ vòng lặp thứ
nhất tới vòng lặp thứ 10. Đối với khóa 192 bit hàm thực hiện từ vịng lặp thứ nhất

10

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

tới thứ 12. Cịn đối với khóa 256 bit hàm thực hiện từ vòng lặp thứ nhất tới thứ
14. Trong biến AddRoundKey(), một khóa vịng được cộng với state bằng một
phép XOR theo từng bit đơn giản. Mỗi khóa vịng gồm có 4 từ (128 bit) được lấy
từ lịch trình khóa. Bốn từ đó được cộng vào mỗi cột của state sao cho

Hình 1. 5 . Hàm AddRoundKey
Chương trình thực hiện của hàm AddRoundKey
void AddRoundKey(char[] state, char[] roundKey) {
for (int i = 0; i < 16; i++) {
state[i] ^= roundKey[i];
}
}

2.3 Các hàm giải mã
Giải mã AES được thực hiện bằng cách sử dụng đảo ngược của các phép
biến đổi, trong thứ tự thích hợp.
2.3.1 InvSubBytes
Hàm InvSubBytes là hàm ngược so với hàm SubByte. Hàm này sử dụng bảng
rsbox để chuyển đổi trạng thái.
Chương trình thực hiện của hàm InvSubByte
11

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

void InvSubBytes(char[] state) {
for (int i = 0; i < 16; i++) {
state[i] = rsbox[state[i]];
}
}
2.3.2 InvShiftRows
Hàm InvShiftRow là hàm ngược của hàm ShiftRows. Hàng đầu tiên của state
được giữ nguyên, các hàng 2, 3, 4 của state được lần lượt dịch trái 3 byte, 2 byte
và 1 byte.
Chương trình thực hiện của hàm InvShiftRows
void InvShiftRows(char[] state) {
char tmp[] = new char[16];
tmp[0] = state[0];//tmp theo cot
tmp[1] = state[13];
tmp[2] = state[10];
tmp[3] = state[7];


tmp[4] = state[4];
tmp[5] = state[1];
tmp[6] = state[14];
tmp[7] = state[11];

12

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

tmp[8] = state[8];
tmp[9] = state[5];
tmp[10] = state[2];
tmp[11] = state[15];

tmp[12] = state[12];
tmp[13] = state[9];
tmp[14] = state[6];
tmp[15] = state[3];
for (int i = 0; i < 16; i++) {
state[i] = tmp[i];
}
}
2.3.3 InvMixColumns
Hàm InvMixColumns là hàm ngược của hàm MixColumns.
Chương trình thực hiện của hàm InvMixColumns
void InvMixColumns(char[] state) {

char[] tmp = new char[16];
tmp[0] = (char) (mulE[state[0]] ^ mulB[state[1]] ^ mulD[state[2]] ^
mul9[state[3]]);

13

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

tmp[1] = (char) (mul9[state[0]] ^ mulE[state[1]] ^ mulB[state[2]] ^
mulD[state[3]]);
tmp[2] = (char) (mulD[state[0]] ^ mul9[state[1]] ^ mulE[state[2]] ^
mulB[state[3]]);
tmp[3] = (char) (mulB[state[0]] ^ mulD[state[1]] ^ mul9[state[2]] ^
mulE[state[3]]);

tmp[4] = (char) (mulE[state[4]] ^ mulB[state[5]] ^ mulD[state[6]] ^
mul9[state[7]]);
tmp[5] = (char) (mul9[state[4]] ^ mulE[state[5]] ^ mulB[state[6]] ^
mulD[state[7]]);
tmp[6] = (char) (mulD[state[4]] ^ mul9[state[5]] ^ mulE[state[6]] ^
mulB[state[7]]);
tmp[7] = (char) (mulB[state[4]] ^ mulD[state[5]] ^ mul9[state[6]] ^
mulE[state[7]]);

tmp[8] = (char) (mulE[state[8]] ^ mulB[state[9]] ^ mulD[state[10]] ^
mul9[state[11]]);
tmp[9] = (char) (mul9[state[8]] ^ mulE[state[9]] ^ mulB[state[10]] ^

mulD[state[11]]);
tmp[10] = (char) (mulD[state[8]] ^ mul9[state[9]] ^ mulE[state[10]] ^
mulB[state[11]]);

14

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

tmp[11] = (char) (mulB[state[8]] ^ mulD[state[9]] ^ mul9[state[10]] ^
mulE[state[11]]);

tmp[12] = (char) (mulE[state[12]] ^ mulB[state[13]] ^ mulD[state[14]] ^
mul9[state[15]]);
tmp[13] = (char) (mul9[state[12]] ^ mulE[state[13]] ^ mulB[state[14]] ^
mulD[state[15]]);
tmp[14] = (char) (mulD[state[12]] ^ mul9[state[13]] ^ mulE[state[14]] ^
mulB[state[15]]);
tmp[15] = (char) (mulB[state[12]] ^ mulD[state[13]] ^ mul9[state[14]] ^
mulE[state[15]]);
for (int i = 0; i < 16; i++) {
state[i] = tmp[i];
}
}
2.3.4 AddRoundKey
Hàm AddRoundKey do hàm này chỉ thực hiện hàm XOR nên bản thân nó
cũng chính là đảo của chính nó.
Chương trình thực hiện của hàm AddRoundKey

void AddRoundKey(char[] state, char[] roundKey) {
for (int i = 0; i < 16; i++) {
state[i] ^= roundKey[i];
}
15

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

}

2.4 Chương trình thực hiện mã hóa và giải mã
2.4.1 Chương trình thực hiện mã hóa
Trước tiên, chương trình thực hiện mở rộng khóa với hàm
KeyExpansion(). Mảng expandedKey được dùng để lưu các khóa vịng được tạo
ra từ hàm KeyExpansion(). Độ lớn của mảng phụ thuộc vào kích thước của khóa,
đối với khóa 128 bit độ rộng của expandedKey là 176 byte, đối với khóa 192 bit
là 208 byte, và khóa 256 bit là 240 byte.
Tiếp theo, chương trình thực hiện các hàm SubBytes, ShiftRows,
MixColumns và AddRoundKey. Mỗi khóa có độ dài khác nhau có số vịng lặp
thực hiện là khác nhau. Khóa 128 bit thực hiện 10 vịng lặp, khóa 192 thực hiện
12 vịng lặp và khóa 256 thực hiện 14 vòng lặp.
char[] AES_Encrypt(char[] message, char[] key, int lengthKey) {
char[] state = new char[16];
for (int i = 0; i < 16; i++) {
state[i] = (char) message[i];
}
int numberOfRounds = 0;

switch (lengthKey) {
case 128:

16

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

numberOfRounds = 9;
break;
case 192:
numberOfRounds = 11;
break;
case 256:
numberOfRounds = 13;
break;
}
char[] expandedKey = new char[(numberOfRounds + 2) * 16];
KeyExpansion(key, expandedKey, lengthKey);
//add roundkey
AddRoundKey(state, Arrays.copyOfRange(expandedKey, 0, 16));
//vong lap
for (int i = 0; i < numberOfRounds; i++) {
SubBytes(state);
ShiftRows(state);
MixColumns(state);
AddRoundKey(state, Arrays.copyOfRange(expandedKey, 16 * (i + 1), 16
* (i + 1) + 16));

}
//final round

17

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

SubBytes(state);
ShiftRows(state);
AddRoundKey(state, Arrays.copyOfRange(expandedKey, (numberOfRounds
+ 1) * 16, (numberOfRounds + 2) * 16));
for (int i = 0; i < 16; i++) {
message[i] = state[i];
}
return message;
}
2.4.2 Chương trình thực hiện giải mã
Chương trình thực hiện giải mã đọc dữ liệu đã được mã hóa từ file dữ liệu
cùng với khóa được nhập từ người dùng để giải mã ra bản dữ liệu ban đầu.
Chương trình thực hiện giải mã là hàm ngược của chương trình thực hiện mã hóa.
char[] AES_Decrypt(char[] cipher, char[] key, int lengthKey) {
char[] state = new char[16];
for (int i = 0; i < 16; i++) {
state[i] = (char) cipher[i];
}
int numberOfRounds = 0;
switch (lengthKey) {

case 128:
numberOfRounds = 9;

18

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

break;
case 192:
numberOfRounds = 11;
break;
case 256:
numberOfRounds = 13;
break;
}
//

System.out.println("So vong :" + numberOfRounds);
char[] expandedKey = new char[(numberOfRounds + 2) * 16];
KeyExpansion(key, expandedKey, lengthKey);
//add roundkey
AddRoundKey(state, Arrays.copyOfRange(expandedKey, (numberOfRounds

+ 1) * 16, (numberOfRounds + 2) * 16));
for (int i = 0; i < numberOfRounds; i++) {
InvShiftRows(state);
InvSubBytes(state);

AddRoundKey(state, Arrays.copyOfRange(expandedKey, 16 *
(numberOfRounds - i), 16 * (numberOfRounds - i) + 16));
InvMixColumns(state);
}
//final round

19

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.C.33.44.55.54.78.655.43.22.2.4.55.2237.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.66

InvShiftRows(state);
InvSubBytes(state);
AddRoundKey(state, Arrays.copyOfRange(expandedKey, 0, 16));
for (int i = 0; i < 16; i++) {
cipher[i] = state[i];
}
return cipher;
}

20

37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.55.77.77.99.44.45.67.22.55.77.C.37.99.44.45.67.22.99


×