1. Trang chủ
  2. » Tất cả

Báo cáo an toàn bảo mật thông tin

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

Định dạng
Số trang 16
Dung lượng 589,4 KB

Nội dung

BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA AN TOÀN THÔNG TIN BÀI TẬP LỚN MÔN AN TOÀN BẢO MẬT THÔNG TIN Đề tài 4 mã hóa một đoạn dữ liệu có sẵn trong một biến của chương trình cho biết thời gia.

BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA AN TỒN THƠNG TIN - - BÀI TẬP LỚN MƠN AN TỒN BẢO MẬT THƠNG TIN Đề tài 4: mã hóa đoạn liệu có sẵn biến chương trình cho biết thời gian mã hóa thời gian giải mã mật mã AES Giảng viên hướng dẫn : Nguyễn Đào Trường Nhóm sinh viên thực : Nguyễn Viết Tồn Tô Đức Thắng Tạ Quang Huy Mục Lục Mã hóa AES (AES Encryption Operation) .2 1.1 SubBytes .3 1.2 ShiftRows 1.3 MixColumns .6 1.4 AddRoundKey Giải mã AES (AES Decryption Operation) 2.1 InvSubBytes 10 2.2 InvShiftRows 11 2.3 InvAddRoundKey .12 2.4 InvMixColumns 12 MỞ ĐẦU AES mã khối, khác với mã khối khác biết đến trước (DES, IDEA,…), liệu AES không biểu diễn dạng mảng byte hay bit mà biểu diễn dạng ma trận 4xNb gọi mảng trạng thái (state) Trong đó, AES, Nb ln có giá trị Trong thuật toán Rijndael hỗ trợ ba giá trị Nb 4, 6, tương ứng với kích thước khối 128, 192 256 bit Dữ liệu đầu vào đọc vào ma trận state theo cột, theo thứ tự từ xuống dưới, từ trái qua phải Dữ liệu đầu đọc từ ma trận theo quy tắc Khóa vịng AES biểu diễn hoàn toàn tương tự cách biểu diễn liệu Tuy nhiên, tùy vào kích thước khóa mà số cột ma trận khóa vịng Nk khác Cụ thể, Nk nhận giá trị 4, 6, tương ứng với kích thước khóa 128, 192 256 bit Đây điểm mạnh thuật tốn AES vấn đề mở rộng khóa Số vòng lặp ký hiệu Nr, phụ thuộc vào hai đại lượng Nb Nk Vì Nb AES có giá trị cố định nên Nr phụ thuộc vào Nk Giá trị Nr tương ứng với ba giá trị Nk Nr = 10, 12, 14 Cụ thể, giá trị Nr xác định 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= 1; round ) { state = InvSubBytes(state); state = InvShiftRows(state); state = AddRoundKey(state, w, round); state = InvMixColumns(state); } state = InvSubBytes(state); state = InvShiftRows(state); state = AddRoundKey(state, w, 0); for (int i = 0; i < tmp.length; i++) tmp[i % * + i / 4] = state[i / 4][i % 4]; 12 return tmp; } Có phương thức mã hóa AES sử dụng bên trên:     InvSubBytes InvShiftRows InvAddRoundKey InvMixColumns 2.1 InvSubBytes Bảng biến đổi SubBytes nghịch đảo tạo cách sử dụng nghịch đảo công thức sử dụng phần 2.1 Mã giả Java cho phần đơn giản, sử dụng mảng InvSbox xác định bên dưới: private static byte[][] InvSubBytes(byte[][] state) { for (int row = 0; row < 4; row++) for (int col = 0; col < Nb; col++) state[row][col] = (byte) (inv_sbox[(state[row][col] & 0x000000ff)] & 0xff); return state; } 13 Hình 5: Bảng Giá Trị InvSBox 2.2 InvShiftRows Điều thực nghịch đảo ShiftRows: thực dịch chuyển vòng tròn bên trái hàng 1, 3, với số lượng 1, byte Đoạn code Java thực điều private static byte[][] InvShiftRows(byte[][] state) { byte[] t = new byte[4]; for (int r = 1; r < 4; r++) { for (int c = 0; c < Nb; c++) t[(c + r) % Nb] = state[r][c]; 14 for (int c = 0; c < Nb; c++) state[r][c] = t[c]; } return state; } 2.3 InvAddRoundKey Do đặc tả sử dụng hàm Add RoundKey tham số hóa, nên nghịch đảo nó, sử dụng tham số theo thứ tự ngược lại Trong thực cho phép AddRoundKey() độc quyền 16 byte khác lần gọi, đó, cần hàm khác, wCount khởi tạo thành * Nb * (Nr + 1) void InvAddRoundKey(byte[] state) { for (int c = Nb-1; c >= 0; c ) for (int r = 3; r>=0; r ) state[r][c] = state[r][c]^w[ wCount]; } 2.4 InvMixColumns Là phép biến đổi ngược với phép biến đổi MixColumns InvMixColumns thực thao tác theo cột trạng thái, xem cột đa thức bậc gồm hạng tử trường GF(2^8) Các cột phép InvMixColumns nhân theo modulo ( x^4 + ) với đa thức nghịch đảo a(x) đa thức a^-1(x) định nghĩa: private static byte[][] MixColumns(byte[][] s) { int[] sp = new int[4]; 15 byte b02 = (byte) 0x02, b03 = (byte) 0x03; for (int c = 0; c < 4; c++) { sp[0] = FFMul(b02, s[0][c]) ^ FFMul(b03, s[1][c]) ^ s[2][c] ^ s[3][c]; sp[1] = s[0][c] ^ FFMul(b02, s[1][c]) ^ FFMul(b03, s[2][c]) ^ s[3][c]; sp[2] = s[0][c] ^ s[1][c] ^ FFMul(b02, s[2][c]) ^ FFMul(b03, s[3][c]); sp[3] = FFMul(b03, s[0][c]) ^ s[1][c] ^ s[2][c] ^ FFMul(b02, s[3][c]); for (int i = 0; i < 4; i++) s[i][c] = (byte) (sp[i]); } return s; } 16

Ngày đăng: 14/03/2023, 14:09

w