1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài tập môn học: Viết chương trình mã hóa và giải mã bằng mật mã AES

34 191 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Viết chương trình mã hóa và giải mã bằng mật mã AES
Tác giả Trương Quốc Quân
Người hướng dẫn TS. Nguyễn Đào Trường
Trường học Học viện Kỹ thuật mật mã
Chuyên ngành Công nghệ thông tin
Thể loại bài tập môn học
Năm xuất bản 2021
Thành phố Hà Nội
Định dạng
Số trang 34
Dung lượng 1,36 MB

Cấu trúc

  • I. TỔNG QUAN AES (4)
    • 1. Khái niệm từ (Word) trong AES (4)
    • 2. Thuật toán của AES (4)
    • 3. Khái quát (4)
  • II. MÃ HÓA (6)
    • 1. Phương thức AddRoundKey (6)
    • 2. Phương thức SubBytes (6)
    • 3. Phương thức ShiftRows (7)
    • 4. Phương thức MixColumns (8)
  • III. GIẢI MÃ (9)
    • 1. Phương thức invShiftRows (9)
    • 2. Phương thức InvMixColumns (9)
  • IV. THUẬT TOÁN MỞ RỘNG KHÓA keyExpansion (11)
  • V. Các dạng tấn công vào AES và phương pháp phòng chống (13)
    • 1. Side-channel attack (13)
    • 2. Known attacks (13)
    • 3. Các phương pháp phòng chống (0)
  • VI. Ứng dụng viết chương trình mã hóa và giải mã AES sử dụng Python (14)
    • 1. Các hàm nhân Galois (14)
    • 2. Hàm RotWords (15)
    • 3. Hàm KeyExpansion (15)
    • 4. Các hàm addRoundKey, subBytes, shiftRows, gMixColumns (18)
    • 5. Các hàm invSubBytes, invShiftRows, gInvMixColumns (19)
    • 6. Các hàm phiên mã AES-128, AES-192, AES-256 (20)
    • 7. Các hàm giải mã AES-128, AES-192, AES-256 (22)
    • 8. Các hàm chức năng chuyển đổi string thành ma trận và ngược lại (23)
    • 9. Đóng gói thành hàm phiên mã và giải mã hoàn chỉnh (24)
    • 10. Các chế độ hoạt động (modus operandi – mode of operation) của mật mã khối, và ứng dụng vào phần mềm AES (26)
  • TÀI LIỆU THAM KHẢO (33)

Nội dung

Bài tập môn học: Viết chương trình mã hóa và giải mã bằng mật mã AES với mục tiêu tìm hiểu về các chu trình làm việc của phương pháp mã hóa AES 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ữ Python, rồi sau đó sẽ tìm hiểu các dạng tấn công vào AES và phương pháp phòng tránh.

TỔNG QUAN AES

Khái niệm từ (Word) trong AES

Mỗi cột trong mảng trạng thái state bao gồm bốn byte, tạo thành một từ 32 bit Chỉ số hàng r (0 ≤ r < 4) xác định vị trí của bốn byte trong mỗi từ Do đó, state có thể được xem như một mảng một chiều chứa các từ 32 bit.

Cũng giống như mảng khóa, mảng một chiều có thể được biểu diễn bằng các từ 32 bit, với số lượng từ khóa phụ thuộc vào giá trị Nk.

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, MixColumns, AddRoundKey

• 1 Vòng cuối gồm các phép biến đổi giống vòng lặp và không có phép MixColumns.

Khái quát

1 Mở rộng khóa - Các khóa phụ dùng trong các vòng lặp được sinh ra từ khóa chính AES sử dụng thủ tục sinh khóa Rijndael

3 Các vòng lặp đến Nr – 1: SubBytes – ShiftRows - MixColumns –

4 Vòng cuối (không MixColumns) – SubBytes – ShiftRows – AddRoundKey

Trong quá trình mã hóa, bước AddRoundKey kết hợp mỗi byte trong state với khóa phụ thông qua phép toán XOR Tiếp theo, bước SubBytes thực hiện thay thế phi tuyến tính, trong đó mỗi byte trong state được thay thế bằng một byte khác dựa trên bảng tham chiếu.

ShiftRows - bước đổi chỗ, 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

Các phép biến đổi trong mã hóa AES bao gồm Subbytes, ShiftRows và MixColumns, mỗi phép biến đổi này đều có phép biến đổi ngược tương ứng là InvSubBytes, InvShiftRows và InvMixColumns Đối với phép biến đổi AddRoundKey, do nó chỉ là phép XOR, nên phép biến đổi ngược cũng chính là AddRoundKey.

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 của AES có thể là 128 bits, 192 bits hoặc 256 bits Thuật toán sử dụng hàm keyExpansion để mở rộng khóa thành 44, 52 hoặc 60 từ, sau đó chia thành 11, 13 hoặc 15 cụm khóa con, mỗi cụm bao gồm 4 từ, được sử dụng cho bước AddRoundKey.

MÃ HÓA

Phương thức AddRoundKey

Trong phép biến đổi này, các cột của trạng thái sẽ được bổ sung Nb từ, được lấy từ bảng liệt kê khóa đã được mô tả trước đó.

Trong bài viết này, [b i ] đại diện cho từ trong danh sách khóa, trong khi “round” thể hiện số vòng trong khoảng 1 round N r Lưu ý rằng số vòng bắt đầu từ 1 do có điều kiện về khóa khởi tạo trước khi thực hiện hàm vòng.

Các từ trong bản liệt kê khóa được XOR với các cột trong trạng thái

Phương thức SubBytes

Phép thay thế byte không tuyến tính là một quá trình thao tác độc lập trên từng byte của trạng thái, nhằm tạo ra giá trị byte mới thông qua việc sử dụng bảng thay thế S-box.

SubBytes thao tác trên mỗi byte trong trạng thái một cách độc lập

• Phép thay thế này có thể đảo ngược bằng cách sử dụng bảng Inverse Sbox, sử dụng hệt như bảng Sbox thường

Phương thức ShiftRows

Trong hàm biến đổi ShiftRows(), các byte ở ba hàng cuối cùng của trạng thái được dịch vòng theo các độ lệch khác nhau Cụ thể, công thức được áp dụng là S’r,c = Sr,(c + shift(r, Nb)) mod Nb, với Nb = 4.

• Trong đó giá trị dịch shift (r, Nb) phụ thuộc vào số hàng r như sau: o Shift(1,4) = 1, shift(2,4) = 2, shift(3,4) = 3

Hàng đầu tiên giữ nguyên, trong khi ba hàng còn lại được dịch theo thứ tự: hàng thứ hai dịch vòng trái một lần, hàng thứ ba dịch vòng trái hai lần, và hàng thứ tư dịch vòng trái ba lần.

Phương thức MixColumns

• Phép biến đổi này thao tác một cách độc lập trên mỗi cột của trạng thái và xem mỗi cột như một đa thức bậc 4

• Ở dạng ma trận, phép biến đổi được dùng theo phương trình sau, với 0 ≤

• Trong đó tất cả giá trị là các phần tử thuộc trường hữu hạn

MixColumns thao tác độc lập trên mỗi cột trong trạng thái

GIẢI MÃ

Phương thức invShiftRows

Trong hàm biến đổi invShiftRows(), các byte trong ba hàng cuối cùng của trạng thái được dịch vòng với các độ lệch khác nhau Cụ thể, công thức được sử dụng là S’r,c = Sr,(c - shift(r, Nb)) mod Nb, với Nb = 4.

• Trong đó giá trị dịch shift (r, Nb) phụ thuộc vào số hàng r như sau: o Shift(1,4) = 1, shift(2,4) = 2, shift(3,4) = 3

Hàng đầu tiên không thay đổi, trong khi ba hàng tiếp theo được dịch sang phải theo thứ tự: hàng thứ hai dịch một lần sang phải, hàng thứ ba dịch hai lần sang phải, và hàng thứ tư dịch ba lần sang phải.

Phương thức InvMixColumns

• Phép biến đổi này thao tác một cách độc lập trên mỗi cột của trạng thái và xem mỗi cột như một đa thức bậc 4

• Ở dạng ma trận, phép biến đổi được dùng theo phương trình sau, với 0 ≤

- Trong đó tất cả giá trị là các phần tử thuộc trường hữu hạn

InvMixColumns thao tác độc lập trên mỗi cột trong trạng thái

THUẬT TOÁN MỞ RỘNG KHÓA keyExpansion

AES sử dụng thuật toán mở rộng khóa để chuyển đổi một khóa ngắn thành bộ khóa vòng, với các phiên bản AES-128, AES-192 và AES-256 có số lượng vòng khác nhau Thủ tục sinh khóa tạo ra các khóa vòng từ khóa gốc, và để thực hiện điều này, cần có bộ hằng số vòng, bắt đầu từ vòng thứ I của quy trình sinh khóa với một từ (word).

𝑟𝑐𝑜𝑛 𝑖 = [𝑟𝑐 𝑖 , 00 16 , 00 16 , 00 16 ] Trong đó, 𝑟𝑐 𝑖 được định nghĩa là một số 8bit được định nghĩa như sau:

𝑘ℎ𝑖 𝑖 = 1 𝑘ℎ𝑖 𝑖 > 1 𝑣à 𝑟𝑐 𝑖 < 80 16 𝑘ℎ𝑖 𝑖 > 1 𝑣à 𝑟𝑐 𝑖 ≥ 80 16 AES sử dụng 𝑟𝑐𝑜𝑛 10 cho AES-128, 𝑟𝑐𝑜𝑛 8 cho AES-192 và 𝑟𝑐𝑜𝑛 7 cho AES-256

𝑁 là độ dài khóa, đơn vị là word (32 bit) Với AES-128, 𝑁 = 4; với AES-192, 𝑁 = 6; và với AES-256, 𝑁 = 8

𝐾 0 , 𝐾 1 , … , 𝐾 𝑁−1 là các khối word của khóa gốc

𝑅 là số khóa vòng cần có Với AES-128, 𝑅 = 11; với AES-192, 𝑅 = 13; và với AES-256, 𝑅 15

𝑊 0 , 𝑊 1 , … , 𝑊 4𝑅−1 là số word của khóa vòng

Ta đồng thời định nghĩa các hàm RotWord và SubWord:

𝑡𝑟ườ𝑛𝑔 ℎợ𝑝 𝑘ℎá𝑐 Ảnh minh họa của quá trình sinh khóa được thế hiện như sau:

Các dạng tấn công vào AES và phương pháp phòng chống

Side-channel attack

• Side Channels (Kênh kề) được định nghĩa là các kênh đầu ra không mong muốn từ một hệ thống

Tấn công kênh bên, hay còn gọi là tấn công kênh kề, là một loại tấn công dễ thực hiện nhằm vào các hệ thống mã hóa Mục tiêu chính của loại tấn công này là phân tích các yếu tố, giao thức, mô-đun và thiết bị trong mỗi hệ thống để khai thác lỗ hổng bảo mật.

• 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ừ.

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

Một số chuyên gia mật mã học đã chỉ ra những vấn đề trong cơ sở toán học của tấn công XSL và cho rằng các tác giả có thể đã mắc sai lầm trong tính toán Tính khả thi của loại tấn công này vẫn còn chưa rõ ràng và hiện tại, tấn công XSL vẫn chỉ là một giả thuyết Do đó, việc nghiên cứu các phương pháp phòng chống là cần thiết để bảo vệ hệ thống khỏi những mối đe dọa tiềm tàng.

• Phương pháp 1: Mã hóa cực mạnh o Sử dụng các biện pháp để tăng tính bảo mật của các thuật toán mã hóa

Để bảo vệ dữ liệu theo phương pháp vật lý, việc ngăn chặn kẻ tấn công tiếp cận vật lý với dữ liệu là rất quan trọng, vì điều này làm giảm khả năng đánh cắp khóa mã hóa Để đối phó với các cuộc tấn công âm thanh tiềm tàng, bạn có thể áp dụng các biện pháp bảo vệ như sử dụng hộp cách ly âm thanh cho laptop, không cho phép 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

Các phương pháp phòng chống

Các hàm nhân Galois được ứng dụng theo lý thuyết của không gian hữu hạn Galois GF(2 8 )

Trong bài viết này, chúng ta quy định phép cộng là phép XOR trên từng bit, trong khi phép nhân với 1 được thực hiện bằng cách XOR với chính nó Phép nhân với 2 tương ứng với việc nhân với x, tức là nhân với 00000010 Thuật toán nhân với 2 sẽ dựa vào bit cao nhất (MSB) của số bị nhân để thực hiện phép toán.

0, chúng ta sẽ dịch trái số bị nhân và thêm 0 vào cuối Nếu MSB = 1, ta sẽ thêm một bước XOR với 00011011 (0x11B)

Trong thực tế, phép bắt MSB sẽ được kết hợp với phép dịch trái, do đó chỉ cần thực hiện XOR với 00001011 (0x1B) Đối với phép nhân lớn hơn 2, chúng ta sẽ áp dụng các tính chất giao hoán, kết hợp và phân phối của trường Galois.

The Galois multiplication is implemented through several functions The `mul2` function shifts each element of the input list `r` to the left by one position and applies a conditional XOR operation based on the highest bit The `mul3` function utilizes `mul2` and combines its result with the original input using the XOR operation Lastly, the `mul9` function iteratively applies `mul2` three times to the input list and then performs an XOR with the original list, effectively completing the Galois multiplication process.

Ứng dụng viết chương trình mã hóa và giải mã AES sử dụng Python

Các hàm nhân Galois

Các hàm nhân Galois được ứng dụng theo lý thuyết của không gian hữu hạn Galois GF(2 8 )

Trong bài viết này, chúng ta quy định phép cộng là phép XOR trên từng bit, trong khi phép nhân với 1 là phép XOR với chính nó Đối với phép nhân với 2, chúng ta thực hiện bằng cách nhân với x, tức là nhân với 00000010 Thuật toán nhân với 2 sẽ dựa vào bit cao nhất (MSB) của số bị nhân.

0, chúng ta sẽ dịch trái số bị nhân và thêm 0 vào cuối Nếu MSB = 1, ta sẽ thêm một bước XOR với 00011011 (0x11B)

Trong thực tiễn, chúng ta kết hợp phép bắt MSB với phép dịch trái bằng cách XOR với 00001011 (0x1B) Đối với phép nhân lớn hơn 2, chúng ta sẽ áp dụng các tính chất giao hoán, kết hợp và phân phối của trường Galois.

The Galois multiplication functions are implemented as follows: The `mul2` function shifts the input array `r` left and applies a conditional XOR with 0x1B based on the highest bit The `mul3` function utilizes `mul2` and combines the result with the original array using XOR The `mul9` function iteratively applies `mul2` three times before XORing with the original array The `mul11` function applies `mul2` twice, then XORs with the original array, followed by another `mul2` application and a final XOR The `mul13` function first applies `mul2`, XORs with the original, applies `mul2` twice, and performs another XOR Finally, the `mul14` function applies `mul2`, XORs with the original, applies `mul2` again, performs another XOR, and concludes with one last `mul2` application.

Hàm RotWords

Hàm RotWord được triển khai như sau: def rotWord(r): r[0], r[1], r[2], r[3] = r[1], r[2], r[3], r[0] return r

Hàm KeyExpansion

Hàm KeyExpansion trong báo cáo này nhận đối số là ma trận nghịch đảo của cipherkey, với các phép nghịch đảo được thực hiện thông qua thư viện toán học math của Python và thư viện Numpy chuyên dụng cho đại số tuyến tính.

The KeyExpansion function is implemented to generate round keys for encryption In the keyExpansion128 function, the initial key is copied into a list, and a loop runs ten times to create new keys Each iteration involves transposing the last generated key and applying the rotWord function, followed by S-box transformations and XOR operations with round constants The newly created keys are appended to the return list, which is then transposed before returning Similarly, the keyExpansion192 function begins the same process but is designed for a different key length This structured approach ensures secure key generation for cryptographic applications.

The key expansion process for a 256-bit key begins with initializing a 6x4 array and appending the original key to a list The algorithm iterates through a range of values to generate round constants and manipulate the working array using functions like `rotWord` and S-box substitutions Each iteration involves XOR operations with previously generated keys and round constants, progressively expanding the key The final expanded key is constructed by transposing and organizing the working arrays into a structured format This method ensures a secure and efficient key expansion suitable for cryptographic applications.

The process of expanding a key in an 8x4 array involves appending copies of the key elements to a return key list For each iteration, a round constant array is created, and the last element of the return key is modified using the rotWord function and S-box substitution The working array is then XORed with the round constant and the previous key, which generates new keys for further iterations This process continues, applying S-box transformations and XOR operations to derive additional keys Ultimately, the expanded key is constructed by transposing and collecting the processed keys into a final list, which is returned as the expanded key output.

Các hàm addRoundKey, subBytes, shiftRows, gMixColumns

Hàm addRoundKey chỉ là hàm XOR từng phần tử giữa 2 ma trận với nhau, nên người viết xin được không bao đóng thành hàm

The remaining functions have been encapsulated as follows: The `subBytes(r)` function substitutes bytes in a 4x4 matrix using an S-box The `shiftRows(r)` function shifts the rows of the matrix to the left, with each row being shifted by a different number of positions The `gMixColumn(r)` function performs a mixing operation on each column of the matrix, utilizing bitwise operations and modular arithmetic to combine values Finally, the `gMixColumns(d)` function applies the `gMixColumn` operation to each column of the transposed matrix, returning the modified matrix.

Các hàm invSubBytes, invShiftRows, gInvMixColumns

The provided functions are integral to the decryption process in cryptography The `invSubBytes` function applies a substitution operation using a predefined lookup table, transforming each byte in a 4x4 matrix The `invShiftRows` function rearranges the rows of the matrix to reverse the effects of the initial row shifting during encryption The `gInvMixColumn` function performs a mathematical transformation on each column of the matrix, utilizing multiplication by specific constants to achieve the inverse mix operation Finally, the `gInvMixColumns` function orchestrates the application of `gInvMixColumn` across all columns, ensuring the matrix is properly transposed and returned in its decrypted form These operations are essential for restoring the original data from its encrypted state.

Các hàm phiên mã AES-128, AES-192, AES-256

Các hàm trên sẽ nhận một ma trận 4x4 và sẽ trả về một ma trận 4x4

The AES encryption algorithm is implemented through three functions: AES128, AES192, and AES256, each designed to handle different key lengths In the AES128 function, the state is transformed using a round key generated from the provided cipher key, involving several operations such as XOR, subBytes, shiftRows, and gMixColumns across 10 rounds The AES192 function follows a similar structure, utilizing a 12-round process for its 192-bit key, while the AES256 function operates with a 14-round process for 256-bit keys Each function systematically applies these transformations to ensure data security and integrity.

Các hàm giải mã AES-128, AES-192, AES-256

The AES encryption algorithm includes three key variations: AES128, AES192, and AES256, each processing a 4x4 matrix and a cipher key The AES128 function utilizes a key expansion method to generate a round key, performing a series of XOR operations, inverse shifts, and substitutions to transform the state matrix Similarly, AES192 follows a comparable structure but with a different round key size, incorporating additional rounds for enhanced security The AES256 function operates on the same principles as its predecessors, utilizing a longer key for increased encryption strength Each function meticulously applies transformations and key mixing to produce a secure output matrix, ensuring data confidentiality through robust encryption techniques.

Các hàm chức năng chuyển đổi string thành ma trận và ngược lại

The `stringToMat` function converts a string into a matrix format by appending the ASCII values of each character to an intermediate list, grouping them into rows of four Once the input string is fully processed, it transposes the resulting list of lists to create a matrix and returns it as a standard list Conversely, the `matToString` function takes a matrix, transposes it, flattens it into a one-dimensional array, and then reconstructs the original string by converting the ASCII values back to characters.

Đóng gói thành hàm phiên mã và giải mã hoàn chỉnh

Với các hàm đóng gói hoàn chỉnh này, ta có khả năng nhập key với độ dài 16, 24 và

The function `encrypt` requires a plaintext input and a cipher key, which must be either 16, 24, or 32 characters long If the plaintext is not provided, the user is prompted to enter it Similarly, if the key does not meet the specified length criteria, the user is asked to input a valid cipher key.

24 or 32") key = input() lenkey = len(key) func = {

The code processes a given state by dividing it into segments of 16 characters and padding the last segment if necessary It converts the provided key into a matrix format, ensuring it meets the required lengths of 16, 24, or 32 characters The function then applies a transformation to each segment using the specified cipher key, concatenating the results into a final output string Additionally, the decryption function prompts the user for plaintext and validates the cipher key length before proceeding.

24 or 32") key = input() lenkey = len(key) func = {

The code processes a state variable by creating segments of 16 characters, padding the last segment if necessary It converts the key into a matrix format and checks its length to ensure it is 16 characters The key is then transposed and converted to a list if it does not meet the required length Each segment is transformed using a specified function based on the key length, and the results are concatenated into a final output string.

Các chế độ hoạt động (modus operandi – mode of operation) của mật mã khối, và ứng dụng vào phần mềm AES

Mật mã khối hoạt động với nhiều chế độ khác nhau và chỉ đảm bảo an toàn, toàn vẹn thông tin khi áp dụng trên các khối dữ liệu có độ dài bit quy định Đối với dữ liệu có độ dài tùy ý, thuật toán sẽ chia nhỏ thành các khối phù hợp, sau đó mã hóa và xử lý để tạo ra bản mã hoàn chỉnh Để giải mã, các quy trình thành phần sẽ được thực hiện ngược lại với các quy trình trong quá trình mã hóa.

Chế độ hoạt động của mật mã khối là phương pháp mà thuật toán thực hiện mã hóa từng khối con từ đầu vào, nhằm biến đổi dữ liệu một cách bảo mật.

Hầu hết các chế độ hoạt động yêu cầu một chuỗi bit đặc biệt với độ dài phù hợp để thực hiện mã hóa, và chuỗi bit này được gọi là vector khởi tạo.

Giá trị khởi tạo (IV) là một yếu tố quan trọng trong mã hóa, yêu cầu phải ngẫu nhiên và không được lặp lại IV có thể được tạo ra từ nguồn ngẫu nhiên vật lý hoặc thông qua các phương pháp giả ngẫu nhiên toán học.

Trong bài tập lớn này, tác giả sẽ tập trung vào bốn chế độ mã hóa chính: ECB (Electronic Codebook), CBC (Cipher Block Chaining), CFB (Cipher Feedback) và OFB (Output Feedback).

Tất cả các chế độ mã hóa này khác nhau trong cách hoạt động, vậy nhưng đều sử dụng một công nghệ cốt lõi, là mã hóa khối AES

Dưới đây là hình ảnh minh họa cho các chế độ mã hóa khối, kèm theo đoạn mã ứng dụng được viết bằng ngôn ngữ Python Trong đó, chế độ mã hóa Electronic Code Book (ECB) được trình bày chi tiết.

Chế độ Electronic Code Book (ECB) là phương pháp mã hóa đơn giản nhất, trong đó các đoạn mã hóa dài được chia thành các khối dữ liệu 128 bit và mã hóa từng khối một bằng AES Tuy nhiên, do tất cả các khối trải qua cùng một chu trình mã hóa, phương pháp này thiếu tính diffusion cần thiết, dẫn đến việc nó được coi là không an toàn Điều này đặc biệt rõ ràng khi mã hóa các tệp bitmap.

Việc sử dụng mã hóa ECB không thể che giấu các mẫu dữ liệu, cho phép kẻ tấn công dễ dàng nhận diện thông tin Giống như các phương pháp mã hóa cổ điển, việc thu thập lượng lớn dữ liệu có thể dẫn đến việc sử dụng phân tích tần suất để phá mã Do đó, ECB được coi là kiểu mã hóa không an toàn, không nên áp dụng cho các mục đích an ninh hoặc thương mại.

Chế độ mã hóa và giải mã ECB được minh họa qua hình ảnh dưới đây Đoạn mã code sử dụng phương pháp ECB cho quá trình mã hóa và giải mã được trình bày như sau:

Phiên mã: else: for i in res: sub = strConversion[hexain](i) sub = func[lenkey](sub, cypherkey) sub = matConversion[hexaout](sub) ret += sub

Giải mã: else: for i in res: sub = strConversion[hexain](i) sub = func[lenkey](sub, cypherkey) sub = matConversion[hexaout](sub)

Electronic Codebook (ECB) mode encryption block cipher encryption Key

Ciphertext block cipher encryption Key

Ciphertext block cipher encryption Key

Electronic Codebook (ECB) mode decryption block cipher decryption Key

Plaintext block cipher decryption Key

Plaintext block cipher decryption Key

Ciphertext Ciphertext Ciphertext ret += sub b) Cipher block chaining:

Cipher block chaining (CBC) cung cấp tính diffusion cần thiết để mã hóa thông tin an toàn Trong chế độ này, mỗi khối plaintext i + 1 được XOR với khối ciphertext i, đảm bảo rằng khối ciphertext tiếp theo phụ thuộc vào khối trước đó Để mỗi khối được mã hóa với tính ngẫu nhiên và đặc trưng, khối đầu tiên sẽ được XOR với một IV (initialization vector).

Nếu khối đầu tiên có chỉ số index = 1, thì công thức toán học cho mã hóa sử dụng CBC là:

Và công thức toán học cho giải mã sử dụng CBC là:

CBC là phương pháp mã hóa phổ biến nhất, nhưng nó cũng tồn tại một số hạn chế Quy trình mã hóa của CBC yêu cầu xử lý nối tiếp, vì mỗi khối dữ liệu phụ thuộc vào khối trước đó, và cần phải thêm padding cho dữ liệu.

Khi giải mã mà không biết IV, chỉ khối đầu tiên sẽ bị lỗi, trong khi các khối còn lại không bị ảnh hưởng Để giải mã khối i, ta chỉ cần cộng cipherkey của khối i – 1 Từ tính chất này, có thể tìm được bản rõ của khối i dựa vào hai khối liền kề, cụ thể là khối i – 1 và khối i + 1.

Lỗ hổng của CBC dẫn đến phương pháp Explicit initialization vectors

Hình ảnh minh họa phiên mã và giải mã CBC được biểu diễn như sau:

Cipher Block Chaining (CBC) mode encryption block cipher encryption Key

Plaintext block cipher encryption Key

Plaintext block cipher encryption Key

CiphertextPlaintextInitialization Vector (IV) Đoạn code phiên mã và giải mã của chế độ CBC được đính kèm bên dưới:

The code snippet demonstrates a CBC (Cipher Block Chaining) encryption process, where the initialization vector (IV) is converted to a hexadecimal format For each element in the result set, the code performs an XOR operation with the temporary value derived from the IV The processed value is then transformed using a specified function based on the key length and the cipher key The temporary value is updated with the newly processed value, which is subsequently converted back to a hexadecimal format before being appended to the final results.

To decode the CBC mode, the initialization vector (IV) is converted using a specific string conversion method Each element in the result undergoes a series of transformations, including conversion, key application, and XOR operations, ultimately producing an output In the context of cipher feedback, we will implement the full cipher feedback (CFB) mode, which is the simplest variant among various types such as CFB-1, CFB-8, CFB-64, and CFB-128.

Sự khác biệt giữa chế độ mã hóa CFB và CBC nằm ở việc CFB không cho phép các khối bản rõ đi qua thuật toán AES; chỉ có key và IV tương tác với thuật toán Trong chế độ CFB, IV đóng vai trò như bản rõ, trong khi key giữ vai trò chính Sau khi IV được mã hóa, nó sẽ được XOR với các khối bản rõ, và kết quả của phép toán này sẽ được sử dụng để mã hóa khối tiếp theo Công thức toán học của CFB được thể hiện rõ ràng trong quy trình này.

Cipher Block Chaining (CBC) mode decryption block cipher decryption Key

Initialization Vector (IV) block cipher decryption Key

Ciphertext block cipher decryption Key

𝑃 𝑖 = 𝐸 𝐾 (𝐶 𝑖−1 ) ⊕ 𝑃 𝑖 Ưu điểm của CFB (và cả OFB) chính là, vì CFB không trực tiếp mã hóa bản rõ, thế nên không cần padding

Giống như CFB, quá trình phiên mã phải thực hiện tuần tự, thế nhưng quá trình giải mã có thể được lập trình để chạy song song

Hình ảnh minh họa của thuật toán CFB được biểu diễn như sau: Đoạn code phiên mã và giải mã theo chế độ CFB được đính kèm bên dưới:

Ngày đăng: 29/01/2022, 11:38

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w