AES (viết tắt của từ tiếng Anh: Advanced Encryption Standard, hay Tiêu chuẩn mã hóa tiên tiến) là một thuật toán mã hóa khối được chính phủ Mỹ áp dụng làm tiêu chuẩn mã hóa. Thuật toán AES làm việc với khối dữ liệu 128 bit và khóa độ dài là 128 bit, 192 bit và 256 bit. Mã hóa dùng AES là mã hóa khối lặp gồm nhiều chu trình, các khóa con sử dụng trong các chu trình được tạo ra bởi quá trình tạo khóa con Rijndael.Trong bài báo cáo này chúng ta sẽ tìm hiểu về các chu trình làm việc của phương pháp mã hóa AES, các chế độ mã hóa ECB và CBC và ứng dụng viết một chương trình mã hóa và giải mã bằng AES sử dụng ngôn ngữ C++, rồi sau đó sẽ tìm hiểu các dạng tất công vào AES và phương pháp phòng tránh.
Trang 1HỌC PHẦN: CƠ SỞ AN TOÀN & BẢO MẬT THÔNG TIN
ĐỀ TÀI: VIẾT CHƯƠNG TRÌNH MÃ HÓA
VÀ GIẢI MÃ BẰNG AES SỬ DỤNG NGÔN NGỮ C++
Giáo viên hướng dẫn:
Sinh viên thực hiện:
Hà Nội, 2020
Trang 2MỤC LỤC
LỜI NÓI ĐẦU 3
CHƯƠNG I: TỔNG QUAN AES 4
CHƯƠNG II: HÀM SUBBYTE VÀ INVSUBBYTES 6
1 Hàm SubBytes 6
2 Hàm InvSubBytes 8
CHƯƠNG III: HÀM SHIFTROWS VÀ INVSHIFTROWS 10
1 Hàm ShiftRows 10
2 Hàm InvShiftRows 10
CHƯƠNG IV: HÀM MIXCOLUMNS VÀ INVMIXCOLUMNS 11
1 Hàm MixColumns 11
2 Hàm InvMixColumns 12
CHƯƠNG V: HÀM ADDROUNDKEY 13
CHƯƠNG VI: CHẾ ĐỘ MÃ HÓA ECB và CBC 14
1 Chế độ sách mã điện tử ECB (Electronic Code Book) 14
2 Chế độ xích liên kết khối mã CBC (Cipher block Chaining) 15
CHƯƠNG V: ỨNG DỤNG VIẾT CHƯƠNG TRÌNH MÃ HÓA VÀ GIẢI MÃ BẰNG AES SỬ DỤNG C++ 18
1 Hàm mã hóa Encrypt AES 18
2 Hàm giải mã Decrypt AES 18
3 Khóa 3 chế độ 128/192/256 19
4 Form chương trình 20
VI CÁC DẠNG TẤN CÔNG VÀO AES VÀ PHƯƠNG PHÁP PHÒNG CHỐNG 21
1 Side-channel attack 21
2 Known attacks 21
3 Các phương pháp phòng chống 21
KẾT LUẬN VÀ ĐÁNH GIÁ THUẬT TOÁN AES 22
TÀI LIỆU THAM KHẢO 22
Trang 3LỜI NÓI ĐẦU
Từ trước công nguyên, con người đã phải quan tâm tới việc làm thế nào để đảm bảo an toán bí mật cho các tài liệu, văn bản quan trọng, đặc biệt là trong lĩnh vực quân sự, ngoại giao Ngày nay với sự xuất hiện của máy tính, các tài liệu văn bản giấy tờ và các thông tin quan trọng đều được số hóa và xử lý trên máy tính, được truyền đi trong môi trường mạng - một môi trường mặc định là có nhiều rủi ro, kém an toàn Do đó yêu cầu về việc có một cơ chế, giải pháp để bảo vệ sự an toàn
và bí mật của các thông tin nhạy cảm, quan trọng ngày càng trở nên cần thiết Các phương pháp mã hóa dữ liệu lần lượt được ra đời và AES là một trong những phương pháp mã hóa tiêu chuẩn
AES (viết tắt của từ tiếng Anh: Advanced Encryption Standard, hay Tiêu chuẩn mãhóa tiên tiến) là một thuật toán mã hóa khối được chính phủ Mỹ áp dụng làm tiêu chuẩn mã hóa Thuật toán AES làm việc với khối dữ liệu 128 bit và khóa độ dài là
128 bit, 192 bit và 256 bit Mã hóa dùng AES là mã hóa khối lặp gồm nhiều chu trình, các khóa con sử dụng trong các chu trình được tạo ra bởi quá trình tạo khóa con Rijndael
Trong bài báo cáo này chúng ta sẽ tìm hiểu về các chu trình làm việc của phương pháp mã hóa AES, các chế độ mã hóa ECB và CBC và ứng dụng viết một chương trình mã hóa và giải mã bằng AES sử dụng ngôn ngữ C++, rồi sau đó sẽ tìm hiểu các dạng tất công vào AES và phương pháp phòng tránh
Để hoàn thành bài báo cáo này, chúng tôi xin gửi lời cám ơn chân thành đến TS Nguyễn Đào Trường đã tận tình giúp đỡ và truyền đạt những kinh nghiệm quý báu
trong suốt thời gian thực hiện đề tài
Do hạn chế về thời gian nghiên cứu đề tài và kiến thức chuyên môn nên sẽ không tránh khỏi những thiếu sót, kính mong được sự góp ý từ Thầy và mọi người để hoàn thiện bài báo cáo tốt hơn!
Trang 4CHƯƠNG I: TỔNG QUAN AES Khái niệm từ (Word) trong AES
Bốn byte trên mỗi cột trong mảng trạng thái state tạo thành 1 từ 32 bit, trong đó số thứ tự của hàng r (0≤r<4) cho biết chỉ số của bốn byte trong mỗi từ Từ định nghĩa state ở trên có thể coi state là mảng một chiều chứa các từ 32 bit
Tương tự như đối với mảng khóa cũng có thể biểu diễn thành mảng một chiều chứa các từ 32 bit như công thức dưới đây với số lượng từ khóa phụ thuộc vào Nk
(Nk=4, 6, 8)
Thuật toán của AES
Thuật toán AES khá phức tạp, được mô tả khái quát gồm 3 bước như sau:
1 Vòng khởi tạo chỉ gồm phép AddRoundKey
Nr -1 Vòng lặp gồm 4 phép biển đổi lần lượt: SubBytes, ShiftRows,
Trang 5chỗ, trong đó mỗi dòng trong state được dịch một số bước theo chu kỳ -
MixColumns—trộn các cột trong state, kết hợp 4 bytes trong mỗi cột -
AddRoundKey
4 Final Round (không MixColumns) - SubBytes - ShiftRows - AddRoundKey
Các phép biến đổi Substitute bytes, Shift rows, Mix columns có phép biếnđổi ngược tương ứng là Inverse sub bytes, Inverse shift rows, Inverse mix cols.Riêng phép biến đổi Add row key đơn giản chỉ là phép XOR nên phép biến đổingược cũng là Add row key Vận dụng các phép biến đổi ngược trên, thuật toán giải
mã AES cũng gồm 10 vòng thực hiện theo chiều ngược lại Kích thước khóa banđầu là 128 bít (gồm 16 byte) AES dùng hàm Expand key để mở rộng kích thướckhóa thành 44 word 32 bít 44 word này được chia thành 11 cụm khóa con, mỗikhóa con 4 word làm tham số cho 11 thao tác Add row key
Trang 6CHƯƠNG II: HÀM SUBBYTE VÀ INVSUBBYTES
1 Hàm SubBytes
Phép biến đổi SubBytes: Là phép thay thế byte phi tuyến tính, ở phép thay thế này
nó tác động độc lập đến từng byte trong trạng thái hiện hành Phép biến đổi
SubBytes được thực hiện bằng cách tra cứu bảng thay thế (S-box) với tham số đầu vào là các byte trong bảng trạng thái S-box được xây dựng như sau:
Bước 1: Điền các con số từ 0 đến 255 vào bảng theo từng hàng Vậy hàng 0 gồm các con số {00}, {01}, …{0F} (thập lục phân) Hàng 1 gồm các con số {10}, {11},…, {1F} Điều này có nghĩa là tại hàng x cột y có giá trị {xy}
Bước 2: Thay thế mỗi byte trong bảng bằng giá trị nghịch đảo trong trường GF(28 ) Quy ước nghịch đảo của {00} cũng là {00}
Bước 3: Mỗi byte trong ma trận state được thay thế bởi 1 byte trong Rijndael S-box, hay bij = S(aij)
trong đó, 0 ≤ i ≤8 là bit thứ i của byte b tương ứng và ci là bit thứ thứ i của byte c với giá trị {63} hay {01100011}
Trang 7Trong đó phép cộng thực hiện như phép XOR Bảng sau trình bày nội dung bảng box sau khi tính toán.
Trang 8S-2 Hàm InvSubBytes
Phép biến đổi ngược InvSubBytes: là phép thay thế biến đổi ngược với SubBytes
Là một phép thay thế byte, các byte thay thế được thực hiện bằng cách tra bảng thaythế ngược IS Bảng thay thế ngược IS này được xây dựng như sau: Trước tiên, cũngphải xây dựng một bảng Inverse SubBytes (IS- box) Nghĩa là nếu với đầu vào {95}, S-box cho ra kết quả {2A}, thì với đầu vào là {2A}, IS sẽ cho ra lại kết quả {95} Việc xây dựng hộp IS cũng giống như xây dựng S-box tại bước 1 và bước 2 Tại bước 3, IS thực hiện phép thay thế sau:
Với di là bit thứ i của số {05} tức d7 d6 d0 = 00000101
Bảng sau trình bày nội dung bảng thay thế ngược IS sau khi tính toán
Trang 9Như vậy: phép biến đổi InvSubBytes thực hiện như sau: Mỗi byte trong ma trận state S, dưới dạng thập lục phân là {xy}, được thay thế bằng giá trị trong bảng IS tạidòng x cột y.
Mục đích của phép biến đổi SubBytes: S-box dùng để chống lại hình thức tấn công thám mã vi sai và thám mã tuyến tính Giữa input và output của phép Substitute bytes không thể mô tả bằng một công thức toán đơn giản
Trang 10CHƯƠNG III: HÀM SHIFTROWS VÀ INVSHIFTROWS
1 Hàm ShiftRows
Phép biến đổi ShiftRows: Thao tác ShiftRows thực hiện hoán vị các byte trong ma
trận state theo cách thức sau:
Phép biến đổi InvShiftRows: Phép biến đổi InvShiftRows thực hiện ngược lại
với phép ShiftRows, nghĩa là:
Trang 11CHƯƠNG IV: HÀM MIXCOLUMNS VÀ INVMIXCOLUMNS
1 Hàm MixColumns
Phép biến đổi MixColumns: Phép biến đổi MixColumns thực hiện biến đổi độc lập
từng cột trong ma trận state bằng một phép nhân đa thức Mỗi cột của state đươc coi
là biểu diễn của một đa thức f(x) trong GF(2^8) như vậy phép biến đổi
MixColumns chính là phép nhân theo modulo với x^4+1 với một đa thức cố định định nghĩa như sau:
Phép nhân đa thức trên có thể biểu diễn dưới dạng phép nhân ma trận như sau
Ví dụ về phép MixColumns:
Trang 122 Hàm InvMixColumns
Phép biến đổi ngược InvMixColumns: Là phép biến đổi ngược với phép biến đổi
MixColumns InvMixColumns cũng thực hiện thao tác theo từng cột của trạng thái, xem mỗi cột như một đa thức bậc 3 gồm 4 hạng tử trên trường GF(2^8) Các cột của phép InvMixColumns được nhân theo modulo ( x^4 + 1 ) với đa thức nghịch đảo a(x) chính là đa thức a^-1(x) được định nghĩa:
Như vậy phép InvMixColumns cũng được biểu diễn tương đương với phép nhân
ma trận sau
Mục đích của MixColumns: Việc coi mỗi cột là một đa thức bậc 3, rồi nhân mỗi cộtvới đa thức a(x) sau đó modulo ( x4 1 ) đã làm cho mỗi byte trong cột kết quả đều phụ thuộc vào bốn byte trong cột ban đầu Thao tác MixColumns kết hợp với
ShiftRows đảm bảo rằng sau một vài vòng biến đổi, 128 bit trong kết quả đều phụ thuộc vào tất cả 128 bit ban đầu Điều này tạo ra tính khuếch tán (diffusion) cần thiết cho mã hóa
Trang 13CHƯƠNG V: HÀM ADDROUNDKEY
Trong thao tác AddRoundKey, 128 bit của ma trận state sẽ được XOR với 128 bit của khóa con của từng vòng Vì sử dụng phép XOR nên phép biến đổi ngược của AddRoundKey trong cấu trúc giải mã cũng chính là AddRoundKey Việc kết hợp với khóa bí mật tạo ra tính làm rối (confusion) của mã hóa Sự phức tạp của thao tác
mở rộng khóa (KeySchedule) giúp gia tăng tính làm rối này
Trang 14CHƯƠNG VI: CHẾ ĐỘ MÃ HÓA ECB và CBC
1 Chế độ sách mã điện tử ECB (Electronic Code Book)
ECB là chế độ mã hóa từng khối bit độc lập Với cùng một khóa mã K, mỗi khối plaintext ứng với một giá trị ciphertext cố định và ngược lại
Quá trình mã hóa ECB
Trang 15Ciphertext là đầu vào trực tiếp để thực thi thuật toán giải mã với khóa mã K để tạo
Có thể thực hiện mã hóa/giải mã song song (parallel) nhiều khối dữ liệu cùnglúc Điều này giúp tăng tốc độ xử lý trong các hệ thống đòi hỏi mã hóa/giải
mã tốc độ cao
Nhược điểm:
Khả năng bảo mật kém Do giá trị plaintext và ciphertext được ánh xạ độc lậpmột-một nên thông tin mã hóa dễ bị sửa đổi bằng cách như xóa bớt khối dữ liệu, chèn thêm khối dữ liệu, hoán đổi vị trí khối dữ liệu để làm sai lệch thông tin tại nơi nhận
2 Chế độ xích liên kết khối mã CBC (Cipher block Chaining)
CBC là chế độ mã hóa chuỗi, kết quả mã hóa của khối dữ liệu trước (ciphertext) sẽ được tổ hợp với khối dữ liệu kế tiếp (plaintext) trước khi thực thi mã hóa
Trang 16 Quá trình mã hóa CBC
Biểu thức định nghĩa:
- C1 = CIPHk(P1+IV)
- Cj = CIPHk(Pj+Cj-1) với j=2, 3, …, n
Lần mã hóa đầu tiên:
- Plaintext XOR với vector khởi tạo IV
- Kết quả bước trên là đầu vào cho việc thực thi thuật toán mã hóa với khóa
mã K
Lần mã hóa sau lần đầu tiên:
- Plaintext XOR với ciphertext của lần mã hóa trước đó
- Kết quả bước trên là đầu vào cho việc thực thi thuật toán mã hóa với khóa
mã K
Trang 17 Quá trình giải mã CBC
Biểu thức định nghĩa:
- P1 = CIPHINVk(C1)+IV
- Pj = CIPHk(Cj)+Cj-1 với j=2, 3, …, n
Lần giải mã đầu tiên:
- Ciphertext được thực thi quá trình giải mã với khóa mã K
- Kết quả bước trên được XOR với vector khởi tạo IV để tạo ra plaintext
Lần giải mã sau lần đầu tiên:
- Ciphertext được thực thi quá trình giải mã với khóa mã K
- Kết quả bước trên được XOR với ciphertext sử dụng trong lần giải mã trước
để tạo ra plaintext
Nhận xét
Ưu điểm:
- Khả năng bảo mật cao hơn ECB Ciphertext của một khối dữ liệu plaintext
có thể khác nhau cho mỗi lần mã hóa vì nó phụ thuộc vào IV hoặc giá trị mã hóa (ciphertext) của khối dữ liệu liền trước
- Quá trình giải mã (mã hóa nghịch) vẫn có thể thực hiện song song nhiều khối dữ liệu
Nhược điểm:
- Thiết kế phần cứng phức tạp hơn ECB ngoài logic thực thi thuật toán mã hóa, người thiết kế cần thiết kế thêm:
- Logic quản lý độ dài chuỗi dữ liệu sẽ được mã hóa, cụ thể là số lượng khối
dữ liệu trong chuỗi dữ liệu
- Lỗi bit bị lan truyền Nếu một lỗi bit xuất hiện trên ciphertext của một khối
dữ liệu thì nó sẽ làm sai kết quả giải mã của khối đữ liệu đó và khối dữ liệu tiếp theo
- Không thể thực thi quá trình mã hóa song song vì xử lý của khối dữ liệu sau phụ thuộc vào ciphertext của khối dữ liệu trước, trừ lần mã hóa đầu tiên
Trang 18CHƯƠNG V: ỨNG DỤNG VIẾT CHƯƠNG TRÌNH MÃ HÓA VÀ GIẢI MÃ
BẰNG AES SỬ DỤNG C++
1 Hàm mã hóa Encrypt AES
2 Hàm giải mã Decrypt AES
K
private: System:: String ^ AESE( String ^ input , String ^ pass ) {
System::Security::Cryptography:: RijndaelManaged ^ AES = gcnew System::Security::Cryptography:: RijndaelManaged ();
System::Security::Cryptography:: MD5CryptoServiceProvider ^ Hash_AES = gcnew System::Security::Cryptography:: MD5CryptoServiceProvider ();
String ^ encrypted = L"" ; try
>GetBytes( pass ), System::Text:: ASCIIEncoding ::ASCII->GetBytes(modeTung));
array < Byte >^ Buffer = System::Text:: ASCIIEncoding
private: System:: String ^ AESD( String ^ input , String ^ pass ) {
System::Security::Cryptography:: RijndaelManaged ^ AES = gcnew System::Security::Cryptography:: RijndaelManaged ();
System::Security::Cryptography:: MD5CryptoServiceProvider ^ Hash_AES = gcnew System::Security::Cryptography:: MD5CryptoServiceProvider ();
String ^ decrypted = L"" ; try
{
//AES->Key =
System::Text::ASCIIEncoding::ASCII->GetBytes(pass);
String ^ modeTung = this->mode;
AES->Mode = Security::Cryptography:: CipherMode :: ECB ; System::Security::Cryptography:: ICryptoTransform ^ DESDecrypter = AES->CreateDecryptor(System::Text:: ASCIIEncoding ::ASCII-
>GetBytes( pass ), System::Text:: ASCIIEncoding ::ASCII->GetBytes(modeTung));
array < Byte >^ Buffer = Convert ::FromBase64String( input );
decrypted = System::Text:: ASCIIEncoding
::ASCII->GetString(DESDecrypter->TransformFinalBlock(Buffer, 0, Buffer->Length));
delete Hash_AES;
Trang 19button2->Enabled = false;
button3->Enabled = false;
} else {
lblNoti->Text = "" ; button2->Enabled = true;
button3->Enabled = true;
} }
else if (modeOpt == "192" ) {
if (txtKey->Text->Length != 24) {
lblNoti->ForeColor = System::Drawing:: Color ::Red; lblNoti->Text = "Length of secret key should be 24 for 192 bits key size" ;
button2->Enabled = false;
button3->Enabled = false;
} else {
lblNoti->Text = "" ; button2->Enabled = true;
button3->Enabled = true;
} }
else if (modeOpt == "256" ) {
if (txtKey->Text->Length != 32) {
lblNoti->ForeColor = System::Drawing:: Color ::Red; lblNoti->Text = "Length of secret key should be 32 for 256 bits key size" ;
button2->Enabled = false;
button3->Enabled = false;
} else {
lblNoti->Text = "" ; button2->Enabled = true;
button3->Enabled = true;
} }
else {
lblNoti->ForeColor = System::Drawing:: Color ::Red;
lblNoti->Text = "Required key size missing." ; button2->Enabled = false;
button3->Enabled = false;
} }
Trang 204 Form chương trình
Trang 21VI CÁC DẠNG TẤN CÔNG VÀO AES VÀ PHƯƠNG PHÁP PHÒNG
Phân loại :
o Tấn công thời gian
o Tấn công dựa vào lỗi
o Tấn công phân tích năng lượng
o Tấn công phân tích điện từ
2 Known attacks.
Vào năm 2002, Nicolas Courtois và Josef Pieprzyk phát hiện một tấn công trên lý thuyết gọi là tấn công XSL và chỉ ra điểm yếu tiềm tàng của AES
Tuy nhiên, một vài chuyên gia về mật mã học khác cũng chỉ ra một số vấn
đề trong cơ sở toán học của tấn công này và cho rằng các tác giả đã có sai lầm trong tính toán Việc tấn công dạng này có thực sự trở thành hiện thực hay không vẫn còn để ngỏ và cho tới nay thì tấn công XSL vẫn chỉ là suy đoán
Trang 22o Nếu một kẻ tấn công không thể tiếp cận vật lý với dữ liệu, dĩ nhiên khả năng đánh cắp khóa mã hóa sẽ khó khăn hơn Vì vậy, trước nhữngcuộc tấn công qua âm thanh tiềm tàng, bạn có thể sử dụng các giải pháp bảo vệ vật lý như đặt laptop vào các hộp cách ly âm thanh, không để ai lại gần máy tính khi đang giải mã dữ liệu hoặc sử dụng các nguồn âm thanh băng rộng tần số đủ cao để gây nhiễu.
Phương pháp 3: Kết hợp cả 2 cách trên
KẾT LUẬN VÀ ĐÁNH GIÁ THUẬT TOÁN AES
Thiết kế và độ dài khóa của thuật toán AES ( 128, 192 và 256 bit ) là đủ an toàn để bảo vệ các thông tin được xếp vào loại tối mật nhưng về an ninh của AES thì các nhà khoa học đánh giá là chưa cao Nếu các kỹ thuật tấn công được cải thiện thì AES có thể bị phá vỡ
Một vấn đề khác nữa là cấu trúc toán học của AES khá đơn giản
TÀI LIỆU THAM KHẢO
Visual C++ Tutorial 19 -Windows Forms Application: Encrypt data from simple string Part 1/2/3: https://www.youtube.com/watch?