Đồ án thực hiện nghiên cứu về thuật toán mã dòng có xác thực là CHACHA20 trên cơ chế xác thực là POLY1305 như về kiến trúc, thành phần, nguyên lý hoạt động. Đánh giá độ an toàn của thuật toán và thực thi cài đặt mô phỏng với ngôn ngữ C với giao diện đồ họa.
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 NGHIÊN CỨU THUẬT TỐN CHACHA20 - POLY1305 Ngành: Cơng nghệ thơng tin Chun ngành: Mã số: Sinh viên thực hiện: TRẦN PHƯƠNG THẢO Hà Nội, 2022 MỤC LỤC MỤC LỤC .i DANH MỤC KÝ HIỆU VIẾT TẮT .iii DANH MỤC HÌNH VẼ v LỜI CẢM ƠN .vii LỜI NÓI ĐẦU .viii CHƯƠNG TỔNG QUAN Mà DỊNG VÀ Mà XÁC THỰC THƠNG BÁO .1 1.1 Tổng quan mã dòng .1 1.1.1 Khái niệm mã dòng .1 1.1.2 Đặc trưng mã dòng ứng dụng bảo mật thông tin 1.1.3 Một số mã xác thực thông báo phổ biến .5 1.2 Tổng quan mã xác thực thông báo .13 1.2.1 Khái niệm mã xác thực thông báo .13 1.2.2 Một số mã xác thực thông báo phổ biến 14 1.3 Mã dòng xác thực ứng dụng 16 1.4 Tổng kết chương .18 CHƯƠNG Mà DÒNG XÁC THỰC CHACHA20-POLY1305 .20 2.1 Mã dòng ChaCha20 .20 2.2 Mã xác thực thông báo Poly1305 25 2.3 Mã dòng xác thực ChaCha20 - Poly1305 29 2.4 Phân tích số cơng phổ biến lên ChaCha20-Poly1305 .32 2.4.1 Tấn công kênh kề 32 2.4.2 Thám mã lượng sai 33 2.4.3 Thám tuyến tính cơng phân biệt .41 2.4.4 Phân tích đoán xác định .42 2.5 Đánh giá độ an toàn ChaCha20 – Poly1305 42 2.6 Khả ứng dụng AEAD ChaCha20-Poly1305 .46 2.7 Tổng kết chương .46 CHƯƠNG XÂY DỰNG ỨNG DỤNG PHẦN MỀM Mà HÓA DỮ LIỆU VỚI CHACHA20-POLY1305 48 3.1 Thuyết minh mã nguồn cài đặt ứng dụng 48 3.1.1 Sinh tham số 48 3.1.2 Hàm mã hóa 49 3.1.3 Hàm giải mã 51 3.2 Thử nghiệm chương trình 55 3.2.1 Sinh tham số 55 3.2.2 Mã hóa giải mã liệu 55 3.3 Đánh giá hiệu chương trình 59 KẾT LUẬN 60 TÀI LIỆU THAM KHẢO 61 PHỤ LỤC 63 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 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 DCDHE 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 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 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 WEP Wired Equivalent Privacy Tiêu chuẩn bảo mật tương đương mạng có dây DANH MỤC HÌNH Hình 1.1: Sơ đồ mã hóa mật mã dòng .2 Hình 1.2: Mơ hình mật mã khóa đối xứng Hình 3: Thông tin Alice gửi Bob bị Oscar bắt phát lại Hình 4: Quá trình sinh dãy A5/1 Hình 5: Sơ đồ xác thực MAC 14 Hình 6: Lược đồ tạo mã xác thự băm HMAC 15 Hình 7: Lược đồ tạo mã xác thực CMAC 16 Y Hình 2.1: Lược đồ hoạt động hàm Quarter Round 21 Hình 2.2: Sơ đồ hoạt động ChaCha20 22 Hình 2.3: Sơ đồ hoạt động Poly1305 – Khởi tạo _r_ xử lý nhóm 16 byte .26 Hình 2.4: Sơ đồ tạo thẻ tag - Thêm vào 16 byte cuối khóa 27 Hình 2.5 Sơ đồ tổng quát AEAD ChaCha20-Poly1305 .30 Hình 2.6: Sơ đồ hoạt động thời gian thực ChaCha20-Poly1305 31 Hình 2.7: Sơ đồ mã hóa Payload 31 Hình 2.8: Sơ đồ tính toán MAC 32 Hình 9: Hàm quarter round Salsa20 35 Hình 1: Thực sinh tham số 55 Hình 2: Test Vector RFC 7539 56 Hình 3: Tạo file plain text 56 Hình 4: Tạo file secret key 56 Hình 5: Tạo file nonce .56 Hình 6: Tạo file Authenticated Data 57 Hình 7: Tiến hành mã hóa 57 Hình 8: File cipher text sau mã hóa thành cơng 58 Hình 9: Bản mã RFC 7539 .58 Hình 10: Tiến hành giải mã .58 Hình 11: Kết giải mã 59 DANH MỤC BẢ Bảng 2.1: Bảng thống kê dạng công 43 Bảng 2: So sánh AES ChaCha20 44 Bảng 2.3: So sánh GHASH Poly1305 45 Bảng 2.4: So sánh AES-GCM ChaCha20-Poly1305 45 YBảng 1: So sánh hiệu AES-GCM ChaCha-Poly1305 .59 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 tố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 tố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 tồ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 ChaCha20-Poly1305 bao gồm: sơ đồ hoạt động, thuật toán, cách thức hoạt động đánh giá độ an tồn thuật tốn SINH VIÊN THỰC HIỆN ĐỒ ÁN TRẦN PHƯƠNG THẢO CHƯƠNG 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 tố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 … (: 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) (: k bit) Mỗi số ngẫu nhiên XOR với đơn vị mã hóa rõ để mã = ⊕ , = ⊕ …; … 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: = ⊕ , = ⊕ Đối với mã dòng, số sinh phải đảm bảo độ ngẫu nhiên (chu kỳ tuần hồn dài): Hình 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 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: 56 Hình 8: Tệp mã sau mã hóa thành cơng Hình 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 10: Tiến hành giải mã 57 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 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, ChaCha20-Poly1305 xử lý tốt phần mềm Điều có nghĩa ChaCha20Poly1305 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 tốn mơi trường di động thể theo bảng đây: Bảng 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 58 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 tồn ChaCha20-Poly1305 thơng qua phân tích số cơng tiêu biểu So sánh tồ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 59 TÀI LIỆU THAM KHẢO Nguyễn Bình, Giáo trình mật mã học, Nhà xuất Bưu Điện, năm 2002 Nguyễn Thị Hằng, Nghiên cứu toán an tồn thơng tin cho doanh nghiệp vừa nhỏ, Đại học Công nghệ, năm 2017 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 TS Thái Thanh Tùng, Giáo trình mật mã học an tồn thông tin, Nhà xuất Thông tin Truyền thông, năm 2011 Tạp chí An tồn thơng tin, “Một số ý triển khai mã xác thực thông báo”, năm 2018 Trần Minh Văn, Bài giảng An tồn bảo mật thơng tin, Trường Đại học Nha Trang, năm 2008 Nguyễn Khan Văn, Cơ sở an tồn thơng tin, Đại học Bách khoa Hà Nội, 2014 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 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 60 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 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 61 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 #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 62 * \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); /* 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)); 63 /* 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); 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]; } 64 /* 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) \ { \ *((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 = */ 65 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 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; /* h *= r */ d0 = ((uint64_t)h0 * r0) + ((uint64_t)h1 * s4) + ((uint64_t)h2 * s3) + ((uint64_t)h3 * s2) + ((uint64_t)h4 * s1); d1 = ((uint64_t)h0 * r1) + ((uint64_t)h1 * r0) + ((uint64_t)h2 * s4) + ((uint64_t)h3 * s3) + ((uint64_t)h4 * s2); 66 d2 = ((uint64_t)h0 * r2) + ((uint64_t)h1 * r1) + ((uint64_t)h2 * r0) + ((uint64_t)h3 * s4) + ((uint64_t)h4 * s3); d3 = ((uint64_t)h0 * r3) + ((uint64_t)h1 * r2) + ((uint64_t)h2 * r1) + ((uint64_t)h3 * r0) + ((uint64_t)h4 * s4); d4 = ((uint64_t)h0 * r4) + ((uint64_t)h1 * r3) + ((uint64_t)h2 * r2) + ((uint64_t)h3 * r1) + ((uint64_t)h4 * r0); /* (partial) h %= c = 0x3ffffff; d1 += c; c = 0x3ffffff; d2 += c; c = 0x3ffffff; d3 += c; c = 0x3ffffff; d4 += c; c = 0x3ffffff; h0 += c * 5; c = 0x3ffffff; h1 += c; 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 & (uint32_t)(d4 >> 26); h4 = (uint32_t)d4 & (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]; 67 h2 h3 h4 h0 h1 += c; += c; += c; += c * 5; += c; c c c c c = = = = = h1 h2 h3 h4 h0 >> >> >> >> >> 26; 26; 26; 26; 26; h1 h2 h3 h4 h0 = = = = = 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 = 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); /* 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; 68 h0 h1 h2 h3 = = = = (uint32_t)f; (uint32_t)f; (uint32_t)f; (uint32_t)f; st->pad[0] st->pad[1] st->pad[2] st->pad[3] = = = = 0; 0; 0; 0; } void poly1305_update(struct poly1305_context *st, const unsigned char *m, size_t bytes) { size_t i; /* handle leftover */ 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); 69 } 70 ... 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 CMAC Cipher Message Authentication... 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... 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) (: k bit) Mỗi số ngẫu nhiên XOR với đơn vị mã hóa rõ để mã = ⊕ , = ⊕ …; … Quá trình