1. Trang chủ
  2. » Luận Văn - Báo Cáo

NGHIÊN CỨU THUẬT TOÁN CHACHA20 POLY1305

80 10 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 80
Dung lượng 1,32 MB

Nội dung

NGHIÊN CỨU THUẬT TOÁN CHACHA20 POLY1305 Trước đây, mật mã đối xứng khó đảm bảo được cả tính bí mật và tính xác thực trong cùng thuật toán mã hóa, để đảm bảo tính xác thực, một thuật toán chữ ký số hoặc MAC được dùng cùng với thuật toán mã hóa nhưng tính xác thực nguồn gốc thông điệp được hỗ trợ khá yếu. Để tăng cường tính xác thực này thì cần một thuật toán mã hóa có xác thực nhằm cung cấp đồng thời cả tính bí mật, xác thực và toàn vẹn cho thông báo trong một thuật toán duy nhất, loại bỏ những bước không cần thiết của việc sử dụng thuật toán MAC riêng biệt. Thuật toán AEAD ChaCha20Poly1305 được giới thiệu vào tháng 5 năm 2015 trong RFC7539. AEAD ChaCha20Poly1305 là một cấu trúc mã hóa dữ liệu liên kết (AEAD); là sự kết hợp của thuật toán mã hóa dòng ChaCha20 và thuật toán xác thực một lần Poly1305. Cả hai thuật toán ChaCha20 và Poly1305 đều được thiết kế bởi D.J Bernstein. Sự kết hợp của hai thuật toán ChaCha20 và Poly1305 cung cấp các thuộc tính an toàn cho cấu trúc AEAD ChaCha20Poly1305. Mặc dù, các tấn công kênh kề có thể áp dụng đối với ChaCha. Tuy nhiên, có thể dễ dàng khắc phục các tấn công này trong cài đặt thực tế, vì vậy AEAD ChaCha20Poly 1305 được xem là an toàn để sử dụng trong hệ thống thông tin hiện nay. Đồ án này sẽ đi nghiên cứu, tìm hiểu thuật toán mã dòng xác thực ChaCha20 Poly1305 bao gồm: sơ đồ hoạt động, thuật toán, cách thức hoạt động và đánh giá độ an toàn của thuật toán này Sau khi trình bày các kiến thức cơ bản về mã hóa ChaCha20 và mã xác thực thông báo Poly1305 cũng như cài đặt chương trình và thực nghiệm mã hóa và giải mã ChaCha20Poly1305, đồ án đã đạt được những kết quả như sau: Trình bày được tổng quan về mã dòng và mã xác thực thông báo. Đồ án đã tìm hiểu được những đặc điểm, tính chất và ứng dụng của mã dòng thông qua việc phân tích một số mật mã dòng và mã xác thực thông báo phổ biến hiện nay. Chỉ ra được tầm quan trọng của mã dòng xác thực. Đưa ra khuyến nghị sử dụng mã dòng xác thực ChaCha20Poly1305. Tiếp theo, đồ án diễn giải thuật toán, lược đồ hoạt động của mã hóa ChaCha20, mã xác thực thông báo Poly1305, AEAD ChaCha20Poly1305 kèm theo các ví dụ thực hiện với test vector. Đánh giá được độ an toàn của ChaCha20Poly1305 thông qua phân tích một số tấn công tiêu biểu. So sánh toàn diện ChaCha20Poly1305 với AESGCM để thấy được những ưu điểm vượt trội của thuật toán này cũng như triển vọng ứng dụng trong lĩnh vực di động và IoT. Tiến hành cài đặt và thực nghiệm chương trình mã hóa dữ liệu ChaCha20 Poly1305 bằng ngôn ngữ C, thực hiện sinh khóa, mã hóa và giải mã, cùng với đánh giá hiệu năng chương trình.

BAN CƠ YẾU CHÍNH PHỦ HỌC VIỆN KỸ THUẬT MẬT Mà ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ĐỒ ÁN TỐT NGHIỆP NGHIÊN CỨU THUẬT TOÁN CHACHA20 - POLY1305 Sinh viên thực hiện: Bùi Văn Minh Lớp: AT13 Hà Nội MỤC LỤC MỤC LỤC DANH MỤC KÝ HIỆU VIẾT TẮT DANH MỤC HÌNH VẼ DANH MỤC BẢNG LỜI CẢM ƠN Lỗi! Thẻ đánh dấu không được xác định LỜI CAM ĐOAN Lỗi! Thẻ đánh dấu khơng được xác định LỜI NĨI ĐẦU CHƯƠNG 1: TỔNG QUAN Mà DÒNG VÀ Mà XÁC THỰC THÔNG BÁO 1.1 Tổng quan mã dòng 1.1.1 Khái niệm mã dòng 1.1.2 Một số đặc điểm mã dòng 1.1.3 Đặc trưng mã dịng ứng dụng bảo mật thơng tin 1.1.4 Một số mã dòng phổ biến 12 1.2 Tổng quan mã xác thực thông báo 20 1.2.1 Khái niệm mã xác thực thông báo 20 1.2.2 Một số mã xác thực thông báo phổ biến 20 1.3 Mã hóa có xác thực 24 1.3.1 Khái niệm mã hóa có xác thực 24 1.3.2 Các phương pháp mã hóa có xác thực 25 1.4 Mã dòng xác thực ứng dụng 27 1.5 Tổng kết chương 30 CHƯƠNG 2: Mà DÒNG XÁC THỰC CHACHA20-POLY1305 31 2.1 Mã dòng ChaCha20 31 2.1.1 Phép QUARTERROUND hàm khối ChaCha20 31 2.1.2 Thuật tốn mã hóa ChaCha20 33 2.2 Mã xác thực thông báo Poly1305 37 2.3 Mã dòng xác thực ChaCha20 - Poly1305 41 2.4 Phân tích số cơng phổ biến lên ChaCha20-Poly1305 43 2.4.1 Tấn công kênh kề 43 2.4.2 Thám mã lượng sai 44 2.4.3 Thám tuyến tính công phân biệt 51 2.4.4 Phân tích đốn xác định 52 2.5 Đánh giá độ an toàn ChaCha20 – Poly1305 53 2.6 Khả ứng dụng AEAD ChaCha20-Poly1305 56 2.7 Tổng kết chương 57 CHƯƠNG 3: XÂY DỰNG CHƯƠNG TRÌNH Mà HÓA DỮ LIỆU VỚI CHACHA20-POLY1305 58 3.1 Thuyết minh mã nguồn chương trình 58 3.1.1 Sinh tham số 58 3.1.2 Hàm mã hóa 59 3.1.3 Hàm giải mã 61 3.2 Thử nghiệm chương trình 64 3.2.1 Sinh tham số 64 3.2.2 Mã hóa giải mã liệu 65 3.3 Đánh giá hiệu chương trình 68 KẾT LUẬN 69 TÀI LIỆU THAM KHẢO 70 PHỤ LỤC 71 DANH MỤC KÝ HIỆU VIẾT TẮT Ký hiệu Thuật ngữ Ý nghĩa AE Authenticated Encryption Mã hóa xác thực AEAD Authenticated Encryption with Associated Data Mã hóa xác thực với liệu liên quan AES Advanced Encryption Standard Tiêu chuẩn mã hóa tiên tiến BC Block Counter Bộ đếm khối CBC Cipher Block Chaining Chế độ mã khối xâu chuỗi CCD Column Chaining Distinguishers Phân biệt chuỗi cột CCM Cipher/Counter Mode Chế độ đếm mã hóa CMAC Cipher Message Authentication Code Mã xác thực thơng báo mã hóa DES Data Encryption Standard Tiêu chuẩn mã hóa liệu DH Diffie - Hellman Thỏa thuận khóa Diffie Hellman DHE Diffie – Hellman Ephemeral Diffie – Hellman tạm thời ECDH Elliptic Curve Diffie - Hellman Thỏa thuận khóa Diffie-Hellman đường cong Elliptic ECDHE Elliptic Curve Diffie – Hellman Ephemeral Thỏa thuận khóa Diffie-Hellman tạm thời đường cong Elliptic ECDSA Elliptic Curve Digital Signature Algorithm Hệ mật dựa đường cong Elliptic FIPS Federal Information Processing Standards Tiêu chuẩn xử lý thông tin liên bang GCM Galois/Counter Mode Chế độ đếm trường Galois HMAC Keyed-Hash Messasge Authentication Code Mã xác thực thơng báo sử dụng hàm chiều có khóa IV Initialization Vector Vector khởi tạo MAC Message Authenticated Code Mã xác thực thông báo NIST National Institute of Standards and Technology Viện tiêu chuẩn công nghệ quốc gia Mỹ PNV Probabilistic Neutral Vectors Vector xác suất trung tính PRF Pseudo-Random Function Hàm giả ngẫu nhiên PSN Packet Sequence Number Số thứ tự gói PSK Pre-Shared Key Khóa chia sẻ trước RSA Ron Rivest, Adi Shamir, Len Adleman Thuật toán RSA SHA Secure Hash Algorithm Thuật toán băm an toàn SSL Secure Sockets Layer Giao thức tầng socket bảo mật VoIP Voice over IP Mạng điện thoại IP WEP Wired Equivalent Privacy Tiêu chuẩn bảo mật tương đương mạng có dây E&M Encrypt and MAC Mã hóa xác thực MtE MAC then Encrypt Xác thực mã hóa EtM Encrypt then MAC Mã hóa xác thực DANH MỤC HÌNH VẼ Hình 1.1:Sơ đồ mã hóa mật mã dịng Hình 1.2: Mơ hình mật mã khóa đối xứng 10 Hình 1.3: Thơng tin Alice gửi Bob bị Oscar bắt phát lại 11 Hình 1.4: Quá trình sinh dãy A5/1 19 Hình 1.5: Sơ đồ xác thực MAC 20 Hình 1.6: Lược đồ tạo mã xác thực băm HMAC 22 Hình 1.7: Lược đồ tạo mã xác thực CMAC 23 Hình 1.8: Sơ đồ mã hóa xác thực 25 Hình 1.9: Sơ đồ xác thực mã hóa 26 Hình 1.10: Sơ đồ mã hóa xác thực 26 Hình 2.1: Lược đồ hoạt động hàm Quarter Round 32 Hình 2.2: Trạng thái hàm khối 33 Hình 2.3: Sơ đồ hoạt động ChaCha20 34 Hình 2.4: Bản rõ ChaCha20 RFC 7539 35 Hình 2.5: Bản mã ChaCha20 RFC 7539 36 Hình 6: Sơ đồ hoạt động Poly1305 – Khởi tạo _r_ xử lý nhóm 16 byte 38 Hình 2.7: Sơ đồ tạo thẻ tag - Thêm vào 16 byte cuối khóa 38 Hình 2.8: Sơ đồ tổng quát AEAD ChaCha20-Poly1305 41 Hình 2.9: Hàm quarter round Salsa20 45 Hình 3.1: Thực sinh tham số 64 Hình 3.2: Test Vector RFC 7539 65 Hình 3.3: Tạo tệp plain text 65 Hình 3.4: Tạo tệp secret key 65 Hình 3.5: Tạo tệp nonce 66 Hình 3.6: Tạo tệp Authenticated Data 66 Hình 3.7: Tiến hành mã hóa 66 Hình 3.8: Tệp mã sau mã hóa thành cơng 67 Hình 3.9: Bản mã RFC 7539 67 Hình 3.10: Tiến hành giải mã 67 Hình 3.11: Kết giải mã 68 DANH MỤC BẢNG Bảng 1.1: Các tham số cài đặt đề xuất cho Ascon 28 Bảng 2.1: Bảng thống kê dạng công 53 Bảng 2.2: So sánh AES ChaCha20 54 Bảng 2.3: So sánh AES ChaCha20 55 Bảng 2.4: So sánh AES-GCM ChaCha20-Poly1305 56 Bảng 3.1: So sánh hiệu AES-GCM ChaCha-Poly1305 68 LỜI NÓI ĐẦU Trước đây, mật mã đối xứng khó đảm bảo tính bí mật tính xác thực thuật tốn mã hóa, để đảm bảo tính xác thực, thuật tốn chữ ký số MAC dùng với thuật toán mã hóa tính xác thực nguồn gốc thơng điệp hỗ trợ yếu Để tăng cường tính xác thực cần thuật tốn mã hóa có xác thực nhằm cung cấp đồng thời tính bí mật, xác thực tồn vẹn cho thơng báo thuật tốn nhất, loại bỏ bước khơng cần thiết việc sử dụng thuật toán MAC riêng biệt Thuật toán AEAD ChaCha20-Poly1305 giới thiệu vào tháng năm 2015 RFC7539 AEAD ChaCha20-Poly1305 cấu trúc mã hóa liệu liên kết (AEAD); kết hợp thuật tốn mã hóa dịng ChaCha20 thuật toán xác thực lần Poly1305 Cả hai thuật toán ChaCha20 Poly1305 thiết kế D.J Bernstein Sự kết hợp hai thuật toán ChaCha20 Poly1305 cung cấp thuộc tính an tồn cho cấu trúc AEAD ChaCha20-Poly1305 Mặc dù, công kênh kề áp dụng ChaCha Tuy nhiên, dễ dàng khắc phục công cài đặt thực tế, AEAD ChaCha20-Poly 1305 xem an toàn để sử dụng hệ thống thông tin Đồ án nghiên cứu, tìm hiểu thuật tốn mã dịng xác thực ChaCha20Poly1305 bao gồm: sơ đồ hoạt động, thuật toán, cách thức hoạt động đánh giá độ an toàn thuật tốn CHƯƠNG 1: TỔNG QUAN Mà DỊNG VÀ Mà XÁC THỰC THƠNG BÁO 1.1 Tổng quan mã dịng 1.1.1 Khái niệm mã dịng Thuật tốn mã hóa dịng (Stream ciphers): dạng mã hóa đối xứng, liệu đầu vào mã hóa bit Các thuật tốn dịng có tốc độ nhanh thuật toán khối, dùng khối lượng liệu cần mã hóa chưa biết trước, ví dụ kết nối khơng dây Có thể coi thuật tốn dịng thuật tốn khối với kích thước khối bit Một số thuật tốn dịng thơng dụng : RC4, A5/1, A5/2, Chameleon Mã dịng có đặc tính sau: - Kích thước đơn vị mã hóa: gồm k bít Bản rõ chia thành đơn vị mã hóa: P → 𝑝0 𝑝1 𝑝2 … 𝑝𝑛−1 (𝑝𝑖 : k bit) - Một sinh dãy số ngẫu nhiên: dùng khóa K ban đầu để sinh số ngẫu nhiên có kích thước kích thước đơn vị mã hóa: StreamCipher(K) → 𝑠0 𝑠1 𝑠2 … 𝑠𝑛−1 (𝑠𝑖 : k bit) - Mỗi số ngẫu nhiên XOR với đơn vị mã hóa rõ để mã 𝑐0 = 𝑝0 ⊕ 𝑠0 , 𝑐1 = 𝑝1 ⊕ 𝑝1 …; 𝐶 = 𝑐0𝑐1𝑐2… 𝑐𝑛−1 Quá trình giải mã thực ngược lại, mã C XOR với dãy số ngẫu nhiên S lại rõ ban đầu: 𝑝0 = 𝑐0 ⊕ 𝑠0, 𝑝1 = 𝑐1 ⊕ 𝑠1 Đối với mã dòng, số 𝑠𝑖 sinh phải đảm bảo độ ngẫu nhiên (chu kỳ tuần hoàn dài): P p0 s1 s0 C p1 pc0 pn-1 sn-1 c1 cn-1 Hình 1.1:Sơ đồ mã hóa mật mã dịng Như thấy mã hóa dịng tương tự mã hóa Vigenere mã hóa OneTime Pad Điểm quan trọng mã dòng sinh số ngẫu nhiên Nếu chọn khóa có chiều dài ngắn mã hóa Vigenere khơng bảo đảm an tồn, cịn chọn khóa có chiều dài chiều dài tin One-Time Pad lại khơng thực tế Bộ sinh số mã dòng cân hai điểm này, cho phép dùng khóa ngắn dãy số sinh bảo đảm độ ngẫu nhiên cần thiết khóa One-time Pad, khơng hồn tồn thực ngẫu nhiên 1.1.2 Một số đặc điểm mã dòng Trong hệ mã dòng, phép lặp mã dịch mã phép biến đổi đơn giản tuyến tính theo dịng khóa sử dụng Các hệ mã dịng có số đặc điểm sau: - Phép lặp mã phép dịch mã thực dịng khóa - Độ dài rõ độ dài mã độ dài dịng khóa - Biết rõ mã để dễ dàng tính dịng khóa tương ứng - Độ bảo mật hệ mã dòng phụ thuộc vào độ bảo mật khóa - Nếu khóa ngẫu nhiên dùng lần hệ mã dịng có độ bảo mật cao - Một hệ mã dòng gọi tuần hoàn với chu kỳ d 𝑧𝑖+𝑑 = 𝑧𝑖 với số nguyên i ≥ 1.Ví dụ: mã Vigenere với độ dài khó m coi mã dịng tuần hồn với chu kỳ m 1.1.3 Đặc trưng mã dòng ứng dụng bảo mật thơng tin Về bản, mật mã dịng dạng mật mã khóa đối xứng, mã dịng mang đầy đủ đặc trưng mật mã khóa đối xứng Ưu điểm bật mã hóa đối xứng tốc độ lập mã, giải mã nhanh chóng Hiện có nhiều phần mềm thương mại hỗ trợ thuật tốn mã hóa đối xứng hữu hiệu phổ dụng 3.2.2 Mã hóa giải mã liệu Sử dụng Test Vector mã hóa ChaCha20-Poly1305 tài liệu RFC 7539 Dùng phần mềm HxD tạo tệp txt bao gồm: Plain text, Key, Nonce AD (hình 3.3 đến 3.6) với giá trị mẫu (hình 3.2) Hình 3.2: Test Vector RFC 7539 Hình 3.3: Tạo tệp plain text Hình 3.4: Tạo tệp secret key 65 Hình 3.5: Tạo tệp nonce Hình 3.6: Tạo tệp Authenticated Data Ấn Open file để mở file tạo trên, tiếp ấn nút Encrypt để tiến hành mã hóa liệu Chương trình mã hóa rõ tạo file mã file.txt.enc, đồng thời cho thẻ xác thực tag: Hình 3.7: Tiến hành mã hóa Mở file mã hóa so sánh khớp với mã tài liệu RFC 7539, ta thấy chương trình mã hóa xác: 66 Hình 3.8: Tệp mã sau mã hóa thành cơng Hình 3.9: Bản mã RFC 7539 Tiếp theo, ta thực giải mã tệp tin vừa mã hóa Tương tự bước phía trên, sau mở tệp dán thẻ xác thực tag → Ấn nút Decrypt/Verify để tiến hành giải mã liệu: Hình 3.10: Tiến hành giải mã 67 Kết giải mã thành công ô Result chữ Successfully, chương trình tạo tệp txt giải mã, so khớp với thông điệp gốc → Giải mã thành cơng Hình 3.11: Kết giải mã 3.3 Đánh giá hiệu chương trình Theo Adam Langley[10], thành phần cấu trúc AES-GCM hoạt động hiệu suất môi trường với nhiều tài nguyên phần cứng, ChaCha20Poly1305 xử lý tốt phần mềm Điều có nghĩa ChaCha20-Poly1305 thực thi nhanh AES-GCM môi trường tài nguyên phần cứng hạn chế, đặc biệt thiết bị di động, thiết bị IoT, chip ARM… Trong thực tế, hiệu suất hai thuật toán môi trường di động thể theo bảng đây: Bảng 3.1: So sánh hiệu AES-GCM ChaCha-Poly1305 Chip xử lý AES-128-GCM ChaCha20-Poly1305 OMAP 4460 24.1 MB/s 75.3 MB/s Snapdragon S4 Pro 41.5 MB/s 130.9 MB/s Sandy Bridge Core i5 (AES-NI) 300 MB/s 190 MB/s Như tốc độ thực thi ChaCha20-Poly1305 nhanh gấp lần so với AES-GCM môi trường di động Tuy nhiên, AES-GCM lại có tốc độ thực thi nhanh môi trường phần cứng chuyên dụng AES-NI 68 KẾT LUẬN Sau trình bày kiến thức mã hóa ChaCha20 mã xác thực thơng báo Poly1305 cài đặt chương trình thực nghiệm mã hóa giải mã ChaCha20-Poly1305, đồ án đạt kết sau: Trình bày tổng quan mã dịng mã xác thực thơng báo Đồ án tìm hiểu đặc điểm, tính chất ứng dụng mã dịng thơng qua việc phân tích số mật mã dịng mã xác thực thông báo phổ biến Chỉ tầm quan trọng mã dòng xác thực Đưa khuyến nghị sử dụng mã dòng xác thực ChaCha20-Poly1305 Tiếp theo, đồ án diễn giải thuật toán, lược đồ hoạt động mã hóa ChaCha20, mã xác thực thơng báo Poly1305, AEAD ChaCha20-Poly1305 kèm theo ví dụ thực với test vector Đánh giá độ an toàn ChaCha20-Poly1305 thơng qua phân tích số cơng tiêu biểu So sánh toàn diện ChaCha20-Poly1305 với AES-GCM để thấy ưu điểm vượt trội thuật toán triển vọng ứng dụng lĩnh vực di động IoT Tiến hành cài đặt thực nghiệm chương trình mã hóa liệu ChaCha20Poly1305 ngơn ngữ C, thực sinh khóa, mã hóa giải mã, với đánh giá hiệu chương trình 69 TÀI LIỆU THAM KHẢO [2] Nguyễn Thị Hằng, Nghiên cứu tốn an tồn thơng tin cho doanh nghiệp vừa nhỏ, Đại học Công nghệ, năm 2017 [3] Lê Thị Len, Mật mã dòng mật mã nhẹ triển vọng IoT, Đại học Công nghệ, năm 2017 [6] Trần Minh Văn, Bài giảng An toàn bảo mật thông tin, Trường Đại học Nha Trang, năm 2008 [7] Nguyễn Khan Văn, Cơ sở an tồn thơng tin, Đại học Bách khoa Hà Nội, 2014 [8] Daniel J Bernstein, ChaCha, a variant of Salsa20, Department of Mathematics, Statistics, and Computer Science (M/C 249) The University of Illinois at Chicago Chicago, IL 60607–7045, 1/2008 [9] KDDI Research, Inc, Security Analysis of ChaCha20-Poly1305 AEAD, 2/2007 [10]Y Nir, A Langley, RFC7539-ChaCha20 and Poly1305 for IEIF protocols, 5/2015 [11] Gordon Procter, A Security Analysis of the Composition of ChaCha20 and Poly1305, Information Security Group, Royal Holloway, University of London, London, UK, 2014 [12] William Stallings, Cryptography and Network Security, 2017 [13] Paul Crowley, Truncated differential cryptanalysis of five rounds of Salsa20 In SASC 2006, Stream Ciphers Revisited, Workshop Record, ECRYPT Network of Excellence in Cryptology, 2006 [14] Simon Fischer, Willi Meier, Come Berbain, Jean-Fran¥ccois Biasse, and Matthew J B Robshaw, Non-randomness in eSTREAM candidates Salsa20 and TSC-4 In Proc of 7th International Conference on Cryptology in India (INDOCRYPT 2006), Lecture Notes in Computer Science, volume 4329, pages 2– 16, 2006 [15] Yukiyasu Tsunoo, Teruo Saito, Hiroyasu Kubo, Tomoyasu Suzaki, and Hiroki Nakashima, Differential cryptanalysis of Salsa20/8 In SASC 2007, The State of the 70 Art of Stream Ciphers, Workshop Record, ECRYPT Network of Excellence in Cryptology, 2007 [16] Helger Lipmaa and Shiho Moriai, Efficient Algorithms for Computing Differential Properties of Addition In Proc of 8th Fast Software Encryption Workshop (FSE 2001), Lecture Notes in Computer Science, pages 336–350 Springer, 2001 [17] Jean-Philippe Aumasson, Simon Fischer, Shahram Khazaei, Willi Meier, and Christian Rechberger, New Features of Latin Dances: Analysis of Salsa, ChaCha, and Rumba In Prof of 15th Fast Software Encryption Workshop (FSE 2008), Lecture Notes in Computer Science, volume 5086, pages 470–488, 2008 [18] Eli Biham and Rafi Chen, Near-Collisions of SHA-0, In Proc of Advances in Cryptology (CRYPTO 2004), Lecture Notes in Computer Science, volume 3152, pages 290–305, 2004 [19] Zhenqing Shi, Bin Zhang, Dengguo Feng, and Wenling Wu, Improved Key Recovery Attacks on Reduced-Round Salsa20 and ChaCha In Proc of Information Security and Cryptology (ICISC 2012), Lecture Notes in Computer Science, volume 7839, pages 337–351, 2012 [20] Subhamoy Maitra, Chosen IV cryptanalysis on reduced round ChaCha and Salsa Discrete Applied Mathematics, 208:88–97, 2016 [21] Lars R Knudsen, Truncated and higher order differentials In Proc of Workshop on Fast Software Encryption (FSE 1994), Lecture Notes in Computer Science, volume 1008, pages 196–211, 1995 PHỤ LỤC Mã nguồn tệp chachapoly.c #include #include #include #include 71 #include "chachapoly.h" /** * Constant-time memory compare This should help to protect against * side-channel attacks * * \param av input * \param bv input * \param n bytes to compare * \return if inputs are equal */ static int memcmp_eq(const void *av, const void *bv, int n) { const unsigned char *a = (const unsigned char*) av; const unsigned char *b = (const unsigned char*) bv; unsigned char res = 0; int i; for (i = 0; i < n; i++) { res |= *a ^ *b; a++; b++; } return res; } /** * Poly1305 tag generation This concatenates a string according to the rules * outlined in RFC 7539 and calculates the tag * * \param poly_key 32 byte secret one-time key for poly1305 * \param ad associated data * \param ad_len associated data length in bytes * \param ct ciphertext * \param ct_len ciphertext length in bytes * \param tag pointer to 16 bytes for tag storage */ static void poly1305_get_tag(unsigned char *poly_key, const void *ad, int ad_len, const void *ct, int ct_len, unsigned char *tag) { struct poly1305_context poly; unsigned left_over; uint64_t len; unsigned char pad[16]; poly1305_init(&poly, poly_key); memset(&pad, 0, sizeof(pad)); /* associated data and padding */ poly1305_update(&poly, ad, ad_len); left_over = ad_len % 16; if (left_over) poly1305_update(&poly, pad, 16 - left_over); 72 /* payload and padding */ poly1305_update(&poly, ct, ct_len); left_over = ct_len % 16; if (left_over) poly1305_update(&poly, pad, 16 - left_over); /* lengths */ len = ad_len; poly1305_update(&poly, (unsigned char *)&len, 8); len = ct_len; poly1305_update(&poly, (unsigned char *)&len, 8); poly1305_finish(&poly, tag); } int chachapoly_init(struct chachapoly_ctx *ctx, const void *key, int key_len) { assert (key_len == 128 || key_len == 256); memset(ctx, 0, sizeof(*ctx)); chacha_keysetup(&ctx->cha_ctx, key, key_len); return CHACHAPOLY_OK; } int chachapoly_crypt(struct chachapoly_ctx *ctx, const void *nonce, const void *ad, int ad_len, void *input, int input_len, void *output, void *tag, int tag_len, int encrypt) { unsigned char poly_key[CHACHA_BLOCKLEN]; unsigned char calc_tag[POLY1305_TAGLEN]; const unsigned char one[4] = { 1, 0, 0, }; /* initialize keystream and generate poly1305 key */ memset(poly_key, 0, sizeof(poly_key)); chacha_ivsetup(&ctx->cha_ctx, nonce, NULL); chacha_encrypt_bytes(&ctx->cha_ctx, poly_key, poly_key, sizeof(poly_key)); /* check tag if decrypting */ if (encrypt == && tag_len) { poly1305_get_tag(poly_key, ad, ad_len, input, input_len, calc_tag); if (memcmp_eq(calc_tag, tag, tag_len) != 0) { return CHACHAPOLY_INVALID_MAC; } } /* crypt data */ chacha_ivsetup(&ctx->cha_ctx, nonce, one); chacha_encrypt_bytes(&ctx->cha_ctx, (unsigned char *)input, (unsigned char *)output, input_len); /* add tag if encrypting */ if (encrypt && tag_len) { poly1305_get_tag(poly_key, ad, ad_len, output, input_len, calc_tag); 73 memcpy(tag, calc_tag, tag_len); } return CHACHAPOLY_OK; } int chachapoly_crypt_short(struct chachapoly_ctx *ctx, const void *nonce, const void *ad, int ad_len, void *input, int input_len, void *output, void *tag, int tag_len, int encrypt) { unsigned char keystream[CHACHA_BLOCKLEN]; unsigned char calc_tag[POLY1305_TAGLEN]; int i; assert(input_len cha_ctx, nonce, NULL); chacha_encrypt_bytes(&ctx->cha_ctx, keystream, keystream, sizeof(keystream)); /* check tag if decrypting */ if (encrypt == && tag_len) { poly1305_get_tag(keystream, ad, ad_len, input, input_len, calc_tag); if (memcmp_eq(calc_tag, tag, tag_len) != 0) { return CHACHAPOLY_INVALID_MAC; } } /* crypt data */ for (i = 0; i < input_len; i++) { ((unsigned char *)output)[i] = ((unsigned char *)input)[i] ^ keystream[32 + i]; } /* add tag if encrypting */ if (encrypt && tag_len) { poly1305_get_tag(keystream, ad, ad_len, output, input_len, calc_tag); memcpy(tag, calc_tag, tag_len); } return CHACHAPOLY_OK; } Mã nguồn tệp poly1305.c #include "poly1305.h" #if (USE_UNALIGNED == 1) #define U8TO32(p) \ (*((uint32_t *)(p))) #define U32TO8(p, v) \ { \ 74 *((uint32_t *)(p)) = v; \ } while (0) #else /* interpret four bit unsigned integers as a 32 bit unsigned integer in little endian */ static uint32_t U8TO32(const unsigned char *p) { return (((uint32_t)(p[0] & 0xff) ) | ((uint32_t)(p[1] & 0xff) > 16) & 0xff; p[3] = (v >> 24) & 0xff; } #endif void poly1305_init(struct poly1305_context *st, const unsigned char key[32]) { /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ st->r[0] = (U8TO32(&key[ 0]) ) & 0x3ffffff; st->r[1] = (U8TO32(&key[ 3]) >> 2) & 0x3ffff03; st->r[2] = (U8TO32(&key[ 6]) >> 4) & 0x3ffc0ff; st->r[3] = (U8TO32(&key[ 9]) >> 6) & 0x3f03fff; st->r[4] = (U8TO32(&key[12]) >> 8) & 0x00fffff; /* h = st->h[0] st->h[1] st->h[2] st->h[3] st->h[4] */ = 0; = 0; = 0; = 0; = 0; /* save pad for later */ st->pad[0] = U8TO32(&key[16]); st->pad[1] = U8TO32(&key[20]); st->pad[2] = U8TO32(&key[24]); st->pad[3] = U8TO32(&key[28]); st->leftover = 0; st->final = 0; } static void 75 poly1305_blocks(struct poly1305_context *st, const unsigned char *m, size_t bytes) { const uint32_t hibit = (st->final) ? : (1 r[1]; st->r[2]; st->r[3]; st->r[4]; s1 s2 s3 s4 = = = = r1 r2 r3 r4 h0 h1 h2 h3 h4 = = = = = st->h[0]; st->h[1]; st->h[2]; st->h[3]; st->h[4]; * * * * 5; 5; 5; 5; while (bytes >= POLY1305_BLOCK_SIZE) { /* h += m[i] */ h0 += (U8TO32(m+ 0) ) & 0x3ffffff; h1 += (U8TO32(m+ 3) >> 2) & 0x3ffffff; h2 += (U8TO32(m+ 6) >> 4) & 0x3ffffff; h3 += (U8TO32(m+ 9) >> 6) & 0x3ffffff; h4 += (U8TO32(m+12) >> 8) | hibit; * s3) + * s4) + * r0) + * r1) + * r2) + /* h *= r */ d0 = ((uint64_t)h0 * r0) + ((uint64_t)h1 * ((uint64_t)h3 * s2) + ((uint64_t)h4 * s1); d1 = ((uint64_t)h0 * r1) + ((uint64_t)h1 * ((uint64_t)h3 * s3) + ((uint64_t)h4 * s2); d2 = ((uint64_t)h0 * r2) + ((uint64_t)h1 * ((uint64_t)h3 * s4) + ((uint64_t)h4 * s3); d3 = ((uint64_t)h0 * r3) + ((uint64_t)h1 * ((uint64_t)h3 * r0) + ((uint64_t)h4 * s4); d4 = ((uint64_t)h0 * r4) + ((uint64_t)h1 * ((uint64_t)h3 * r1) + ((uint64_t)h4 * r0); /* (partial) h %= c = 0x3ffffff; d1 += c; c = 0x3ffffff; d2 += c; c = 0x3ffffff; d3 += c; c = 0x3ffffff; s4) + ((uint64_t)h2 r0) + ((uint64_t)h2 r1) + ((uint64_t)h2 r2) + ((uint64_t)h2 r3) + ((uint64_t)h2 p */ (uint32_t)(d0 >> 26); h0 = (uint32_t)d0 & (uint32_t)(d1 >> 26); h1 = (uint32_t)d1 & (uint32_t)(d2 >> 26); h2 = (uint32_t)d2 & (uint32_t)(d3 >> 26); h3 = (uint32_t)d3 & 76 d4 += c; 0x3ffffff; h0 += c * 5; 0x3ffffff; h1 += c; c = (uint32_t)(d4 >> 26); h4 = (uint32_t)d4 & c = (h0 >> 26); h0 = h0 & m += POLY1305_BLOCK_SIZE; bytes -= POLY1305_BLOCK_SIZE; } st->h[0] st->h[1] st->h[2] st->h[3] st->h[4] = = = = = h0; h1; h2; h3; h4; } void poly1305_finish(struct poly1305_context *st, unsigned char mac[16]) { uint32_t h0,h1,h2,h3,h4,c; uint32_t g0,g1,g2,g3,g4; uint64_t f; uint32_t mask; /* process the remaining block */ if (st->leftover) { size_t i = st->leftover; st->buffer[i++] = 1; for (; i < POLY1305_BLOCK_SIZE; i++) st->buffer[i] = 0; st->final = 1; poly1305_blocks(st, st->buffer, POLY1305_BLOCK_SIZE); } /* h0 h1 h2 h3 h4 fully carry h */ = st->h[0]; = st->h[1]; = st->h[2]; = st->h[3]; = st->h[4]; h2 h3 h4 h0 h1 += c; += c; += c; += c * 5; += c; 26; 26; 26; 26; 26; h1 h2 h3 h4 h0 = = = = = /* g0 g1 g2 g3 g4 compute h + -p */ = h0 + 5; c = g0 >> 26; = h1 + c; c = g1 >> 26; = h2 + c; c = g2 >> 26; = h3 + c; c = g3 >> 26; = h4 + c - (1 > >> >> >> >> h1 h2 h3 h4 h0 77 & & & & & 0x3ffffff; 0x3ffffff; 0x3ffffff; 0x3ffffff; 0x3ffffff; 0x3ffffff; 0x3ffffff; 0x3ffffff; 0x3ffffff; /* select h if h < p, or h + -p if h >= p */ mask = (g4 >> ((sizeof(uint32_t) * 8) - 1)) - 1; g0 &= mask; g1 &= mask; g2 &= mask; g3 &= mask; g4 &= mask; mask = ~mask; h0 = (h0 & mask) | g0; h1 = (h1 & mask) | g1; h2 = (h2 & mask) | g2; h3 = (h3 & mask) | g3; h4 = (h4 & mask) | g4; /* h0 h1 h2 h3 h = = = = = h % (2^128) ((h0 ) | ((h1 >> 6) | ((h2 >> 12) | ((h3 >> 18) | /* mac = (h + pad) f = (uint64_t)h0 + f = (uint64_t)h1 + f = (uint64_t)h2 + f = (uint64_t)h3 + U32TO8(mac U32TO8(mac U32TO8(mac U32TO8(mac + 0, + 4, + 8, + 12, */ (h1 (h2 (h3 (h4 32); st->pad[2] + (f >> 32); st->pad[3] + (f >> 32); h0 h1 h2 h3 = = = = (uint32_t)f; (uint32_t)f; (uint32_t)f; (uint32_t)f; h0); h1); h2); h3); /* zero out the state */ st->h[0] = 0; st->h[1] = 0; st->h[2] = 0; st->h[3] = 0; st->h[4] = 0; st->r[0] = 0; st->r[1] = 0; st->r[2] = 0; st->r[3] = 0; st->r[4] = 0; st->pad[0] = 0; st->pad[1] = 0; st->pad[2] = 0; st->pad[3] = 0; } void poly1305_update(struct poly1305_context *st, const unsigned char *m, size_t bytes) { size_t i; /* handle leftover */ 78 if (st->leftover) { size_t want = (POLY1305_BLOCK_SIZE - st->leftover); if (want > bytes) want = bytes; for (i = 0; i < want; i++) st->buffer[st->leftover + i] = m[i]; bytes -= want; m += want; st->leftover += want; if (st->leftover < POLY1305_BLOCK_SIZE) return; poly1305_blocks(st, st->buffer, POLY1305_BLOCK_SIZE); st->leftover = 0; } /* process full blocks */ if (bytes >= POLY1305_BLOCK_SIZE) { size_t want = (bytes & ~(POLY1305_BLOCK_SIZE - 1)); poly1305_blocks(st, m, want); m += want; bytes -= want; } /* store leftover */ if (bytes) { #if (USE_MEMCPY == 1) memcpy(st->buffer + st->leftover, m, bytes); #else for (i = 0; i < bytes; i++) st->buffer[st->leftover + i] = m[i]; #endif st->leftover += bytes; } } void poly1305_auth(unsigned char mac[16], const unsigned char *m, size_t bytes, const unsigned char key[32]) { struct poly1305_context ctx; poly1305_init(&ctx, key); poly1305_update(&ctx, m, bytes); poly1305_finish(&ctx, mac); } s 79

Ngày đăng: 22/08/2023, 10:03

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w