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 30 0
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

Đ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

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 Viết chương trình mã hóa giải mã 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 di động Người hướng dẫn: TS Nguyễn Đào Trường Khoa Công nghệ thông tin – Học viện Kỹ thuật mật mã Sinh viên thực hiên: Trương Quốc Quân Hà Nội, 2021 MỤC LỤC LỜI NÓI ĐẦU I TỔNG QUAN AES Khái niệm từ (Word) AES Thuật toán AES Khái quát II Mà HÓA Phương thức AddRoundKey Phương thức SubBytes Phương thức ShiftRows Phương thức MixColumns III GIẢI Mà Phương thức invShiftRows Phương thức InvMixColumns IV THUẬT TỐN MỞ RỘNG KHĨA keyExpansion 11 V Các dạng công vào AES phương pháp phòng chống 13 Side-channel attack 13 Known attacks 13 Các phương pháp phòng chống 13 VI Ứng dụng viết chương trình mã hóa giải mã AES sử dụng Python: 14 Các hàm nhân Galois: 14 Hàm RotWords: 15 Hàm KeyExpansion: 15 Các hàm addRoundKey, subBytes, shiftRows, gMixColumns: 18 Các hàm invSubBytes, invShiftRows, gInvMixColumns: 19 Các hàm phiên mã AES-128, AES-192, AES-256: 20 Các hàm giải mã AES-128, AES-192, AES-256: 22 Các hàm chức chuyển đổi string thành ma trận ngược lại: 23 Đóng gói thành hàm phiên mã giải mã hoàn chỉnh 24 10 Các chế độ hoạt động (modus operandi – mode of operation) mật mã khối, ứng dụng vào phần mềm AES 26 TÀI LIỆU THAM KHẢO 33 LỜI NÓI ĐẦU Mật mã học thành tựu lĩnh vực quan trọng trình phát triển nhân loại Với mục tiêu làm rối làm loạn thơng tin, sau tái tạo lại thông tin cách chân thực, đảm bảo tính bí mật thơng tin, truyền thơng tin xa, dựa vào đặc tính q trình mã hóa, tính khơng thể chối bỏ, tìm lỗ hổng bảo mật Nhu cầu mã hóa, bảo vệ thông tin, giao nhận thông tin đến người nhận có ý nghĩa thực tiễn, từ chiến tranh đến hịa bình, từ cơng bảo vệ xây dựng đất nước Thật vậy, ngành mật mã học xuất phát từ thời La Mã, tướng Caesar mã hóa thơng tin cách dịch chữ cái, hay mật mã Scytale người Spartan, đây, thông tin nhạy cảm ta liệu đăng nhập, liệu thẻ tín dụng, liệu chip CMND,… cần đến thành tựu ngành Việc tìm thuật tốn mã hóa an tồn khỏi can thiệp bên tưởng chừng kết thúc với chén thánh mật mã học – OTP, nhưng, hạn chế OTP bắt buộc chúng phải tìm phương thức mới, để thích nghi với trình phát triển khơng ngừng cơng nghệ Thuật tốn AES, ứng dụng từ mật mã Rijndael sinh bối cảnh AES (viết tắt từ tiếng Anh: Advanced Encryption Standard, hay Tiêu chuẩn mã hóa tiên tiến) thuật tốn mã hóa khối 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 liệu 128 bit khóa độ dài 128 bit, 192 bit 256 bit Mã hóa dùng AES mã hóa khối lặp gồm nhiều chu trình, khóa sử dụng chu trình tạo q trình tạo khóa Rijndael Trong báo cáo tìm hiểu chu trình làm việc phương pháp mã hóa AES ứng dụng viết chương trình mã hóa giải mã AES sử dụng ngơn ngữ Python, sau tìm hiểu dạng cơng vào AES phương pháp phịng tránh Để hồn thành báo cáo này, em 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 đỡ truyền đạt kinh nghiệm quý báu suốt thời gian thực Do hạn chế thời gian nghiên cứu đề tài kiến thức chuyên môn nên khơng tránh khỏi thiếu sót, kính mong góp ý từ Thầy người để hồn thiện báo cáo tốt hơn! I TỔNG QUAN AES Khái niệm từ (Word) AES Bốn byte cột mảng trạng thái state tạo thành từ 32 bit, số thứ tự hàng r (0 ≤ r < 4) cho biết số bốn byte từ Từ định nghĩa state coi state mảng chiều chứa từ 32 bit 𝑠0 = 𝑠00 𝑠10 𝑠20 𝑠30 𝑠1 = 𝑠01 𝑠11 𝑠21 𝑠31 𝑠2 = 𝑠02 𝑠12 𝑠22 𝑠32 𝑠3 = 𝑠03 𝑠13 𝑠23 𝑠33 Tương tự mảng khóa biểu diễn thành mảng chiều chứa từ 32 bit cơng thức với số lượng từ khóa phụ thuộc vào Nk (Nk = 4, 6, 8) Thuật toán AES Thuật toán AES phức tạp, mơ tả khái qt gồm bước sau: • Vịng khởi tạo gồm phép AddRoundKey • Nr -1 Vòng lặp gồm phép biển đổi lần lượt: SubBytes, ShiftRows, MixColumns, AddRoundKey • Vịng cuối gồm phép biến đổi giống vịng lặp khơng có phép MixColumns Khái quát Mở rộng khóa - Các khóa phụ dùng vịng lặp sinh từ khóa AES sử dụng thủ tục sinh khóa Rijndael Vòng tiên quyết: AddRoundKey Các vòng lặp đến Nr – 1: SubBytes – ShiftRows - MixColumns – AddRoundKey Vịng cuối (khơng MixColumns) – SubBytes – ShiftRows – AddRoundKey Trong đó: AddRoundKey – Mỗi byte state kết hợp với khóa phụ sử dụng XOR SubBytes - bước thay phi tuyến tính, byte state thay byte khác sử dụng bảng tham chiếu ShiftRows - bước đổi chỗ, dịng state dịch số bước theo chu kỳ MixColumns - trộn cột state, kết hợp bytes cột Các phép biến đổi Subbytes, ShiftRows, MixColumns có phép biến đổi ngược tương ứng InvSubBytes, InvShiftRows, InvMixColumns Riêng phép biến đổi AddRoundKey đơn giản phép XOR nên phép biến đổi ngược AddRoundKey Vận dụng phép biến đổi ngược trên, thuật toán giải mã AES gồm 10 vịng thực theo chiều ngược lại Kích thước khóa ban đầu 128 bits, 192 bits 256 bits AES dùng hàm keyExpansion để mở rộng kích thước khóa thành 44, 52 60 words chia thành 11, 13 15 cụm khóa con, khóa word làm khóa cho AddRoundKey II Mà HĨA Phương thức AddRoundKey • Trong phép biến đổi này, Nb từ thêm vào cột trạng thái lấy từ bảng liệt kê khóa (đã mơ tả phía trên) cho: [𝑏0𝑐, 𝑏1𝑐, 𝑏2𝑐, 𝑏3𝑐] = [𝑏0𝑐, 𝑏1𝑐, 𝑏2𝑐, 𝑏3𝑐] ⊕ [𝑤{𝑟𝑜𝑢𝑛𝑑∗𝑁𝑏+𝑐} ]; (với < c < Nb) • Trong đó: o [bi] từ liệt kê khóa o “round” số vòng khoảng round Nr Số vòng có điều kiện khóa khởi tạo trước hàm vòng Các từ liệt kê khóa XOR với cột trạng thái Phương thức SubBytes • Đây phép thay byte khơng tuyến tính Phép biến đổi thao tác byte trạng thái cách độc lập để tạo giá trị byte cách sử dụng bảng thay S-box SubBytes thao tác byte trạng thái cách độc lập Bảng S-Box • Phép thay đảo ngược cách sử dụng bảng Inverse Sbox, sử dụng hệt bảng Sbox thường Bảng Inverse Sbox • • Phương thức ShiftRows Trong biến đổi ShiftRows(), byte ba hàng cuối trạng thái dịch vòng số byte khác (độ lệch) Cụ thể : o S’r,c = Sr,(c + shift ( r, Nb)) mod Nb (Nb = 4) Trong giá trị dịch shift (r, Nb) phụ thuộc vào số hàng r sau: o Shift(1,4) = 1, shift(2,4) = 2, shift(3,4) = • • Hàng khơng bị dịch, ba hàng cịn lại bị dịch tương ứng: o Hàng thứ giữ nguyên o Hàng thứ dịch vòng trái lần o Hàng thứ dịch vòng trái lần o Hàng thứ dịch vòng trái lần Phương thức MixColumns Phép biến đổi thao tác cách độc lập cột trạng thái xem cột đa thức bậc • Ở dạng ma trận, phép biến đổi dùng theo phương trình sau, với ≤ 𝑐 < 𝑁𝑏 • Trong tất giá trị phần tử thuộc trường hữu hạn MixColumns thao tác độc lập cột trạng thái III GIẢI Mà • Thuật tốn giải mã giống với thuật tốn mã hóa mặt cấu trúc hàm sử dụng hàm đảo ngược trình mã hóa • Để giải mã mã mã hóa AES, cần phải hồn tác giai đoạn hoạt động mã hóa theo thứ tự ngược lại mà chúng áp dụng Ba giai đoạn giải mã sau: · Đảo ngược vòng cuối: AddRoundKey – InvShiftRows – InvSubBytes · Đảo ngược vòng lặp: AddRoundKey – InvMixColumns – InvShiftRows – InvSubBytes · Đảo ngược vòng tiên quyết: AddRoundKey • Trong số bốn hoạt động mã hóa AES, có phương thức AddRoundKey nghịch đảo (vì exclusive-or) Để hồn tác AddRoundKey, cần mở rộng tồn lịch khóa AES (giống mã hóa) sau sử dụng khóa thích hợp theo chiều ngược với giai đoạn mã hóa • Hàm đảo ngược SubBytes invSubBytes, giống hệt SubBytes, ngoại trừ việc sử dụng Sbox, ta sử dụng inverse Sbox • • • • • Phương thức invShiftRows Trong biến đổi invShiftRows(), byte ba hàng cuối trạng thái dịch vòng số byte khác (độ lệch) Cụ thể : o S’r,c = Sr,(c - shift ( r, Nb)) mod Nb (Nb = 4) Trong giá trị dịch shift (r, Nb) phụ thuộc vào số hàng r sau: o Shift(1,4) = 1, shift(2,4) = 2, shift(3,4) = Hàng không bị dịch, ba hàng lại bị dịch tương ứng: o Hàng thứ giữ nguyên o Hàng thứ dịch vòng phải lần o Hàng thứ dịch vòng phải lần o Hàng thứ dịch vòng phải lần Phương thức InvMixColumns Phép biến đổi thao tác cách độc lập cột trạng thái xem cột đa thức bậc Ở dạng ma trận, phép biến đổi dùng theo phương trình sau, với ≤ 𝑐 < 𝑁𝑏 - Trong tất giá trị phần tử thuộc trường hữu hạn InvMixColumns thao tác độc lập cột trạng thái def gInvMixColumns(d): r = list.copy(d) r = np.transpose(r) r = r.tolist() r1 = [] for i in range(0, 4): r[i] = gInvMixColumn(r[i]) r1.append(r[i]) r1 = np.transpose(r1) r1 = r1.tolist() return r1 Các hàm phiên mã AES-128, AES-192, AES-256: Các hàm nhận ma trận 4x4 trả ma trận 4x4 Các hàm ứng dụng đây: def AES128(state, cypherkey): print("AES128") roundKey = keyExpansion128(cypherkey) # 11 x (4 x 4) array result = list.copy(state) for i in range(0, 4): for j in range(0, 4): result[i][j] = state[i][j] ^ roundKey[0][i][j] for q in range(1, 10): result = subBytes(result) result = shiftRows(result) result = gMixColumns(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[q][i][j] result = subBytes(result) result = shiftRows(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[10][i][j] return result def AES192(state, cypherkey): print("AES192") roundKey = keyExpansion192(cypherkey) # 11 x (4 x 4) array result = list.copy(state) for i in range(0, 4): for j in range(0, 4): result[i][j] = state[i][j] ^ roundKey[0][i][j] for q in range(1, 12): result = subBytes(result) result = shiftRows(result) result = gMixColumns(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[q][i][j] result = subBytes(result) result = shiftRows(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[12][i][j] return result def AES256(state, cypherkey): print("AES256") roundKey = keyExpansion256(cypherkey) result = list.copy(state) for i in range(0, 4): for j in range(0, 4): result[i][j] = state[i][j] ^ roundKey[0][i][j] for q in range(1, 14): result = subBytes(result) result = shiftRows(result) result = gMixColumns(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[q][i][j] result = subBytes(result) result = shiftRows(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[14][i][j] return result Các hàm giải mã AES-128, AES-192, AES-256: Các hàm giải mã nhận ma trận 4x4 trả ma trận 4x4 def AES128(state, cypherkey): roundKey = keyExpansion128(cypherkey) # 11 x (4 x 4) array result = list.copy(state) for i in range(0, 4): for j in range(0, 4): result[i][j] = state[i][j] ^ roundKey[10][i][j] for q in range(9, 0, -1): result = invShiftRows(result) result = invSubBytes(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[q][i][j] result = gInvMixColumns(result) result = invShiftRows(result) result = invSubBytes(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[0][i][j] return result def AES192(state, cypherkey): roundKey = keyExpansion192(cypherkey) # 11 x (4 x 4) array result = list.copy(state) for i in range(0, 4): for j in range(0, 4): result[i][j] = state[i][j] ^ roundKey[12][i][j] for q in range(11, 0, -1): result = invShiftRows(result) result = invSubBytes(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[q][i][j] result = gInvMixColumns(result) result = invShiftRows(result) result = invSubBytes(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[0][i][j] return result def AES256(state, cypherkey): roundKey = keyExpansion256(cypherkey) # 11 x (4 x 4) array result = list.copy(state) for i in range(0, 4): for j in range(0, 4): result[i][j] = state[i][j] ^ roundKey[14][i][j] for q in range(13, 0, -1): result = invShiftRows(result) result = invSubBytes(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[q][i][j] result = gInvMixColumns(result) result = invShiftRows(result) result = invSubBytes(result) for i in range(0, 4): for j in range(0, 4): result[i][j] = result[i][j] ^ roundKey[0][i][j] return result Các hàm chức chuyển đổi string thành ma trận ngược lại: def stringToMat(s): ret = [] interkey = [] for i in range(0, len(s)): interkey.append(ord(s[i])) if ((i % == 3)): ret.append(interkey) interkey = [] ret = np.transpose(ret) ret = ret.tolist() return ret def matToString(s): s = np.transpose(s) s = np.ravel(s) s = s.tolist() retString = "" for i in s: retString += chr(i); return retString Đóng gói thành hàm phiên mã giải mã hồn chỉnh Với hàm đóng gói hồn chỉnh này, ta có khả nhập key với độ dài 16, 24 32 ký tự, hàm tự động chọn thuật toán tương đương để phiên hay giải mã def encrypt(state = None, key = None): ret = "" while(state == None): print("Please insert your plaintext?") state = input() while(key == None or not (len(key) == 16 or len(key) == 32 or len(key) == 24)): print("Please insert your cipher key? Your key must be of length 16, 24 or 32") key = input() lenkey = len(key) func = { 16: en.AES128, 24: en.AES192, 32: en.AES256 } res = [state[y - 16:y] for y in range(16, len(state) + 16, 16)] lim = 16 - len(res[-1]) for i in range(0, lim): res[-1] += chr(0x00) key = stringToMat(key) if (lenkey != 16): cypherkey = np.transpose(key) cypherkey = cypherkey.tolist() else: cypherkey = key for i in res: sub = stringToMat(i) sub = func[lenkey](sub, cypherkey) sub = matToString(sub) ret += sub return ret def decrypt(state = None, key = None): ret = "" while(state == None): print("Please insert your plaintext?") state = input() while(key == None or not (len(key) == 16 or len(key) == 32 or len(key) == 24)): print("Please insert your cipher key? Your key must be of length 16, 24 or 32") key = input() lenkey = len(key) func = { 16: de.AES128, 24: de.AES192, 32: de.AES256 } res = [state[y - 16:y] for y in range(16, len(state) + 16, 16)] lim = 16 - len(res[-1]) for i in range(0, lim): res[-1] += chr(0x00) key = stringToMat(key) if (lenkey != 16): cypherkey = np.transpose(key) cypherkey = cypherkey.tolist() else: cypherkey = key for i in res: sub = stringToMat(i) sub = func[lenkey](sub, cypherkey) sub = matToString(sub) ret += sub return ret 10 Các chế độ hoạt động (modus operandi – mode of operation) mật mã khối, ứng dụng vào phần mềm AES Mật mã khối có nhiều chế độ hoạt động khác Một mật mã khối đảm bảo an tồn tồn vẹn thơng tin thuật tốn áp dụng lên khối liệu có độ dài bit quy ước sẵn trước Với lượng liệu có độ dài tùy ý, thuật toán chia liệu đầu vào thành khối có độ dài phù hợp, mã hóa xử lý để đưa mã hoàn chỉnh Để giải mã, ta thực quy trình thành phần nghịch đảo với quy trình thành phần q trình mã hóa Một chế độ hoạt động mật mã khối quy ước cách thuật tốn thực việc mã hóa tất khối tách từ đầu vào để biến đổi đầu vào cách bảo mật Hầu hết chế độ hoạt động cần chuỗi bit đặc biệt có độ dài bit phù hợp với thuật tốn để thực mã hóa Chuỗi bit gọi vector khởi tạo (Initialization vector – IV) Một IV phải thỏa mãn điều kiện khơng lặp lại có tính ngẫu nhiên (có thể ngẫu nhiên vật lý giả ngẫu nhiên toán học) Trong khuôn khổ tập lớn này, người viết xin giới hạn chế độ hoạt động, ECB (mã hóa sách số - electronic codebook), CBC (mã hóa khối nối tiếp – Cipher Block Chaining), CFB (mã hóa phản hồi - cipher feedback) OFB (phản hồi đầu – output feedback) Tất chế độ mã hóa khác cách hoạt động, sử dụng công nghệ cốt lõi, mã hóa khối AES Bên ảnh minh họa chế độ mã hóa khối, kèm với đoạn mã ứng dụng viết ngơn ngữ Python a) Electronic Code Book: Electronic Code Book chế độ đơn giản Người xử lý mã hóa biến đoạn mã hóa dài trở thành khối liệu 128 bit, thực mã hóa AES khối Tất khối trải qua chu trình mã hóa giống hệt Chính vậy, mã hóa coi khơng an tồn, thiếu tính diffusion cần thiết Chúng ta thấy rõ điều ta mã hóa file kiểu bitmap: Ta thấy rõ rằng, việc sử dụng mã hóa ECB khơng che dấu pattern liệu Giống dạng mã hóa cổ điển, cần thu thập lượng cực lớn liệu, sử dụng frequency analysis để phá mã Chính thế, ECB coi kiểu mã hóa khơng an tồn khơng nên sử dụng với mục đích an ninh hay mục đích thương mại Hình ảnh minh họa chế độ mã hóa giải mã ECB biểu diễn hình vẽ sau: Plaintext Key Plaintext block cipher encryption Key Ciphertext block cipher encryption Plaintext Key Ciphertext block cipher encryption Ciphertext Electronic Codebook (ECB) mode encryption Ciphertext Key block cipher decryption Plaintext Ciphertext Key block cipher decryption Ciphertext Key block cipher decryption Plaintext Electronic Codebook (ECB) mode decryption Đoạn code mã hóa giải mã sử dụng ECB 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) Plaintext ret += sub b) Cipher block chaining: Cipher block chaining giới thiệu tính diffusion cần thiết để mã hóa thơng tin an toàn Trong chế độ này, khối plaintext i + XOR với khối ciphertext i Điều có nghĩa khối ciphertext sau phải phụ thuộc vào khối ciphertext đằng trước Để khối mã hóa với đặc tính ngẫu nhiên đặc trưng, ta XOR khối với IV (initialization vector) Nếu khối có số index = 1, cơng thức tốn học cho mã hóa sử dụng CBC là: 𝐶𝑖 = 𝐸𝐾 (𝑃𝑖 ⊕ 𝐶𝑖−1 ), 𝐶0 = 𝐼𝑉 Và cơng thức tốn học cho giải mã sử dụng CBC là: 𝑃𝑖 = 𝐷𝐾 (𝐶𝑖 ) ⊕ 𝐶𝑖−1 , 𝐶0 = 𝐼𝑉 CBC modus operandi sử dụng rộng rãi nhất, có bất cập Q trình mã hóa CBC bắt buộc phải xử lý nối tiếp (do khối sau phụ thuộc vào khối trước), yêu cầu padding liệu) Nếu ta giải mã mà IV, có khối bị lỗi, khối cịn lại khơng bị ảnh hưởng Đó trình giải mã khối i, cần cộng cipherkey khối i – Cũng tính chất này, mà ta tìm rõ khối i nhờ vào khối liền kề, tức khối i – i + Lỗ hổng CBC dẫn đến phương pháp Explicit initialization vectors Hình ảnh minh họa phiên mã giải mã CBC biểu diễn sau: Plaintext Plaintext Plaintext Initialization Vector (IV) Key block cipher encryption Ciphertext Key block cipher encryption Key Ciphertext Cipher Block Chaining (CBC) mode encryption block cipher encryption Ciphertext Ciphertext Key block cipher decryption Ciphertext Key block cipher decryption Ciphertext Key block cipher decryption Initialization Vector (IV) Plaintext Plaintext Plaintext Cipher Block Chaining (CBC) mode decryption Đoạn code phiên mã giải mã chế độ CBC đính kèm bên dưới: Phiên mã: if (mode == "CBC"): temp = strConversion[hexaIV](IV) for i in res: sub = strConversion[hexain](i) sub = xorMatrix(sub, temp) sub = func[lenkey](sub, cypherkey) temp = sub sub = matConversion[hexaout](sub) ret += sub Giải mã: if (mode == "CBC"): temp = strConversion[hexaIV](IV) for i in res: sub = strConversion[hexain](i) sub = func[lenkey](sub, cypherkey) sub = xorMatrix(sub, temp) sub = matConversion[hexaout](sub) temp = strConversion[hexain](i) ret += sub c) Cipher feedback Ở đây, sử dụng CFB dạng full cipher feedback Có nhiều loại CFB khác nhau, CFB-1, CFB-8, CFB-64, CFB-128,…, full cipher feedback kiểu đơn giản Sự khác biệt CFB CBC với CFB, khối rõ khơng qua thuật tốn AES Chỉ có key IV tương tác với thuật toán IV đóng vai trị làm rõ, key giữ ngun vai trị Sau IV mã hóa, XOR với khối rõ Kết phép tốn lại sử dụng để mã hóa cho khối Cơng thức toán học CFB thể sau: 𝐼𝑉, 𝑖 = 𝐶𝑖 = { 𝐸𝐾 (𝐶𝑖−1 ) ⊕ 𝑃𝑖 ; 𝑖 > 𝑃𝑖 = 𝐸𝐾 (𝐶𝑖−1 ) ⊕ 𝑃𝑖 Ưu điểm CFB (và OFB) là, CFB khơng trực tiếp mã hóa rõ, nên khơng cần padding Giống CFB, q trình phiên mã phải thực tuần tự, trình giải mã lập trình để chạy song song Hình ảnh minh họa thuật tốn CFB biểu diễn sau: Initialization Vector (IV) block cipher encryption Key Plaintext block cipher encryption Key Plaintext Ciphertext block cipher encryption Key Plaintext Ciphertext Ciphertext Cipher Feedback (CFB) mode encryption Initialization Vector (IV) block cipher ncr ption Key Key block cipher ncr ption Ciphertext Plaintext Key block cipher ncr ption Ciphertext Plaintext Ciphertext Plaintext Cipher Feedback (CFB) mode decryption Đoạn code phiên mã giải mã theo chế độ CFB đính kèm bên dưới: Phiên mã: elif (mode == "CFB"): temp = strConversion[hexaIV](IV) for i in res: sub = strConversion[hexain](i) temp = func[lenkey](temp, cypherkey) sub = xorMatrix(sub, temp) temp = strConversion[hexain](i) sub = matConversion[hexaout](sub) ret += sub Giải mã: elif (mode == "CFB"): temp = strConversion[hexaIV](IV) for i in res: sub = strConversion[hexain](i) temp = enfunc[lenkey](temp, cypherkey) sub = xorMatrix(sub, temp) temp = sub sub = matConversion[hexaout](sub) ret += sub d) Output feedback: Output feedback chế độ hoạt động linh hoạt, biến AES từ thuật tốn mật mã khối thành mật mã dịng Khóa mã hóa trở thành khóa dịng, từ XOR với khối rõ để trở thành mã Các khối rõ khơng dính dáng đến thuật tốn mã hóa, mà IV mã hóa liên tục để trở thành khóa dịng Thuật tốn OFB mang ưu điểm thuật tốn mã hóa dịng, cho phép đoạn code sửa lỗi hoạt động ổn định thời điểm Một ưu điểm khác OFB nghịch đảo phép XOR nó, nên thuật tốn mã hóa giải mã giống hệt Hình ảnh minh họa thuật tốn OFB đính kèm đây: Initialization Vector (IV) block cipher encryption Key Plaintext block cipher encryption Key Plaintext Ciphertext Key block cipher encryption Plaintext Ciphertext Ciphertext Output Feedback (OFB) mode encryption Initialization Vector (IV) Key block cipher ncr ption Ciphertext block cipher ncr ption Key Ciphertext Plaintext Key block cipher ncr ption Ciphertext Plaintext Output Feedback (OFB) mode decryption Và cơng thức tốn học OFB đính kèm đây: 𝐶𝑗 = 𝑃𝑗 ⊕ 𝑂𝑗 Plaintext 𝑃𝑗 = 𝐶𝑗 ⊕ 𝑂𝑗 𝑂𝑗 = 𝐸𝐾 (𝐼𝑗 ) 𝐼𝑗 = 𝑂𝑗−1 𝐼0 = 𝐼𝑉 Ta thấy rõ mã không tham gia vào q trình mã hóa, mà mã hóa AES IV liên tục, với khóa cho trước Điều khiến cho khối rõ biến đổi cách ngẫu nhiên độc nhất, kết khối trước độc lập hoàn toàn với khối lân cận Thế nhưng, đối tượng mã hóa IV, khối mã IV i phụ thuộc vào khối mã IV i – 1, nên phiên mã giải mã bắt buộc phải thực tuyến tính Thuật tốn phiên mã giải mã chế độ OFB mô tả đây: Phiên mã: elif (mode == "OFB"): temp = strConversion[hexaIV](IV) for i in res: sub = strConversion[hexain](i) temp = func[lenkey](temp, cypherkey) sub = xorMatrix(sub, temp) sub = matConversion[hexaout](sub) ret += sub Giải mã: elif (mode == "OFB"): temp = strConversion[hexaIV](IV) for i in res: sub = strConversion[hexain](i) temp = enfunc[lenkey](temp, cypherkey) sub = xorMatrix(sub, temp) sub = matConversion[hexaout](sub) ret += sub TÀI LIỆU THAM KHẢO I would like to thank the former mathematicians, the programmers that worked tirelessly to come up with these methods to obfuscate data under such strenuous ways, in order to protect information from being stolen The entire code can be obtain from my GitHub repository: https://github.com/cloudmadeofcandy/AES_implementation I also deployed the final version of my implementation on Heroku: http://floating-ridge-18343.herokuapp.com/ Book: The Design of Rijndael https://cs.ru.nl/~joan/papers/JDA_VRI_Rijndael_2002.pdf https://crypto.stackexchange.com/questions/2569/how-does-one-implement-theinverse-of-aes-mixcolumns https://en.wikipedia.org/wiki/Rijndael_S-box https://en.wikipedia.org/wiki/Rijndael_MixColumns https://en.wikipedia.org/wiki/AES_key_schedule https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation On the theory of Galois Field GF(2^8) and how it applies in said situation: https://engineering.purdue.edu/kak/compsec/NewLectures/Lecture5.pdf https://engineering.purdue.edu/kak/compsec/NewLectures/Lecture6.pdf https://engineering.purdue.edu/kak/compsec/NewLectures/Lecture7.pdf https://engineering.purdue.edu/kak/compsec/NewLectures/Lecture8.pdf On the overall mechanism of AES Encryption: https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.197.pdf https://formaestudio.com/rijndaelinspector/archivos/Rijndael_Animation_v4_enghtml5.html https://en.wikipedia.org/wiki/Advanced_Encryption_Standard https://crypto.stackexchange.com/questions/2569/how-does-one-implement-theinverse-of-aes-mixcolumns https://crypto.stackexchange.com/questions/51951/aes-key-expansion-for-192-bit https://crypto.stackexchange.com/questions/81712/rcon-for-aes-192-and-256 https://crypto.stackexchange.com/questions/11096/two-different-approaches-forkey-expansion-using-the-aes-256-algorithm https://www.baeldung.com/java-aes-encryption-decryption https://www.highgo.ca/2019/08/08/the-difference-in-five-modes-in-the-aesencryption-algorithm/ FOR CHECKING THE CORRECTNESS OF AES: https://formaestudio.com/rijndaelinspector/archivos/Rijndael_Animation_v4_enghtml5.html https://github.com/chrisveness/crypto/blob/master/test/aes-tests.js https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.197.pdf (Appendix A.1, A.2, and A.3) http://aes.online-domain-tools.com/ https://string-functions.com/string-hex.aspx https://searchcode.com/codesearch/view/15318961/ https://github.com/Anexsoft/BoltCMS/blob/master/vendor/passwordlib/passwordlib/test/Data/Vectors/aes-ofb.testvectors

Ngày đăng: 22/06/2023, 21:27

Tài liệu cùng người dùng

Tài liệu liên quan