Trao đổi khóa được mã hóa EKE được tạo ra bởi Steven M. Bellovin và Michael Meritt có sử dụng cơ chế xác thực bên liên lạc và mã hóa các thông điệp trao đổi khóa DiffieHellman. Điều này khắc phục được những nhược điểm của giao thức trao đổi khóa DiffieHellman như không có cơ chế xác thực và bị tấn công xen giữa. Với những lý do như vậy nên tôi đã chọn đề tài “Tìm hiều, thực thi giao thức trao đổi khóa có mã hóa EKE trên đường cong Elliptic” nhằm hiểu sâu hơn về giao thức trao đổi khóa này.
BỘ THƠNG TIN VÀ TRUYỀN THƠNG HỌC VIỆN BƯU CHÍNH VIỄN THÔNG - - ĐỒ ÁN TỐT NGHIỆP Đề tài TÌM HIỂU, THỰC THI GIAO THỨC TRAO ĐỔI KHĨA CÓ MÃ HÓA EKE TRÊN ĐƯỜNG CONG ELLIPTIC Giảng viên hướng dẫn: TS Trần Quan Huy Sinh viên thực hiện: Mai văn Tuấn Lớp: K26 Khóa: 2019 – 2022 Chuyên ngành: CÔNG NGHỆ THÔNG TIN Hà Nội, 2022 BỘ THÔNG TIN VÀ TRUYỀN THƠNG HỌC VIỆN BƯU CHÍNH VIỄN THƠNG - - ĐỒ ÁN TỐT NGHIỆP Đề tài TÌM HIỂU, THỰC THI GIAO THỨC TRAO ĐỔI KHÓA CÓ MÃ HÓA EKE TRÊN ĐƯỜNG CONG ELLIPTIC Giảng viên hướng dẫn: TS Trần Quan Huy Sinh viên thực hiện: Mai văn Tuấn Lớp: K26 Khóa: 2019 – 2022 Chun ngành: CƠNG NGHỆ THÔNG TIN Hà Nội, 2022 LỜI CẢM ƠN Qua thời gian tìm hiểu nghiên cứu, em hồn thành đồ án tốt nghiệp Để hoàn thành đồ án này, em xin gửi lời cảm ơn chân thành tới thầy giáo TS Trần Quan Huy tận tình hướng dẫn giúp đỡ em trình nghiên cứu làm đồ án Em xin bày tỏ lịng biết ơn sâu sắc tới tồn thể thầy, trường Học viện bưu viễn thơng, đặc biệt thầy, cô giáo Khoa cntt dạy bảo, truyền đạt kiến thức quý giá cho em suốt quãng thời gian năm học tập, rèn luyện trường Kiến thức mà thầy, cô truyền đạt không tảng cho trình nghiên cứu làm đồ án tốt nghiệp mà hành trang quý báu để em bước vào thực tế công việc sau trường Em xin gửi lời cảm ơn đến gia đình, bạn bè, đồng chí đồng đội ln bên cạnh, giúp đỡ em thời gian qua Trong trình thực đồ án khơng tránh khỏi có thiếu sót Em mong nhận giúp đỡ, đóng góp ý kiến từ thầy cơ, bạn bè, đồng chí đồng đội để em tiếp tục sâu, tìm hiểu mở rộng thêm nhằm hoàn thiện phát triển đề tài Em xin chân thành cảm ơn! i LỜI CAM ĐOAN Tôi xin cam đoan đồ án tự nghiên cứu hướng dẫn thầy TS Trần Quan Huy Để hoàn thành đồ án này, sử dụng tài liệu ghi mục tài liệu tham khảo, ngồi khơng sử dụng tài liệu khác mà không ghi Nếu sai tơi xin chịu hình thức kỷ luật theo quy định Học viện Hà Nội, ngày tháng năm 2022 Học viên thực Mai văn Tuấn ii MỤC LỤC LỜI CẢM ƠN i LỜI CAM ĐOAN ii MỤC LỤC iii DANH MỤC CÁC TỪ VIẾT TẮT v DANH MỤC HÌNH VẼ vi LỜI NÓI ĐẦU vii CHƯƠNG 1: TỔNG QUAN VỀ TRAO ĐỔI KHOÁ TRÊN ĐƯỜNG CONG ELLIPTIC 1.1 Lý thuyết đường cong Elliptic 1.1.1 Khái niệm đường cong Elliptic 1.1.2 Phép toán đường cong Elliptic 1.1.3 Hệ mật đường cong Elliptic 1.1.4 Bài toàn logarit rời rạc đường cong Elliptic (ECDLP) 1.1.5 Phép nhân với số nguyên toán logarit rời rạc đường cong Elliptic.4 1.2 Giao thức thỏa thuận khóa Diffie – Hellman đường cong Elliptic 1.2.1 Lược đồ giao thức thỏa thuận khóa Diffie – Hellman nguyên thủy 1.2.2 Lược đồ giao thức thỏa thuận khóa Diffie – Hellman đường cong Elliptic 1.2.3 Vấn đề an toàn giao thức trao đổi khóa đường cong Elliptic 1.3 Kết luận chương 11 CHƯƠNG 2: GIAO THỨC TRAO ĐỔI KHÓA CÓ MÃ HÓA EKE 12 2.1 Giới thiệu 12 2.2 Giao thức EKE trường hữu hạn 13 2.2.1 Giao thức trao đổi khóa có mã hóa EKE trường hữu hạn 13 2.2.2 Các ví dụ hoạt động giao thức trao đổi khóa có mã hóa EKE trường hữu hạn 15 2.3 Giao thức EKE đường cong Elliptic 16 2.3.1 Giao thức trao đổi khóa có mã hóa EKE đường cong Elliptic 16 2.3.2 Các toán cụ thể đường cong Elliptic 18 2.4 Ứng dụng giao thức EKE 19 2.5 Vấn đề an toàn giao thức EKE 20 iii 2.6 Kết luận chương 21 CHƯƠNG 3: CÀI ĐẶT MÔ PHỎNG GIAO THỨC EKE TRÊN ĐƯỜNG CONG ELLIPTIC 23 3.1 Phân tích thiết kế chương trình cài đặt mô 23 3.1.1 Biểu đồ Use case tổng quát 23 3.1.2 Biểu đồ phân rã chức tạo khóa 23 3.1.3 Biểu đồ phân rã chức bên gửi 24 3.1.4 Biểu đồ phân rã chức bên nhận 25 3.2 Phân tích luồng thơng tin truyền nhận 27 3.3 Modun cài đặt 29 3.3.1 Modun đường cong SECP 256k1 29 3.3.2 Modun mã hóa giải mã 29 3.3.3 Modun hàm dẫn xuất khóa PBKDF2 32 3.4 Kết thử nghiệm 33 3.4.1 Giao diện chương trình hồn thiện 33 3.4.2 Kết chạy thử nghiệm 36 3.5 Phân tích độ an toàn tham số cài đặt 40 3.5.1 Độ an toàn thuật toán mã khối AES 40 3.5.2 Độ an toàn tham số SECP 41 3.5.3 Độ an toàn tham số PBKDF2-HMAC-SHA256 41 3.6 Kết luận chương 41 KẾT LUẬN 42 TÀI LIỆU THAM KHẢO 43 iv DANH MỤC CÁC TỪ VIẾT TẮT Viết tắt Tiếng Anh Tiếng việt AES Advanced Encryption Standard Chuẩn mã hóa tiên tiến CCM Counter with Cipher Block Chaining Message Authentication Code Chế độ đếm kết hợp mã xác thực CBC D-H Diffie – Hellman Giao thức thỏa thuận khóa EAP Extensible Authentication Protocol Giao thức xác thực mở rộng ECB Electronic Codebook Chế độ sách mã điện tử ECC Elliptic Curve Cryptography Mật mã đường cong Elliptic EKE Encrypted Key Exchange Trao đổi khóa mã hóa ECDLP Elliptic Curve Discrete Logarithm Problem Bài tốn Logarithm rời rạc đường cong Ellliptic ECIES Elliptic Curve Integrated Encryption Scheme Lược đồ mã hoá kết hợp Hashed Message Authentication Code Mã xác thực thông báo dựa hàm băm Key Derivation Function Hàm dẫn xuất khóa Password-Based Key Derivation Function Hàm dẫn xuất khóa dựa mật Rivest–Shamir–Adleman Thuật toán RSA Standards for Efficient Cryptography Tiêu chuẩn đánh giá mật mã hiệu SHA Secure Hash Algorith Thuật toán hàm băm SHA NIST National Institure of Standard and Technology Viện tiêu chuẩn công nghệ Quốc gia Hoa kỳ HMAC KDF PBKDF RSA SECP v DANH MỤC HÌNH VẼ Hình 1.1 Sơ đồ hoạt động hệ mật đường cong Elliptic Hình 1.2 Lược đồ giao thức trao đổi khóa Diffie – Hellman nguyên thủy Hình 1.3 Lược đồ giao thức thỏa thuận Diffie – Hellman Hình 2.1 Giao thức EKE trường hữu hạn 13 Hình 2.2 EKE với Elliptic Curves ECC 21Error! Bookmark not defined Hình 2.3 Trao đổi EAP-EKE thành công 19 Hình 2.4 Quá trình thực thi EAP-EKE 20 Hình 3.1 Use case tổng quát 23 Hình 3.2 Phân rã chức tạo khóa 24 Hình 3.3 Phân rã chức bên gửi 25 Hình 3.4 Phân rã chức bên nhận 26 Hình 3.5 Luồng thơng tin truyền nhận 27 Hình 3.6 Tham số đường cong Secp256r1 29 Hình 3.7 Lưu đồ thuật toán mã hoá 30 Hình 3.8 Lưu đồ thuật toán giải mã 31 Hình 3.9 Chế độ hoạt động sách mã điện tử ECB 32 Hình 3.10 Giao diện tạo khóa 34 Hình 3.11 Giao diện bên gửi 35 Hình 3.12 Giao diện bên nhận 36 Hình 3.13 Tạo mật băm mật 37 Hình 3.14 Sinh số ngẫu nhiên a tính Ep(aG) 37 Hình 3.15 Sinh số ngẫu nhiên b tính Ep(bG) 38 Hình 3.16 Tính khố bí mật dùng chung 38 Hình 3.17 Bob tính thơng điệp chào 39 Hình 3.18 Alice tính thơng điệp chào 39 Hình 3.19 Hai bên trao đổi khố thành cơng 40 Hình 3.20 Độ an tồn thuật toán mã khối AES 40 vi LỜI NÓI ĐẦU Thời gian gần công mạng gia tăng số lượng quy mô, diễn ngày tinh vi phức tạp Nhiều cơng có chủ đích nhằm vào quan Chính phủ, hệ thống thông tin quan trọng nhiều lĩnh vực Hầu hết doanh nghiệp chưa trọng hay có nhận thức đầy đủ vấn đề an ninh mạng dễ bị công vào lỗ hổng Mật mã biện pháp việc đảm bảo dịch vụ an tồn thơng tin như: bí mật, xác thực, tồn vẹn chống chối bỏ Để việc sử dụng mật mã đảm bảo an tồn thơng tin cần u cầu thuật tốn, tham số sử dụng khóa Trong đó, khóa thành phần quan trọng việc đảm bảo an toàn hệ mật sử dụng Bài tốn trao đổi khóa đặt bên liên lạc có nhiều giao thức trao đổi khóa khác nghiên cứu áp dụng vào hệ thống công nghệ thông tin ngày Trao đổi khóa mã hóa EKE tạo Steven M Bellovin Michael Meritt có sử dụng chế xác thực bên liên lạc mã hóa thơng điệp trao đổi khóa Diffie-Hellman Điều khắc phục nhược điểm giao thức trao đổi khóa Diffie-Hellman khơng có chế xác thực bị công xen Với lý nên tơi chọn đề tài “Tìm hiều, thực thi giao thức trao đổi khóa có mã hóa EKE đường cong Elliptic” nhằm hiểu sâu giao thức trao đổi khóa vii CHƯƠNG 1: TỔNG QUAN VỀ TRAO ĐỔI KHOÁ TRÊN ĐƯỜNG CONG ELLIPTIC 1.1 Lý thuyết đường cong Elliptic 1.1.1 Khái niệm đường cong Elliptic Phương trình đường cong Elliptic sử dụng mật mã thường dùng dạng weierstrass: 𝑦 = 𝑥 + 𝑎𝑥 + 𝑏(𝑚𝑜𝑑 𝑝) Với điều kiện: 4𝑎3 + 27𝑏2 (𝑚𝑜𝑑 𝑝) ≠ Đường cong ký hiệu 𝐸𝑝 (𝑎, 𝑏) 1.1.2 Phép toán đường cong Elliptic Giả sử 𝑃 = (𝑥1 , 𝑦1 ), 𝑄 = (𝑥2 , 𝑦2 ) điểm nhóm 𝐸𝑝 (𝑎, 𝑏), O điểm vơ Các quy tắc phép cộng nhóm E p ( a, b ) sau: (1) 𝑃 + 𝑂 = 𝑂 + 𝑃 = 𝑃 (2) Nếu 𝑥2 = 𝑥1 𝑦2 = −𝑦1 , tức 𝑃 = (𝑥1 , 𝑦1 ) 𝑄 = (𝑥2 , 𝑦2 ) = (𝑥1 , −𝑦1 ) = −𝑃 𝑃 + 𝑄 = 𝑂 (3) Nếu 𝑄 ≠ −𝑃 tổng 𝑃 + 𝑄 = (𝑥3 , 𝑦3 ) cho bởi: 𝑥3 = (𝜆2 − 𝑥1 − 𝑥2 ) 𝑚𝑜𝑑 𝑝 𝑦3 = (𝜆(𝑥1 − 𝑥3 ) − 𝑦1 ) 𝑚𝑜𝑑 𝑝 Trong đó: 𝑦2 -y1 P ≠ 𝑄 𝑥2 -x1 𝜆= 3x12 +a 𝑘ℎ𝑖 P=Q { 2y1 1.1.3 Hệ mật đường cong Elliptic Năm 1993, Demytko đưa thuật toán tương tự RSA cho đường cong Elliptic Z n , Menezes Vanstone đưa phương pháp thực thi thiết bị phần cứng để cải thiện phép tính tốn Elliptic trường hữu self.outputBGLabel.setText(_translate("MainWindow", "Output bG")) self.outputC1Label.setText(_translate("MainWindow", "Output C1")) self.outputShareKeyKLabel.setText(_translate("MainWindow", Share Key (K)")) "Output self.ekC1C2Label.setText(_translate("MainWindow", Ek(C1,C2)")) "Output self.inputEkC2Label.setText(_translate("MainWindow", "Input Ek(C2)")) self.outputC2Label.setText(_translate("MainWindow", "Output C2")) self.btncalepag.setText(_translate("MainWindow", "Calculator Ep(aG)")) self.btbcalk.setText(_translate("MainWindow", "Calculator Share Key (K)")) self.btnekc1c2.setText(_translate("MainWindow", Ek(C1,C2)")) "Calculator self.btncalc2.setText(_translate("MainWindow", "Calculator C2")) self.label_2.setText(_translate("MainWindow", "MTP - K26")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Alice - Sender")) self.inputKeyLabel_2.setText(_translate("MainWindow", "Input Key")) self.inputALabel_2.setText(_translate("MainWindow", "Input b")) self.btngenerateb.setText(_translate("MainWindow", "Generate b")) self.outoutAGLabel_2.setText(_translate("MainWindow", "Output bG")) self.outputEpAGLabel_2.setText(_translate("MainWindow", "Output Ep(bG)")) self.inputEpBGLabel_2.setText(_translate("MainWindow", "Input Ep(aG)")) self.outputShareKeyKLabel_2.setText(_translate("MainWindow", "Output 67 Share Key (K)")) self.ekC1C2Label_2.setText(_translate("MainWindow", "Output Ek(C1)")) self.inputEkC2Label_2.setText(_translate("MainWindow", Ek(C1C2)")) "Input self.outputC2Label_2.setText(_translate("MainWindow", "Output C2")) self.outputEkC2Label.setText(_translate("MainWindow", "Output Ek(C2)")) self.btncalepbg.setText(_translate("MainWindow", "Calculator Ep(bG)")) self.btbcalk_2.setText(_translate("MainWindow", "Calculator Share Key (K)")) self.btnekc1.setText(_translate("MainWindow", "Calculator Ek(C1)")) self.btncalc2_2.setText(_translate("MainWindow", "Calculator Ek(C2)")) self.label_3.setText(_translate("MainWindow", "MTP - K26")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Bob - Receiver")) #tinh khoa ban dau def kdfkhoa(self): secret = self.fi_inputpass.text() if (secret == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Nhập vào password") msg.setWindowTitle("Thông báo") msg.exec_() return 68 key = PBKDF2(str(secret), hmac_hash_module=SHA256) salt, 32, self.fi_outkey.setText(key.hex()) #Alice sinh so ngau nhien a def generatea(self): a = random.randint(0, curve.n - 1) self.fi_ina.setText(str(a)) #Alice tinh aG va Ep(aG) def caclepag(self): key = self.fi_inkey.text() if (key == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Nhập vào Key") msg.setWindowTitle("Thông báo") msg.exec_() return key = bytes.fromhex(key) a = self.fi_ina.text() if (key == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Chưa sinh a") msg.setWindowTitle("Thông báo") msg.exec_() 69 count=1000, return a = int(a) A = scalar_mult(a, curve.g) A_cipher = encrypt(str(A), key) self.fi_outag.setText(str(A)) self.fi_outepag.setText(A_cipher.hex()) #Bob sinh so ngau nhien b def generateb(self): b = random.randint(0, curve.n - 1) self.fi_inb.setText(str(b)) #Bob tinh bG va Ep(bG) def caclepbg(self): key = self.fi_inkey_2.text() if (key == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Nhập vào Key") msg.setWindowTitle("Thông báo") msg.exec_() return key = bytes.fromhex(key) b = self.fi_inb.text() if (b == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) 70 msg.setInformativeText("Chưa sinh b") msg.setWindowTitle("Thông báo") msg.exec_() return b = int(b) B = scalar_mult(b, curve.g) B_cipher = encrypt(str(B), key) self.fi_outbg_3.setText(str(B)) self.fi_outepbg_3.setText(B_cipher.hex()) #Bob tinh khoa phien lien lac def bobcalsharekey(self): A_cipher = self.fi_outepag_2.text() if (A_cipher == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Nhập vào Ep(aG)") msg.setWindowTitle("Thông báo") msg.exec_() return key = self.fi_inkey_2.text() if (key == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Nhập vào Key") msg.setWindowTitle("Thông báo") 71 msg.exec_() return b = self.fi_inb.text() if (b == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Chưa sinh b") msg.setWindowTitle("Thông báo") msg.exec_() return b = int(b) key = bytes.fromhex(key) A_cipher = bytes.fromhex(A_cipher) B_receive = topoint(decrypt(A_cipher, key)) KeyBob = scalar_mult(b, B_receive) NewKey = PBKDF2(str(KeyBob), hmac_hash_module=SHA256) salt, 32, self.fi_outk_2.setText(NewKey.hex()) #Bob ma hoa "IamBob bang khoa moi de gui sang Alice def bobcalepc1(self): NewKey = self.fi_outk_2.text() if (NewKey == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Chưa tính Share Key (K)") 72 count=1000, msg.setWindowTitle("Thông báo") msg.exec_() return NewKey = bytes.fromhex(NewKey) c1 = "IAmBob" c1_cipher = encrypt(c1, NewKey) self.fi_outekekc1.setText(c1_cipher.hex()) #Alice tính khóa phiên liên lạc thơng điệp Bob gửi sang def alicecalsharekey(self): B_cipher = self.fi_outepbg.text() if (B_cipher == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Nhập vào Ep(bG)") msg.setWindowTitle("Thông báo") msg.exec_() return B_cipher = bytes.fromhex(B_cipher) key = self.fi_inkey.text() if (key == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Nhập vào Key") msg.setWindowTitle("Thông báo") msg.exec_() 73 return key = bytes.fromhex(key) a = self.fi_ina.text() if (key == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Chưa sinh a") msg.setWindowTitle("Thông báo") msg.exec_() return a = int(a) c1_cipher = self.fi_inekc1.text() if (c1_cipher == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Nhập vào Ek(C1)") msg.setWindowTitle("Thông báo") msg.exec_() return c1_cipher = bytes.fromhex(c1_cipher) bG = decrypt(B_cipher,key) A_receive = topoint(bG) Key = scalar_mult(a, A_receive) newkey = PBKDF2(str(Key), hmac_hash_module=SHA256) 74 salt, 32, count=1000, c1 = decrypt(c1_cipher,newkey) print(bG) print(c1) self.fi_outbg.setText(bG) self.fi_outc1.setText(c1) self.fi_outk.setText(newkey.hex()) #Alice ma hoa thong diep C1, C2 bang khoa trao doi def alicecalekc1c2(self): c1 = self.fi_outc1.text() if (c1 == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Chưa có C1") msg.setWindowTitle("Thông báo") msg.exec_() return c2 = "IAmAlice" c1c2 = ' '.join([c1,c2]) newkey = self.fi_outk_2.text() if (newkey == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Chưa tính Share Key (K)") msg.setWindowTitle("Thơng báo") msg.exec_() 75 return newkey = bytes.fromhex(newkey) c1c2_cipher = encrypt(c1c2, newkey) self.fi_outekc1c2.setText(c1c2_cipher.hex()) #Bob nhận thông điệp giải mã thu c1c2 def bobcalc1c2(self): NewKey = self.fi_outk_2.text() if (NewKey == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Chưa tính Share Key (K)") msg.setWindowTitle("Thơng báo") msg.exec_() return NewKey = bytes.fromhex(NewKey) c1c2_cipher = self.fi_outekc1c2.text() if ( c1c2_cipher == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Nhập vào Ek(C1C2)") msg.setWindowTitle("Thông báo") msg.exec_() return c1c2_cipher = bytes.fromhex(c1c2_cipher) c1c2 = decrypt(c1c2_cipher,NewKey) 76 c1c2 = c1c2.split(" ") c2 = c1c2[1] c2_cipher = encrypt(c2,NewKey) self.fi_outc2_2.setText(c2) self.fi_outputEkC2.setText(c2_cipher.hex()) def alicecalc2(self): newkey = self.fi_outk_2.text() if (newkey == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Chưa tính Share Key (K)") msg.setWindowTitle("Thông báo") msg.exec_() return newkey = bytes.fromhex(newkey) c2_cipher = self.fi_inekc2.text() if (newkey == ""): msg = QtWidgets.QMessageBox() msg.setIcon(QtWidgets.QMessageBox.Information) msg.setInformativeText("Nhập vào Ek(C2)") msg.setWindowTitle("Thông báo") msg.exec_() return c2_cipher = bytes.fromhex(c2_cipher) c2 = decrypt(c2_cipher, newkey) 77 self.fi_outc2.setText(c2) if name == " main ": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_()) 78 PHỤC LỤC MƠ ĐUN SINH KHĨA BÍ MẬT /* Hàm PBKDF2 */ void PKCS5_PBKDF2_HMAC(unsigned char *password, size_t plen, unsigned char *salt, size_t slen, const unsigned long iteration_count, const unsigned long key_length, unsigned char *output) { sha2_context ctx; sha2_starts(&ctx, 0); // Size of the generated digest unsigned char md_size = 32; unsigned char md1[32]; unsigned char work[32]; unsigned long counter = 1; unsigned long generated_key_length = 0; while (generated_key_length < key_length) { // U1 ends up in md1 and work unsigned char c[4]; c[0] = (counter >> 24) & 0xff; c[1] = (counter >> 16) & 0xff; c[2] = (counter >> 8) & 0xff; c[3] = (counter >> 0) & 0xff; sha2_hmac_starts(&ctx, password, plen, 0); sha2_hmac_update(&ctx, salt, slen); sha2_hmac_update(&ctx, c, 4); sha2_hmac_finish(&ctx, md1); memcpy(work, md1, md_size); unsigned long ic = 1; for (ic = 1; ic < iteration_count; ic++) { // U2 ends up in md1 sha2_hmac_starts(&ctx, password, plen, 0); sha2_hmac_update(&ctx, md1, md_size); 79 sha2_hmac_finish(&ctx, md1); // U1 xor U2 unsigned long i = 0; for (i = 0; i < md_size; i++) { work[i] ^= md1[i]; } // and so on until iteration_count } // Copy the generated bytes to the key unsigned long bytes_to_write = min((key_length - generated_key_length), md_size); memcpy(output + generated_key_length, work, bytes_to_write); generated_key_length += bytes_to_write; ++counter; } } 80 HỌC VIỆN BƯU CHÍNH VIỄN THƠNG CỘNG HỊA XÃ HỘI CHỦ NGHĨA VIỆT NAM PHÒNG ĐÀO TẠO Độc lập - Tự - Hạnh phúc BẢN XÁC NHẬN NƠI CHẾ BẢN IN ẤN ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Đề tài: " Tìm hiểu, thực thi giao thức trao đổi khóa có mã hóa EKE đường cong elliptic " Giảng viên hướng dẫn: TS Trần Quan Huy Học viên thực hiện: Mai văn Tuấn Lớp: K26 Khóa: 2019 - 2022 Loại hình đào tạo: Liên thơng Chun ngành: CÔNG NGHỆ THÔNG TIN Đồ án tốt nghiệp đại học chế in ấn tại: Phòng đóng xén NGƯỜI THỰC HIỆN CHẾ BẢN: Ngày… tháng… năm 20… XÁC NHẬN CỦA NƠI CHẾ BẢN ( Ghi rõ họ tên) 81