Để bắt kịp với xu thế hiện tại, Google – một trong những tập đoàn Công nghệ thông tin lớn nhất thế giới, đã phát hành Tink – một thư viện mật mã đa ngôn ngữ, đa nền tảng. Với OpenSSL, họ có các ràng buộc phức tạp và thường tập trung vào các hệ thống cụ thể, chẳng hạn như đối với các tệp DLL trong hệ thống Windows. Tink là nguồn mở và tập trung vào việc tạo các API đơn giản và giúp cơ sở hạ tầng dễ di chuyển hơn.
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 ĐẠI HỌC ĐỀ TÀI: TÌM HIỂU, THỰC THI THƯ VIỆN MẬT MÃ GOOGLE TINK ỨNG DỤNG TRONG KÝ SỐ VĂN BẢN ĐIỆN TỬ Cán hướng dẫn : TS Nguyễn Mạnh Hợp Sinh viên thực : Hà Huy Vương Lớp : K26 Khóa : 26 Chun 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 ĐẠI HỌC ĐỀ TÀI: TÌM HIỂU, THỰC THI THƯ VIỆN MẬT MÃ GOOGLE TINK ỨNG DỤNG TRONG KÝ SỐ VĂN BẢN ĐIỆN TỬ Cán hướng dẫn : TS Nguyễn Mạnh Hợp Sinh viên thực : Hà Huy Vương Lớp : K26 Khóa : 26 Chuyên ngành : Công nghệ thông tin Hà Nội, 2022 LỜI CẢM ƠN Em xin gửi lời cảm ơn quan tâm, giúp đỡ thầy cô Khoa công nghệ thông tin, thầy cô Học viện bưu viễn thơng Đặc biệt TS Nguyễn Mạnh Hợp trực tiếp hướng dẫn giúp đỡ em nhiều suốt trình nghiên cứu hoàn thành đồ án LỜI CAM ĐOAN Em xin cam đoan đồ án em tự nghiên cứu hướng dẫn TS Nguyễn Mạnh Hợp Để hoàn thành đồ án này, em sử dụng tài liệu ghi 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, em xin chịu hình thức kỷ luật theo quy định Học viện bưu viễn thơng Hà Nội, ngày tháng năm 2022 Học viên thực Hà Huy Vương MỤC LỤC MỤC LỤ Contents LỜI CẢM ƠN LỜI CAM ĐOAN MỤC LỤC DANH MỤC KÝ HIỆU, TỪ VIẾT TẮT DANH MỤC HÌNH VẼ ERROR! BOOKMARK NOT DEFINED DANH MỤC BẢNG BIỂU LỜI NÓI ĐẦU CHƯƠNG 1: TỔNG QUAN THƯ VIỆN MẬT MÃ 10 1.1 Giới thiệu thư viện mật mã 10 1.1.1 Khái niệm 10 1.1.2 Vai trò thư viện mật mã 10 1.2 Một số thư viện mật mã phổ biến 10 1.2.1 OpenSSL 10 1.2.2 Thư viện mật mã Crypto ++ 12 1.2.3 GMP 14 1.2.4 JCA 15 1.3 So sánh thư viện mật mã 15 1.4 Ứng dụng thư viện mật mã 16 1.4.1 Bảo mật thông tin lưu trữ xây dựng phần mềm bảo mật 16 1.4.2 Bảo mật thông tin kênh truyền 19 1.5 Kết luận 23 CHƯƠNG THƯ VIỆN MẬT MÃ GOOGLE TINK 24 2.1 Giới thiệu 24 2.2 Kiến trúc lớp thuật toán mật mã 25 2.2.1 AEAD (Authenticated Encyption with Associated Data) 26 2.2.2 Streaming AEAD 33 2.2.3 Deterministic AEAD 34 2.2.4 Mac 35 2.2.5 PRF 36 2.2.6 Digital Signatures 36 2.2.7 Hybrid Encryption 39 2.3 So sánh Google Tink so với thư viện mật mã khác 42 2.4 Ứng dụng Google tink 44 2.5 Kết luận 45 CHƯƠNG 3: CÀI ĐẶT MÔ PHỎNG CHƯƠNG TRÌNH KÝ SỐ VĂN BẢN ĐIỆN TỬ VỚI GOOGLE TINK 45 3.1 Cấu trúc mã nguồn cài đặt Google Tink 45 3.2 Sơ đồ thiết kế chung chương trình cài đặt mơ 48 3.3 Xây dựng modun thực thi 49 3.3.1 Modun tạo khóa 49 3.3.2 Modun ký số 51 3.3.3 Modun kiểm tra ký số 52 3.4 Hoàn thiện, thử nghiệm 53 KẾT LUẬN 58 DANH MỤC KÝ HIỆU, 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 DES Data Encryption Standard Tiêu chuẩn mã hóa liệu Elliptic Curve Digital Signature Algorithm Thuật toán chữ ký số đường cong elliptic Structured Query Language Ngôn ngữ truy vấn sở liệu AEAD ECDSA TLS SQL DANH MỤC BẢNG BIỂU Bảng 1.1: Các thuật toán triển khai Crypto ++ 12 Bảng 1.2: So sánh thư viện mật mã 15 LỜI NÓI ĐẦU Ngày nay, Internet phổ biến rộng rãi, tổ chức, cá nhân có nhu cầu giới thiệu thơng tin mạng xã hội thực phiên giao dịch trực tuyến Vấn đề nảy sinh phạm vi ứng dụng ứng dụng Web ngày mở rộng khả xuất lỗi bị công cao, trở thành đối tượng cho nhiều người cơng với mục đích khác Nhiều nhà phát triển tập đoàn lớn sử dụng kỹ thuật mật mã để bảo vệ liệu người dùng Trong mật mã, lỗi triển khai nhỏ gây hậu nghiêm trọng việc hiểu cách triển khai mật mã cách xác cơng việc phức tạp tốn nhiều thời gian Để bắt kịp với xu tại, Google – tập đồn Cơng nghệ thông tin lớn giới, phát hành Tink – thư viện mật mã đa ngôn ngữ, đa tảng Với OpenSSL, họ có ràng buộc phức tạp thường tập trung vào hệ thống cụ thể, chẳng hạn tệp DLL hệ thống Windows Tink nguồn mở tập trung vào việc tạo API đơn giản giúp sở hạ tầng dễ di chuyển Chính em chọn đề tài “Tìm hiểu, thực thi thư viện mật mã Google Tink ứng dụng ký số văn điện tử” làm đề tài nghiên cứu CHƯƠNG 1: TỔNG QUAN THƯ VIỆN MẬT MÃ 1.1 Giới thiệu thư viện mật mã 1.1.1 Khái niệm Thư viện mật mã tập tin mã nguồn viết ngơn ngữ lập trình khác C, C++, Python… Và tập tin mã nguồn thực triển khai cài đặt thuật toán mật mã: hệ mật khóa cơng khai, hệ mật khóa bí mật, hàm băm, chữ ký số, giao thức trao đổi khóa Các tập tin thiết kế liên hệ mật thiết mã nguồn thống 1.1.2 Vai trò thư viện mật mã Thư viện mật mã đóng vai trị quan trọng việc triển khai thuật toán mật mã, nhằm: - Cung cấp mã nguồn thực thi cho triển khai giao thức bảo mật Ipsec, TLS - Cung cấp mã nguồn thực thi cho việc xây dựng phần mềm bảo mật liệu: Bitlocker, Winrar, Veracrypt - Cung cấp mã nguồn thực thi cho phát triển phần mềm triển khai hạ tầng sở khóa cơng khai: EJBCA, OpenCA, Open XPKI - Cung cấp mã nguồn thực thi cho dự án phát triển sản phẩm phần mềm bảo mật truyền thông VoiIP, Bank… 1.2 Một số thư viện mật mã phổ biến 1.2.1 OpenSSL Open SSL thư viện mật mã mã nguồn mở viết lập trình C C++ cung cấp mà nguồn cài đặt cho triển khai giao thức bảo mật SSL/TLS 2.5 Kết luận Chương 2, đồ án sâu trình bày chi tiết, rõ ràng thư viện mật mã Google Tink Cụ thể nội dụng trình bày sau: - Giới thiệu thư viện - Kiến trúc lớp thuật toán mật mã thư viện hỗ trợ - So sánh Google Tink số thư viện mật mã khác - Ứng dụng thư viện mật mã Google Tink Qua nội dung thấy Google Tink thư viện mật mã có kiến trúc phân lớp rành mạch, dễ sử dụng có tiêu chuẩn bảo mật rõ ràng cho thuật toán mật mã hỗ trợ CHƯƠNG 3: CÀI ĐẶT MƠ PHỎNG CHƯƠNG TRÌNH KÝ SỐ VĂN BẢN ĐIỆN TỬ VỚI GOOGLE TINK Chương đồ án thực cài đặt mô lược đồ ký số ECDSA với thư viện Google Tink với ngôn ngữ hỗ trợ Python 3.1 Cấu trúc mã nguồn cài đặt Google Tink Để cài đặt mô lược đồ ký số ECDSA mục chương đồ án giới thiệu qua cấu trúc mã nguồn thư viện Google Tink Hình 3.1 giới thiệu source code thư viện google Tink github Hình 3.1: Source code thư viện Tink - app: thư mục chứa ứng dụng phụ thuộc function mở rộng cho Tink - cc: source code thư viện cho ngôn ngữ c++ - cmake: hỗ trợ build thư viện file config, - docs: chứa tài liệu thư viện - examples: code mẫu cho function - go: source code thư viện cho ngôn ngữ go - java_src: source code thư viện cho ngôn ngữ java - javascripts: source code thư viện cho ngôn ngữ js - kokoro: dùng cho việc cicd project Chứa file shell testing trước tích hợp Đây cơng cụ phát triển cho Jenkins Goolge - maven: quản lý dự án tink cho phép developers quản lý version, dependencies ( thư viện sử dụng dự án ) , quản lý việc build, tự động download javadoc & source, … - objc: source code thư viện cho ngôn ngữ Object C - proto: protocol buffers hỗ trợ encode liệu type chung định nghĩa để sử dụng cho nhiều ngôn ngữ - python: source code thư viện cho ngôn ngữ python - testing: thư mục test phát triển thư viện - tools: thư mục chứa công cụ bổ sung thêm cho thư viện: liệu test, key testing, Thư viện sử dụng bazel để tự động hóa việc xây dựng kiểm tra Python Hình 3.2, đồ án chi tiết vào phần source code thư viện Google Tink hỗ trợ cho ngơn ngữ Python sử dụng ngôn ngữ lại để thực cài đặt mơ Hình 3.2: Source code thư viện Tink github dành cho Python Phần source code tink viết ngơn ngữ python cấu trúc hình gồm: - testdata: chứa liệu để test cho thư viện - tools: chứa công cụ bổ sung cho việc build - tink: thư mục chứa code xử lý thư viện Và file version config liên quan khác Hình 3.3 bên thể cấu trúc thư viện Tink hỗ trợ cho ngơn ngữ Python Hình 3.2: Cấu trúc thư viện Tink viết Python Phần thư mục Google Tink ta thấy chia rõ ràng module Phần đồ án thực thi mã nguồn module signature 3.2 Sơ đồ thiết kế chung chương trình cài đặt mơ Bắt đầu Nhập thơng điệp Sinh khóa nhận khóa cơng khai/riêng A - Ký số B - Kiểm tra chữ ký Thực ký số Kiểm tra chữ ký Hình Error! No text of specified style in document 4: Sơ đồ khối hoạt động chương trình ký số Google tink - Chương trình ký số thư viện mật mã google tink gồm bước sau: Nhập thơng điệp cần ký Sinh khóa nhận khóa cơng khai/khóa riêng từ bên thứ tin cậy Chọn chế độ ký số hay kiểm tra chữ ký Nếu chế độ ký thì thực ký số trả chữ ký số thông điệp Nếu kiểm tra chữ ký số tiến hành kiểm tra chữ ký số trả kết kiểm tra chữ ký số thông điệp Kết thúc chương trình 3.3 Xây dựng modun thực thi 3.3.1 Modun tạo khóa Lược đồ ký số cài đặt thư viện Google Tink ECDSA Tham số đường cong đường cong NIST P-256 Nạp tham số đường cong theo NIST P-256 theo bảng p = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff a = 0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc b = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b G = (0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296, 0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5) n 0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551 Bây giờ, xem cách Google Tink tạo chữ ký điện tử Phương pháp cốt lõi sử dụng ECDSA (Thuật toán chữ ký số đường cong Elliptic) Đối với điều này, tạo cặp khóa với hàm getPrimitive cho PublicKeySignFactory Sau đó, sử dụng khóa riêng cặp khóa để ký thơng điệp hàm sign sau: KeysetHandle privateKeysetHandle = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_ P256); PublicKeySign signer = PublicKeySignFactory.getPrimitive(privateKeysetHandle ); byte[] signature = signer.sign(plaintext.getBytes()); Về cặp khóa, xem cặp khóa đây: Printing out key: { "primaryKeyId": 835639698, "key": [{ "keyData": { "typeUrl": "type.googleapis.com/google.crypto.tink.EcdsaPrivateK ey", "keyMaterialType": "ASYMMETRIC_PRIVATE", "value": "EkwSBggDEAIYAhogafr30IV05SpchJZvJfQ6ChyWxhNIVSjpmztk J+wYRusiIHCl4fYPSpuISdC18N9OhWQ9jZvky6B0ytnL97HqafbrG iEAxJzrrM7H3ONlzTRMdoPwWJ/PwkaQ2rCsUK5i3wGZMZQ=" }, "outputPrefixType": "TINK", "keyId": 835639698, "status": "ENABLED" }] } Chúng ta thấy khóa mã hóa sử dụng “EkwSBggDEAIYAho… GZMZQ =” định dạng EcdsPrivateKey xác định 3.3.2 Modun ký số Hàm ký số hỗ trợ Google Tink hàm signer.sign với đầu vào rõ (plaintext) đầu chữ ký số dạng byte Chữ ký số chuyển dạng mã MAC dạng hexa public static Exception { void main(String[] args) throws TinkConfig.register(); try { String plaintext="napier"; if (args.length>0) plaintext=args[0]; System.out.println("Text:\t"+plaintext); KeysetHandle privateKeysetHandle = KeysetHandle.generateNew(SignatureKeyTemplates.ECDSA_ P256); PublicKeySign signer = PublicKeySignFactory.getPrimitive(privateKeysetHandle ); byte[] signature signer.sign(plaintext.getBytes()); = byte[] encoded Base64.getEncoder().encode(signature); = System.out.println("\nMAC String(encoded)); (Base64):\t"+ new System.out.println("MAC toHexString(encoded)); (Hex):"+ 3.3.3 Modun kiểm tra ký số Hàm ký số hỗ trợ Google Tink hàm verifier.verify với đầu vào rõ (plaintext) chữ ký số dạng byte Đầu thông báo chữ ký số hợp lệ hay không hợp lệ KeysetHandle publicKeysetHandle privateKeysetHandle.getPublicKeysetHandle(); = PublicKeyVerify verifier PublicKeyVerifyFactory.getPrimitive( publicKeysetHandle); = try { verifier.verify(signature, plaintext.getBytes()); System.out.println("\nValid Signature"); } catch (GeneralSecurityException e) { System.out.println("In Valid Signature"); } System.out.println("\nPrinting out key:"); ByteArrayOutputStream ByteArrayOutputStream(); outputStream = new CleartextKeysetHandle.write( privateKeysetHandle, JsonKeysetWriter.withOutputStream(outputStream)); System.out.println(new String(outputStream.toByteArray())); } catch (GeneralSecurityException e) { System.out.println(e); System.exit(1); } } public static String toHexString( byte[] bytes ) { StringBuffer bytes.length*2 ); sb = new StringBuffer( for( int i = 0; i < bytes.length; i++ ) { sb.append( toHex(bytes[i] >> 4) ); sb.append( toHex(bytes[i]) ); } return sb.toString(); } private static char toHex(int nibble) { final char[] hexDigit = { '0','1','2','3','4','5','6','7','8','9','A','B',' C','D','E','F' }; 3.4 Hoàn thiện, thử nghiệm Chạy code phần mềm VMWare (Ubuntu version 20.04.04): Cài đặt Python3 B1: Update lại repository sudo apt update B2: Cài python sudo apt install python3.9 B3: Kiểm tra version python3.9 –version Cài đặt pip3 B1: Cài đặt pip3 sudo apt install python3-pip B2: Kiểm tra pip3 version Cài đặt google tink pip3 install tink Cài đặt Go Ubuntu B1: Cài đặt sudo apt-get install golang-go B2: Kiểm tra vesion go version Cài đặt Git Ubuntu apt-get install subversion apt-get install libapache2-svn sudo apt-get install subversion sudo apt-get install libapache2-svn sudo apt-get install git sudo add-apt-repository ppa:git-core/ppa sudo apt update sudo apt install git Cài đặt Google tink Ubuntu Go: VD: go get github.com/google/tink/go/ Chạy chương trình chữ ký số ECDSA Go ubuntu Câu lệnh: go get github.com/google/tink/go/keyset go get github.com/google/tink/go/signature go get github.com/google/tink/go/insecurecleartextkeyset B1: Tạo thư mục ed25519 mkdir ed25519 B2: Di chuyển vào thư mục ed25519 cd ed25519/ B3: Tạo file main.go touch main.go B4: Viết code vào main.go nano main.go Xong gõ đoạn code sau vào: // https://asecuritysite.com/encryption/go_tink04 package main import ( "fmt" "os" "github.com/google/tink/go/keyset" "github.com/google/tink/go/signature" "github.com/google/tink/go/insecurecleartextkeyset" ) func main() { msg:="This is a test" argCount := len(os.Args[1:]) if (argCount>0) { msg= (os.Args[1])} keyPriv, _ keyset.NewHandle(signature.ED25519KeyTemplate()) keyPub, _ := keyPriv.Public() s, _ := signature.NewSigner(keyPriv) a, _ := s.Sign([]byte(msg)) v, _ := signature.NewVerifier(keyPub) res := v.Verify(a, []byte(msg)) if (res != nil) { fmt.Println("Signature verification failed") } else { := fmt.Printf("Message: %s\n\n", msg) fmt.Printf("Signature: %x\n", a) fmt.Printf("\nPrivate Key: %s\n\n", keyPriv) fmt.Printf("Public Key: %s\n\n", keyPub) fmt.Println("Signature succeeded.\n\n") verification exportedPriv := &keyset.MemReaderWriter{} insecurecleartextkeyset.Write(keyPriv, exportedPriv) exportedPub := &keyset.MemReaderWriter{} insecurecleartextkeyset.Write(keyPub, exportedPub) fmt.Printf("Private Key ID: exportedPriv.Keyset.GetPrimaryKeyId()) fmt.Printf("Private exportedPriv.Keyset.GetKey()) Key fmt.Printf("Public Key ID: exportedPub.Keyset.GetPrimaryKeyId()) %d\n\n", %s:\n\n", %d\n\n", k:=exportedPub.Keyset.GetKey() fmt.Printf("Public Key %s:\n\n", k) } } Sau lưu file lại Ctrl +O, thoát: Ctrl + X B5: tạo file “go.mod”: vi go.mod Thêm dòng sau: module example.com/mod B6: Lưu lại file, tiến hành build chương trình golang lệnh sau: go build B7: Sau chạy chương trình lệnh sau: /mod Kết quả: 3.5 Kết luận Chương 3, đồ án trình bày trình xây dựng chương trình cài đặt mô lược đồ ký số ECDSA với Google Tink Cụ thể nội dung sau trình bày: - Cấu trúc mã nguồn cài đặt Google Tink - Sơ đồ thiết kế chung chương trình cài đặt mô - Các mô đun cài đặt - Hoàn thiện thử nghiệm KẾT LUẬN Sau thời gian nghiên cứu tìm hiểu, với hướng dẫn trực tiếp tận tình T.S Nguyễn Mạnh Hợp, đến em hoàn thành đồ án “Tìm hiểu, thực thi thư viện mật mã Google Tink ứng dụng ký số văn điện tử ” Đồ án em đạt kết sau: - Về mặt lý thuyết: + Trình bày kiến thức tổng quan thư viện mật mã: Khái niệm, số thư viện mật mã phổ biến nay, so sánh thư viện mật mã đưa ứng dụng thư viện mật mã + Trình bày chi tiết, rõ ràng thư viện mật mã Google Tink: Giới thiệu, kiến trúc lớp thuật toán mật mã tiêu chuẩn cài đặt thư viện này, so sánh Google Tink với thư viện mật mã khác - Về mặt thực hành: + Cài đặt mơ chương trình ký số văn điện tử với Goole Tink hệ điều hành Ubuntu - Hướng phát triển: nghiên cứu, đề xuất áp dụng phần mềm ký số văn điện tử với Google Tink vào công việc thực tế đơn vị Một lần em xin chân thành cảm ơn thầy, cô giáo Khoa cơng nghệ thơng tin tồn thể thầy cô giảng dạy lớp em suốt năm học Đặc biệt TS Nguyễn Mạnh Hợp giúp đỡ cho em hoàn thành đồ án Em xin chân thành cảm ơn! HỌC VIỆN BƯU CHÍNH VIỄN THƠNG PHỊNG ĐÀO TẠO CỘNG HỊA XÃ HỘI CHỦ NGHĨA VIỆT NAM Độ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 thư viện mật mã Google Tink ứng dụng ký số văn điện tử " Cán hướng dẫn : Nguyễn Mạnh Hợp - Ban Cơ yếu Chính phủ Học viên thực hiện: Nguyễn Văn Sơn Khóa: Loại hình đào tạo: Liên thơng đại học Chun ngành: Kỹ thuật mật mã Đồ á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: Nguyễn Tuấn Nam Ngày… tháng… năm 2022 XÁC NHẬN CỦA NƠI CHẾ BẢN ( Ghi rõ họ tên) Nguyễn Tuấn Nam