1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Báo cáo bài tập lớn cơ sở an toàn và bảo mật thông tin đề tài gửi, nhận một file dữ liệu giữa hai máy sử dụng thuật toán aes bằng ngôn ngữ java

42 7 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 42
Dung lượng 6,05 MB

Nội dung

HỌC VIỆN KỸ THUẬT MẬT MÃ KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO BÀI TẬP LỚN CƠ SỞ AN TOÀN VÀ BẢO MẬT THÔNG TIN ĐỀ TÀI: Gửi, nhận file liệu hai máy sử dụng thuật toán AES ngôn ngữ java Giáo viên hướng dẫn: Th.S Nguyễn Đào Trường Nhóm 13: Phùng Hồi Thương CT040249 Phạm Trường Minh CT040231 Lớp L04 Hà Nội, 03-2023 LỜI NÓI ĐẦU Mật mã học lĩnh vực quan trọng khoa học máy tính, nghiên cứu ứng dụng phương pháp mã hóa giải mã thơng tin Từ việc bảo vệ thông tin cá nhân quản lý an tồn thơng tin doanh nghiệp, mã hóa cơng cụ quan trọng để đảm bảo tính bí mật tồn vẹn thơng tin giới kỹ thuật số Trong bối cảnh mật mã hóa ngày phức tạp, thuật tốn mã hóa AES (Advanced Encryption Standard) trở thành thuật tốn mã hóa phổ biến sử dụng rộng rãi toàn giới Với khả bảo vệ thông tin tốt, AES áp dụng nhiều lĩnh vực tài chính, ngân hàng, phủ ứng dụng khác Bài báo cáo cung cấp cho bạn kiến thức mã hóa, giới thiệu thuật tốn AES, phương pháp cơng cài đặt thuật tốn mã hóa AES để giúp bạn hiểu rõ lý thuyết ứng dụng mã hóa giới kỹ thuật số ngày Bài báo cáo chúng em trình bày tổng quan lý thuyết cài đặt thuật tốn mã hóa AES - ADVANCED ENCRYPTION STANDARD theo chương sau : Chương : Cơ sở lý thuyết Chương : Thực nghiệm MỤC LỤC DANH MỤC HÌNH VẼ iii DANH MỤC BẢNG BIỂU iv CHƯƠNG CƠ SỞ LÝ THUYẾT .1 1.1 Giới thiệu chung 1.2 Xây dựng thuật toán .2 1.2.1 Xây dựng bảng S-box .2 1.2.2 Giải thuật sinh khóa phụ 1.2.3 Q trình mã hóa 1.2.4 Quá trình giải mã 12 1.3 Lập trình Socket TCP/IP Java 14 1.3.1 Tổng quan Socket 14 1.3.2 Lập trình TCP Socket với Java .16 CHƯƠNG THỰC NGHIỆM 19 2.1 Cài đặt thuật tốn sinh khóa 19 2.1.1 Hàm RotWord .19 2.1.2 Hàm SubWord 19 2.1.3 Hàm XorRcon 19 2.1.4 Hàm KeyExpansion 20 2.2 Cài đặt thuật tốn mã hóa 20 2.2.1 Hàm AddRoundKey .20 2.2.2 Hàm SubBytes 21 2.2.3 Hàm ShiftRows 21 2.2.4 Hàm MixColumns 21 2.2.5 Hàm MaHoaAES 22 2.3 Cài đặt thuật toán giải mã 23 2.3.1 Hàm InvShiftRows .23 2.3.2 Hàm InvSubBytes 23 2.3.3 Hàm InvMixColumns 24 2.3.4 Hàm GiaiMaAES 24 i 2.4 Cài đặt giao thức TCP/IP 25 2.4.1 Server 25 2.4.2 Client 26 2.5 Kết thực nghiệm 26 KẾT LUẬN 28 TÀI LIỆU THAM KHẢO 29 ii DANH MỤC HÌNH Y Hình 1.1 Cơng thức bảng S-box .2 Hình 1.2 Cơng thức S-box nghịch đảo Hình 1.3 Chức KeyExpansion Hình 1.4 Thực thi RotWord cho từ w[3] .5 Hình 1.5 code RotWord Hình 1.6 Thực thi SubWord chuyển đổi từ w[3] Hình 1.7 code SubWord Hình 1.8 Thực thi AddRcon chuyển đổi từ w[3] Hình 1.9 Thực thi AddW để tạo khóa vịng .7 Hình 1.10 Sơ đồ q trình mã hóa Hình 1.11 Thuật tốn AddRoundKey Hình 1.12 Thuật tốn SubByte 10 Hình 1.13 Thuật tốn ShiftRow 11 Hình 1.14 Thuật tốn MixColumns 11 Hình 1.15 Thuật toán InvShiftRow 13 Hình 1.16 Thuật tốn InvSubBytes 13 Hình 1.17 Thuật toán InvMixColumn .14 Hình 1.18 Mơ hình OSI TCP/IP 15 Hình 1.19 Q trình gửi-nhận gói tin 15 Hình 1.20 Lập trình TCP Socket .16 Hình 1.21 Quá trình gửi-nhận tin Client-Server 18 Hình 2.1 Phía máy gửi 27 Hình 2.2 Phía máy nhận 27 iii DANH MỤC BẢNG BIỂU Bảng 1.1 So sánh số vịng mã hóa giải mã 12 Bảng 2.1 Bảng giá trị số vịng mã hóa .20 iv v CHƯƠNG CƠ SỞ LÝ THUYẾT 1.1 Giới thiệu chung Trong mật mã học, mã hóa phương pháp để biến thông tin từ định dạng bình thường sang dạng thơng tin khơng thể hiểu khơng có phương tiện giải mã Giải mã phương pháp để đưa từ dạng thông tin mã hóa dạng thơng tin ban đầu, q trình ngược mã hóa  AES (viết tắt từ tiếng anh: Advanced Encryption Standard, hay Tiêu chuẩn mã hóa nâng cao) thuật tốn mã hóa khối phủ Hoa Kỳ áp dụng làm tiêu chuẩn mã hóa  Thuật tốn xây dựng dựa Rijndael Cipher phát triển nhà mật mã học người Bỉ: Joan Daemen Vincent Rijmen  AES làm việc với khối liệu 128bit độ dài khóa 128bit, 192bit 256bit Các khóa mở rộng sử dụng chu trình tạo thủ tục sinh khóa Rijndael  Hầu hết phép tốn thuật toán AES thực trường hữu hạn byte Mỗi khối liệu đầu vào 128bit chia thành 16byte, xếp thành cột, cột phần tử hay ma trận 4x4 byte, gọi ma trận trạng thái  Tùy thuộc vào độ dài khóa sử dụng 128 bit, 192 bit hay 256 bit mà thuật toán có số lần lặp khác  Các bước xử lý : o Q trình mở rộng khóa sử dụng o Q trình mã hóa o Q trình giải mã 1.2 Xây dựng thuật toán 1.2.1 Xây dựng bảng S-box 1.2.1.1 Bảng S – box thuận Bảng S-box thuận sinh việc xác định nghịch đảo cho giá trị định GF(28) = GF(2)[x] / (x8+x4+x3+x+1) (trường hữu hạn Rijindael) Giá trị nghịch đảo ánh xạ với Những nghịch đảo chuyển đổi thông qua phép biến đổi affine Cơng thức tính giá trị bảng S-box bảng S-box tương ứng Hình 1.1 Cơng thức bảng S-box Trong đó, bit tính theo cơng thức: Với 24); } } return s; //bổ sung khóa vịng 20 } - Cách cài đặt đơn giản cần lấy cột ma trận trạng thái XOR cột ma trận KEY 2.2.2 Hàm SubBytes private int[][] subBytes(int[][] state) { for (int i = 0; i < 4; i++) { for (int j = 0; j < Nb; j++) { state[i][j] = subWord(state[i][j]) & 0xFF; } } return state; } - Hàm thực lấy kí tự mảng trạng thái đối chiếu S-box, tương tự với hàm SubWord 2.2.3 Hàm ShiftRows private int[][] shiftRows(int[][] state) { int temp1, temp2, temp3, i; temp1 = state[1][0]; for (i = 0; i < Nb - 1; i++) { state[1][i] = state[1][(i + 1) % Nb]; } state[1][Nb - 1] = temp1; temp1 = state[2][0]; temp2 = state[2][1]; for (i = 0; i < Nb - 2; i++) { state[2][i] = state[2][(i + 2) % Nb]; } state[2][Nb - 2] = temp1; state[2][Nb - 1] = temp2; temp1 = state[3][0]; temp2 = state[3][1]; temp3 = state[3][2]; for (i = 0; i < Nb - 3; i++) { 21 state[3][i] = state[3][(i + 3) % Nb]; } state[3][Nb - 3] = temp1; state[3][Nb - 2] = temp2; state[3][Nb - 1] = temp3; return state; } - Ta lấy kí tự hàng mảng trạng thái dịch vòng số byte tương ứng 0, 1, 2, , thu kết cách ghép byte sau dịch 2.2.4 Hàm MixColumns - Xây dựng hàm Mul private static int mult(int a, int b) { int sum = 0; while (a != 0) { if ((a & 1) != 0) { sum = sum ^ b; } b = xtime(b); a = a >>> 1; } return sum; } - Thực nhân cột ma trận trạng thái private int[][] mixColumns(int[][] state) { int temp0, temp1, temp2, temp3; for (int c = 0; c < Nb; c++) { temp0 = mult(0x02, state[0][c]) ^ mult(0x03, state[1] [c]) ^ state[2][c] ^ state[3][c]; temp1 = state[0][c] ^ mult(0x02, state[1][c]) ^ mult(0x03, state[2][c]) ^ state[3][c]; temp2 = state[0][c] ^ state[1][c] ^ mult(0x02, 22 state[2][c]) ^ mult(0x03, state[3][c]); temp3 = mult(0x03, state[0][c]) ^ state[1][c] ^ state[2][c] ^ mult(0x02, state[3][c]); state[0][c] = temp0; state[1][c] = temp1; state[2][c] = temp2; state[3][c] = temp3; } return state; } o Trước nhân, dịch vòng giá trị để lấy byte sau nhân 2, 3, theo giá trị tương ứng, mảng kết dịch ngược để lấy kết tương ứng 2.2.5 Hàm MaHoaAES private void cipher(int[][] in, int[][] out) { for (int i = 0; i < in.length; i++) { System.arraycopy(in[i], 0, out[i], 0, in.length); } actual = 0; addRoundKey(out, actual); for (actual = 1; actual < Nr; actual++) { subBytes(out); shiftRows(out); mixColumns(out); addRoundKey(out, actual); } subBytes(out); shiftRows(out); addRoundKey(out, actual); }  Hàm mã hóa thực qua trình trình bày phần lý thuyết với hàm tương ứng sử dụng với khóa vịng lặp Nhìn chung, độ dài khóa làm thay đổi số vòng lặp 23 2.3 Cài đặt thuật toán giải mã Thuật toán giải mã cài đặt tương tự thuật tốn mã hóa theo bước tương ứng, ta sử dụng lại hàm AddRoundKey 2.3.1 Hàm InvShiftRows private int[][] invShiftRows(int[][] state) { int temp1, temp2, temp3, i; // row 1; temp1 = state[1][Nb - 1]; for (i = Nb - 1; i > 0; i ) { state[1][i] = state[1][(i - 1) % Nb]; } state[1][0] = temp1; // row temp1 = state[2][Nb - 1]; temp2 = state[2][Nb - 2]; for (i = Nb - 1; i > 1; i ) { state[2][i] = state[2][(i - 2) % Nb]; } state[2][1] = temp1; state[2][0] = temp2; // row temp1 = state[3][Nb - 3]; temp2 = state[3][Nb - 2]; temp3 = state[3][Nb - 1]; for (i = Nb - 1; i > 2; i ) { state[3][i] = state[3][(i - 3) % Nb]; } state[3][0] = temp1; state[3][1] = temp2; state[3][2] = temp3; return state; }  Hàm cài đặt tương tự với hàm ShifRows 24 2.3.2 Hàm InvSubBytes private int[][] invSubBytes(int[][] state) { for (int i = 0; i < 4; i++) { for (int j = 0; j < Nb; j++) { state[i][j] = invSubWord(state[i][j]) & 0xFF; } } return state; }  Hàm thực chức giống hàm SubBytes nhiên ta lấy giá trị bảng S-box nghịch đảo 2.3.3 Hàm InvMixColumns  Tương tự MixColumns, ta xây dựng hàm nhân E,D,B,9 tương ứng sau thực xor giá trị với private int[][] invMixColumnas(int[][] state) { int temp0, temp1, temp2, temp3; for (int c = 0; c < Nb; c++) { temp0 = mult(0x0e, state[0][c]) ^ mult(0x0b, state[1][c]) ^ mult(0x0d, state[2][c]) ^ mult(0x09, state[3][c]); temp1 = mult(0x09, state[0][c]) ^ mult(0x0e, state[1][c]) ^ mult(0x0b, state[2][c]) ^ mult(0x0d, state[3][c]); temp2 = mult(0x0d, state[0][c]) ^ mult(0x09, state[1][c]) ^ mult(0x0e, state[2][c]) ^ mult(0x0b, state[3][c]); temp3 = mult(0x0b, state[0][c]) ^ mult(0x0d, state[1][c]) ^ mult(0x09, state[2][c]) ^ mult(0x0e, state[3][c]); state[0][c] = temp0; state[1][c] = temp1; state[2][c] = temp2; state[3][c] = temp3; } return state; } 2.3.4 Hàm GiaiMaAES private void decipher(int[][] in, int[][] out) { 25 for (int i = 0; i < in.length; i++) { System.arraycopy(in[i], 0, out[i], 0, in.length); } actual = Nr; addRoundKey(out, actual); for (actual = Nr - 1; actual > 0; actual ) { invShiftRows(out); invSubBytes(out); addRoundKey(out, actual); invMixColumnas(out); } invShiftRows(out); invSubBytes(out); addRoundKey(out, actual); }  Các vòng giải mã thực theo hàm tương ứng với khóa vịng lặp trình bày lý thuyết 2.4 Cài đặt giao thức TCP/IP 2.4.1 Server try { Socket socket = new Socket("127.0.0.1", 6543); File file = fileChooser.getSelectedFile(); String inputKey = keyTextField.getText(); if (!(inputKey.length() == 16 || inputKey.length() == 24 || inputKey.length() == 32)) { // Valid key length, store input key in a variable or something with it JOptionPane.showMessageDialog(this, "Độ dài key 16, 24 32 ký tự"); } byte[] key = inputKey.getBytes(); FileInputStream fis = new FileInputStream(file); OutputStream os = socket.getOutputStream(); 26 byte[] buffer = new byte[4096]; int bytesRead = 0; while ((bytesRead = fis.read(buffer)) != -1) { cipher = new AES(key); buffer = cipher.ECB_encrypt(buffer); os.write(buffer, 0, bytesRead); } fis.close(); os.close(); socket.close(); JOptionPane.showMessageDialog(this, "Gửi file thành công"); } catch (IOException ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(this, "Gửi file thất bại"); } 27 - Server tạo Socket ràng buộc với cổng (port number) để chờ nhận yêu cầu từ phía client 2.4.2 Client try { ServerSocket serverSocket = new ServerSocket(6543); System.out.println("Máy chủ bắt đầu Đang đợi kết nối đến "); Socket socket = serverSocket.accept(); System.out.println("Kết nối thành lập Đang nhận tệp "); InputStream is = socket.getInputStream(); byte[] buffer = new byte[4096]; int bytesRead = 0; FileOutputStream fos = new FileOutputStream("D:\\inteliJ\\co-so-bao-mat-antoan\\computer-b\\src\\received_file.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); while ((bytesRead = is.read(buffer)) != -1) { // Giải mã liệu nhận // cipher = new AES(key); // buffer = cipher.ECB_decrypt(buffer); bos.write(buffer, 0, bytesRead); decryptArea.append(new String(buffer, 0, bytesRead)); } bos.close(); is.close(); socket.close(); serverSocket.close(); System.out.println("Nhận file thành công"); } catch (IOException e) { e.printStackTrace(); 28 System.out.println("Nhận file thất bại"); } - Client yêu cầu server cách tạo Socket TCP máy kèm với địa IP port number tiến tình tương ứng máy server Khi client tạo Socket, client TCP tạo liên kết với server TCP chờ chấp nhận kết nối từ server 2.5 Kết thực nghiệm 29 Hình 2.22 Phía máy gửi - Client: máy nhận nhận chuỗi dạng mã hóa, sau user nhập key 30 Hình 2.23 Phía máy nhận File gửi: Tại File nhận giải mã: 31 32 KẾT LUẬN Nhìn chung, q trình làm việc, nhóm hồn thành tốt tập giao, áp dụng hiểu kiến thức học vào làm ứng dụng thực tiễn Thiết kế độ dài khóa thuật tốn AES (128, 192 256 bit) đủ an toàn để bảo vệ thông tin xếp vào loại tối mật an ninh AES nhà khoa học đánh giá chưa cao Nếu kỹ thuật cơng cải thiện AES bị phá vỡ Một vấn đề khác cấu trúc toán học AES đơn giản 33 TÀI LIỆU THAM KHẢO [1] Giáo trình AT&BMTT [2] Slide giảng mơn Cơ sở an tồn Bảo mật thơng tin - TS Nguyễn Đào Trường [3] https://vi.wikipedia.org/wiki/Advanced_Encryption_Standard [4] https://codelearn.io/sharing/lap-trinh-socket-co-voi-tcpip-ava [5] https://viblo.asia/p/tim-hieu-thuat-toan-ma-hoa-khoa-doi-xung-aesgAm5yxOqldb [6] https://www.youtube.com/watch?v=LiFcxxRRLSk&ab_channel= %C4%90%E1%BB%96V%C4%82N%C4%90%E1%BB%A8C%C4%90HGTVT 34

Ngày đăng: 25/05/2023, 19:58

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

TÀI LIỆU LIÊN QUAN

w