Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 96 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
96
Dung lượng
5,24 MB
Nội dung
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 CƠ SỞ AN TỒN VÀ BẢO MẬT THƠNG TIN VIẾT CHƯƠNG TRÌNH Mà HĨA VÀ GIẢI Mà FILE DỮ LIỆU BẰNG 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 Sinh viên thực hiện: Đỗ Thị Nga CT030239 NHẬN XÉT VÀ CHO ĐIỂM CỦA GIÁO VIÊN MỤC LỤ LỜI MỞ ĐẦU CHƯƠNG TỔNG QUAN ĐỀ TÀI 1.1 Giới thiệu hệ mật mã AES 1.2 Thuật toán mã hóa AES 1.3 Mục tiêu đề tài CHƯƠNG XÂY DỰNG CHƯƠNG TRÌNH 2.1 Ý tưởng toán 2.2 Các hàm mã hóa 2.2.1 SubBytes 2.2.2 ShiftRows 2.2.3 MixColumns 2.2.4 AddRoundKey 2.3 Các hàm giải mã 10 2.3.1 InvSubBytes 10 2.3.2 InvShiftRowss 11 2.3.3 InvMixColumn 12 2.3.4 AddRoundKey 14 2.4 Chương trình thực mã hóa giải mã 15 2.4.1 Chương trình thực mã hóa 15 2.4.2 Chương trình thực giải mã 17 CHƯƠNG KẾT QUẢ THỰC NGHIỆM 20 3.1 Thực nghiệm mã hóa với khóa 128 bit 20 3.2 Thực nghiệm mã hóa với khóa 192 bit 21 3.3 Thực nghiệm mã hóa với khóa 256 bit 22 PHỤ LỤC 24 LỜI MỞ ĐẦU Ngày nay, với phát triển mạnh mẽ công nghệ thông tin, tảng kỹ thuật số, áp dụng công việc học tập trở lên phổ biến, đặc biệt đại dịch covid diễn phức tạp khắp giới, nhiều địa phương đưa lệnh giãn cách Việc sử dụng phương tiện truyền thơng người dùng địi hỏi u cầu cao độ an tồn bảo mật thơng tin Nhiều hệ mã tạo nhằm che giấu thông tin, bảo mật thơng tin người dùng Mã hóa AES (Advanced Encryption Standard) phát triển từ cuối năm 90s AES thực tốt chức mã hóa, áp dụng làm tiêu chuẩn mã hóa Với mong muốn tìm hiểu mã AES, nhóm thực báo cáo với đề tài đề tài “Viết chương trình mã hóa giải mã file liệu mật mã AES” Với mục tiêu trên, báo cáo trình bày gồm chương bố cục sau: Chương 1: Tổng quan đề tài Chương 2: Xây dựng chương trình Chương 3: Kết thực nghiệm Tuy nhiên, thời gian thực báo cáo môn học có hạn kiến thức cịn nhiều hạn chế, nên đề tài cịn nhiều thiếu sót, điểm bất cập vấn đề chưa thể xử lý triệt để Nhóm em mong nhận góp ý thầy bạn để báo cáo hồn thiện Nhóm em xin chân thành cảm ơn! CHƯƠNG TỔNG QUAN ĐỀ TÀI 1.1 Giới thiệu hệ mật mã AES 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 128 bit đầu vào 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 State Tùy thuộc vào độ dài khóa sử dụng 128bit, 192bit hay 256bit mà thuật toán thực với số lần lặp khác 1.2 Thuật toán mã hóa AES Tiêu chuẩn mã hóa nâng cao (AES-Advanced Encryption Standard) mật mã khóa đối xứng mật mã khối lặp lặp lại với kích thước khối cố định 128 bit độ dài khóa thay đổi, tức là 128, 192 256 bit Các phép biến đổi khác hoạt động dựa kết trung gian, gọi State State mảng hình chữ nhật gồm byte kích thước khối 128 bit, tức 16 byte, nên mảng có kích thước 4x4 Khóa mật mã mô tả tương tự mảng hình chữ nhật có bốn hàng Số cột khóa mật mã AES thay đổi theo độ dài khóa, với khóa 128 bit có số cột 4, khóa 192 bit có cột khóa 256 bit có cột Khóa thực mở rộng khóa để tạo khóa vịng, khóa có kích thước 128 bit có 10 vịng, khóa 192 có 12 vịng khóa 256 thực 14 vịng Một liệu đầu vào mã hóa với khóa cho trước thơng qua phép toán SubBytes, ShiftRows, MixColumns AddRound Key tương ứng để tạo mã Bản mã thực phép toán ngược InvSubBytes, InvShiftRows, InvMixColumn AddRound Key để liệu ban đầu Hình mơ tả cấu trúc thuật tốn AES Hình 1 Cấu trúc thuật tốn mã AES 1.3 Mục tiêu đề tài Thực mã hóa giải mã file liệu sử dụng mật mã AES Dữ liệu sau thực giải mã mã hóa lưu file khác Sử dụng ngơn ngữ lập trình java Thực mã hóa giải mã với khóa có độ dài 128 bit, 192 bit 256 bit Xác định thời gian mã hóa giải mã CHƯƠNG XÂY DỰNG CHƯƠNG TRÌNH 2.1 Ý tưởng tốn Chương trình thực đọc file liệu, tiếp sử dụng thuật tốn AES để mã hóa liệu Chương trình cho phép người dùng chọn file mã hóa, file ghi sau mã hóa, nhập khóa từ bàn phím tính tốn thời gian hoạt động chương trình Dữ liệu mã hóa (giải mã) lưu file người dùng lựa chọn 2.2 Các hàm mã hóa 2.2.1 SubBytes Nhiều mật mã khối khác sử dụng phép thay đặc biệt gọi "S-box" AES có bảng S-box này, gọi "Chuyển đổi SubBytes" Bảng S-box cung cấp phép biến đổi đảo ngược phân đoạn văn rõ trình mã hóa, với phép chuyển ngược lại q trình giải mã Với AES, hàm đơn giản áp dụng lặp lặp lại cho byte giai đoạn mã hóa, trả byte Mỗi giá trị số 256 byte có chuyển đổi thành giá trị byte khác với phép biến đổi SubBytes, hốn vị đầy đủ, có nghĩa phần tử thay đổi tất 256 phần tử biểu diễn kết thay đổi, cho khơng có hai phần tử khác byte thay đổi thành byte tương tự temp = 0; break; case '1': temp = 1; break; case '2': temp = 2; break; case '3': temp = 3; break; case '4': temp = 4; break; case '5': temp = 5; break; case '6': temp = 6; break; case '7': temp = 7; 77 break; case '8': temp = 8; break; case '9': temp = 9; break; case 'a': temp = 10; break; case 'b': temp = 11; break; case 'c': temp = 12; break; case 'd': temp = 13; break; case 'e': temp = 14; break; 78 case 'f': temp = 15; break; case 'A': temp = 10; break; case 'B': temp = 11; break; case 'C': temp = 12; break; case 'D': temp = 13; break; case 'E': temp = 14; break; case 'F': temp = 15; break; default: 79 break; } keyInt[i] = (int) temp; } int key2[] = new int[(key.length) / 2]; for (int i = 0; i < key2.length; i++) { for (int j = 0; j < keyInt.length; j++) { if (j == (2 * i)) { key2[i] = keyInt[j] * 16 + keyInt[j + 1]; } } } for (int i = 0; i < keyFromInput.length; i++) { keyFromInput[i] = (char) (key2[i]); } } boolean inputKey(int lengthKey, char[] keyFromInput, String enterKey) { Scanner scanner = new Scanner(System.in); int[] keyInt = new int[(lengthKey / 8) * 2]; // String enterKey; //Nhập khóa int temp = 0; 80 System.out.println("Nhập khóa " + lengthKey + " bit dạng hex, ví dụ: 0102030405060708090a0b0c0d0e0f10 (128 bit) "); // enterKey = scanner.nextLine(); encrypt enForm = new encrypt(); // enterKey = scanner.nextLine(); if (enterKey.length() != (lengthKey / 8) * 2) { enForm.showError("Khóa nhập vào không Mời nhập lại!"); return false; } if (enterContextKey(enterKey) == false) { enForm.showError("Khóa nhập vào khơng Mời nhập lại!"); return false; //enterKey = scanner.next(); } char[] key = enterKey.toCharArray(); convertInt(key, keyInt, keyFromInput); return true; } int inputKeyLength(int length) { if (length == 128) { return length; } else if (length == 192) { 81 return length; } else if (length == 256) { return length; } else { return 0; } } String readFile(String cipherPath) throws IOException { String outputFile = ""; File f = null; FileReader fr = null; BufferedReader br = null; try { //Bước 1: Tạo đối tượng luồng liên kết nguồn liệu f = new File(cipherPath); fr = new FileReader(f); //Bước 2: Đọc liệu br = Files.newBufferedReader(f.toPath(), StandardCharsets.UTF_8); String line; while ((line = br.readLine()) != null) { outputFile += line; } 82 return outputFile; } catch (Exception ex) { encrypt enForm = new encrypt(); enForm.showError("Loi doc file"); } finally { fr.close(); br.close(); } return outputFile; } float totalTimeDcrypt; void decryptAES(String cipherPath, String plainPath, int lengthKey, String enterKey) throws IOException { DecyptMerge1 aes = new DecyptMerge1(); String m = aes.readFile(cipherPath); String m1 = m.substring(0, m.length()); char[] cipherInput = m1.toCharArray(); int[] cipherInt = new int[m1.length()]; char[] cipher = new char[m1.length() / 2]; aes.convertInt(cipherInput, cipherInt, cipher); System.out.print("Cipher: "); for (int i = 0; i < cipher.length; i++) { 83 aes.printHex(cipher[i]); System.out.print(" "); } System.out.println("\n"); //key 16 byte char[] keyFromInput = new char[lengthKey / 8]; if (aes.inputKey(lengthKey, keyFromInput, enterKey) == true) { int originalLen = cipher.length; int lenOfPaddedCipher = originalLen; if (lenOfPaddedCipher % 16 != 0) { lenOfPaddedCipher = (lenOfPaddedCipher / 16 + 1) * 16;// neu khong la boi cua 16 -> du -> them cac byte cuoi de tao 16 byte moi } char paddedMessage[] = new char[lenOfPaddedCipher]; for (int i = 0; i < lenOfPaddedCipher; i++) { if (i >= originalLen) { paddedMessage[i] = 0;//them cac byte cuoi de tao 16 byte moi } else { paddedMessage[i] = cipher[i]; } } System.out.println("Plain: \n"); 84 //Encrypt padded message: float startTimeDecrypt = System.currentTimeMillis(); for (int i = 0; i < cipher.length; i += 16) {//ma hoa 16 byte mot aes.AES_Decrypt(Arrays.copyOfRange(cipher, i, i + 16), keyFromInput, lengthKey); } System.out.println("\n"); float endTimeDcrypt = System.currentTimeMillis();// kết thúc tính time totalTimeDcrypt = endTimeDcrypt - startTimeDecrypt; System.out.print("Decrypt time: " + ((totalTimeDcrypt) / 1000d) + " seconds \n"); encrypt enForm = new encrypt(); char[] plain = new char[16]; try { FileWriter myWriter = new FileWriter(plainPath); for (int i = 0; i < lenOfPaddedCipher; i += 16) {//ma hoa 16 byte mot plain = aes.AES_Decrypt(Arrays.copyOfRange(cipher, i, i + 16), keyFromInput, lengthKey); for (int j = 0; j < 16; j++) { myWriter.append(plain[j]); } } 85 myWriter.close(); enForm.showError("Ghi file ma hoa cong"); } catch (IOException e) { enForm.showError("Loi ghi file"); e.printStackTrace(); } } } public static void main(String[] args) throws IOException { } } Chương trình hiển thị Form giao diện private void plainBrowseActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: JFileChooser fileChooser = new JFileChooser(); int response = fileChooser.showOpenDialog(null); if (response == JFileChooser.APPROVE_OPTION) { // File file= new File(fileChooser.getSelectedFile().getAbsolutePath()); plainPath.setText(fileChooser.getSelectedFile().getAbsolutePath()); } else { } } 86 private void cipherBrowseActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: JFileChooser fileChooser = new JFileChooser(); int response = fileChooser.showOpenDialog(null); if (response == JFileChooser.APPROVE_OPTION) { cipherPath.setText(fileChooser.getSelectedFile().getAbsolutePath()); } else { } } private void encyptBtnActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: EncryptMerge encypt = new EncryptMerge(); if (kiemTraRong() == false) { try { String keyLeng=(String)keyLength.getSelectedItem(); encypt.encryptAES(plainPath.getText(),cipherPath.getText(),Integer.parseInt(key Leng),key.getText()); } catch (IOException ex) { Logger.getLogger(encrypt.class.getName()).log(Level.SEVERE, null, ex); } } 87 time.setText(String.valueOf(encypt.totalTimeDcrypt)); } private void decyptBtnActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: DecyptMerge1 decrypt= new DecyptMerge1(); if (kiemTraRong() == false) { try { String keyLeng=(String) keyLength.getSelectedItem(); decrypt.decryptAES(plainPath.getText(),cipherPath.getText(),Integer.parseInt(key Leng),key.getText()); } catch (IOException ex) { Logger.getLogger(encrypt.class.getName()).log(Level.SEVERE, null, ex); } } time.setText(String.valueOf(decrypt.totalTimeDcrypt)); } boolean kiemTraRong() { if (plainPath.getText().equals("") | cipherPath.getText().equals("") | key.getText().equals("")) { JOptionPane.showMessageDialog(null, "Vui long nhap day du cac truong"); 88 return true; } else { return false; } } void showError(String x){ JOptionPane.showMessageDialog(rootPane, x); } 89 KẾT LUẬN A Những kết đạt Sau tìm hiểu thực đề tài “Viết chương trình mã hóa giải mã file liệu mật mã AES” nhóm đạt kết sau: Hiểu thuật tốn mã hóa AES Vận dụng thuật tốn mã hóa AES để mã hóa giải mã file liệu sử dụng ngôn ngữ Java Có kiến thức an tồn bảo mật thơng tin Tuy nhiên, q trình thực gặp số hạn chế chưa tối ưu code, giao diện chưa đẹp,… B Hướng phát triển đề xuất Với mặt hạn chế đề tài, nhóm đưa hướng phát triển đề xuất để đề tài hoàn thiện hơn, khắc phục hạn chế: Xây dựng giao diện đẹp, thân thiện với người dùng, dễ dàng thực mã hóa, giải mã,… Tối ưu code Tối ưu thời gian thực mã hóa, giải mã, ghi file,… 90 TÀI LIỆU THAM KHẢO [1] Viện Tiêu chuẩn Công nghệ quốc gia Hoa Kỳ (National Institute of Standards and Technology - NIST), FIPS 197 Advanced Encryption Standard (AES), 2001 91