Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 91 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
91
Dung lượng
1,11 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TRỊNH VIẾT CƯỜNG PHÂN TÍCH ĐÁNH GIÁ MỘT SỐ HỆ MÃ HÓA LUẬN VĂN THẠC SĨ NGƯỜI HƯỚNG DẪN PGS.TS.TRỊNH NHẬT TIẾN Hà Nội - 2007 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Để hoàn thành đƣợc luận văn này, xin đƣợc gửi lời cảm ơn chân thành đến PGS, TS Trịnh Nhật Tiến, ngƣời nhiệt tình hƣớng dẫn tơi hồn thành luận văn cao học Tôi xin gửi lời cảm ơn chân thành đến thầy cô, ngƣời giảng dạy tơi khóa học cao học 2004 – 2006, đồng nghiệp bạn bè ngƣời thân nhiệt tình ủng hộ tạo điều kiện cho tơi hồn thành luận văn Trang phụ bìa …………………………………………………………… Lời cam đoan …………………………………………………………… LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Lời cảm ơn ……………………………………………………………… Mục lục …………………………………………………………………… Danh sách ký hiệu, chữ viết tắt …………………………………… Lời mở đầu ……………………………………………………………… Chƣơng 1: CƠ SỞ LÝ THUYẾT ………………………………………… 1.1 SỐ HỌC CÁC SỐ NGUYÊN ……………………………… 1.1.1 Tính chia hết số nguyên……………………………… 1.1.2 Đồng dƣ phƣơng trình đồng dƣ tuyến tính……………… 12 1.1.3 Thặng dƣ thu gọn phần tử nguyên thuỷ………………… 13 1.2 XÁC SUẤT VÀ THUẬT TOÁN XÁC SUẤT……………… 15 1.2.1 Khái niệm xác suất ……………………………………… 15 1.2.2 Tính bí mật hồn tồn hệ mật mã………………… 15 1.2.3 Thuật toán xác xuất ………………………………………… 16 1.3 ĐỘ PHỨC TẠP TÍNH TỐN……………………………… 17 1.3.1 Khái niệm độ phức tạp tính tốn ………………………… 17 1.3.2 Hàm phía Hàm phía có cửa sập………………… 18 Chƣơng 2: MỘT SỐ PHƢƠNG PHÁP THÁM MÃ…………………… 19 2.1 PHƢƠNG PHÁP THÁM MÃ………………………………………… 19 2.1.1 Thám mã biết mã …………………………………………… 19 2.1.2 Thám mã biết rõ ……………………………………………… 20 2.1.3 Thám mã với rõ đƣợc chọn …………………………………… 21 2.1.4 Thám mã với mã đƣợc chọn …………………………………… 23 2.2 TÍNH AN TỒN CỦA HỆ MÃ …………………………………… 28 2.2.1 An toàn chiều (One – Wayness) ………………………… 28 2.2.2 An toàn ngữ nghĩa (Semantic Security) …………………………… 29 2.2.3 Tính khơng phân biệt đƣợc (Indistinguishability)(IND) ………… 31 2.2.4 An toàn ngữ nghĩa tƣơng đƣơng với IND ………………………… 34 2.2.5 Khái niệm an toàn mạnh IND-CCA ………………………… 36 Chƣơng 3: PHÂN TÍCH ĐÁNH GIÁ MỘT SỐ HỆ MÃ HỐ ………… 38 3.1 HỆ MÃ HOÁ RSA …………………………………………………… 38 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 3.1.1 Hệ mã RSA an tồn trƣớc cơng KPA, COA, CPA ………… 38 3.1.2 Hệ mã RSA khơng an tồn ngữ nghĩa …………………………… 38 3.1.3 Hệ mã RSA không đạt an tồn trƣớc cơng CCA ……………… 39 3.1.4 Ứng dụng thực tế …………………………………………………… 39 3.2 HỆ MÃ HOÁ ELGAMAL ………………………………………… 40 3.2.1 ELGAMAL đảm bảo an toàn ngữ nghĩa ………………………… 40 3.2.2 Hệ mã ELGAMAL an toàn trƣớc công KPA, COA, CPA 41 3.2.3 Hệ mã ELGAMAL khơng đạt an tồn trƣớc cơng CCA ……… 41 3.3 HỆ MÃ HOÁ CRAMER-SHOUP (1998) …………………………… 42 3.3.1 Giả thuyết Decisionnal Diffie-Hellman …………………………… 42 3.3.2 Sơ đồ Hệ mã ……………………………………………………… 43 3.3.3 Độ an tồn hệ mã hố ………………………………………… 45 3.3.4 Cài đặt hệ mã hoá ………………………………………………… 45 3.3.5 Hệ mã hố khơng dùng hàm băm 46 3.4 HỆ MÃ HOÁ LAI (Hybrid Encryption) 47 3.4.1 Hệ mã hoá KEM 47 3.4.2 Hệ mã hoá SKE 49 3.4.3 Hệ mã hố cơng khai lai (Hybrid public-key encryption) (HPKE) … 54 3.5 HỆ MÃ HOÁ OAEP (Optimal Aysmmetric Encryption Padding) 58 3.5.1 Mơ hình máy tƣ vấn ngẫu nhiên (Random Oracle Model) 58 3.5.2 An toàn Planitext – Awareness …………………………………… 60 3.5.3 Lƣợc đồ OAEP …………………………………………………… 62 3.5.4 Đánh giá lƣợc đồ ………………………………………………… 64 Chƣơng 4: THỬ NGHIỆM CHƢƠNG TRÌNH MÃ HĨA…………… 70 CÔNG CỤ …………………………………………… 70 4.2 CÁC THÀNH PHẦN CỦA CHƢƠNG TRÌNH …………… 70 KẾT LUẬN ……………………………………………………………… 76 TÀI LIỆU THAM KHẢO …………………………………………… 78 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com DANH SÁCH CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT STT Chữ viết tắt Ý nghĩa LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Phép Xor || Phép ghép hai chuỗi CCA Thám mã với mã chọn (Chosen ciphert attack) CCA1 Thám mã với mã chọn trước (Non-adaptive chosen ciphertext attack) CCA2 Thám mã với mã chọn trước thích hợp (Adaptive chosen ciphertext attack) COA Thám mã biết mã (Ciphertext only attack) CPA Thám mã với rõ chọn (Chosen plaintext attack) DDH Giả thuyết Decisionnal Diffie-Hellman HPKE Hệ mã hố cơng khai lai (Hybrid public-key encryption) 10 IND Tính khơng phân biệt (Indistinguishability) 11 KEM Máy đóng gói khố (key encapsulation mechanism) 12 KPA Thám mã biết rõ (Known plaintext attack) 13 MAC Mã xác thực thông tin lần (one-time message authentication code) 14 OAEP Optimal Aysmmetric Encryption Padding 15 PA An toàn Planitext – Awareness 16 Pr Xác suất 17 RO Máy tư vấn ngẫu nhiên (Random Oracle) 18 SKE Hệ mã hoá khoá đối xứng lần (one-time symmetric-key encryption scheme) 19 TCR Họ hàm băm Target collision resistant 20 WPA An toàn Weak plaintext – awareness LỜI MỞ ĐẦU LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Luận văn tổng hợp lại phương pháp công chủ yếu hệ mã Luận văn trình bày dạng cơng mạnh biết đến CCA2, dạng cơng có thật thực tế Về chất dạng cơng “năng lực” mà thám mã có được, dạng cơng mạnh có nghĩa “năng lực” thám mã lớn Từ xảy thực tế, nhà lập mã giả thiết tình xấu xảy thực tế (tình xấu có nghĩa thám mã có “năng lực” gì) Đến tình xấu xảy mà nhà lập mã giới nghĩ đến, tình mà thám mã có máy tư vấn giải mã (Oracle Decryption), tức tương đương với phương pháp công CCA2, thật tình xảy thực tế, tất nhiên với mức độ Cũng khn khổ luận văn, trình bày đánh giá số hệ mã phương pháp công Và phương pháp công mạnh (như CCA2), hệ mã thông dụng RSA Elgamal dễ dàng bị phá Trên sở đó, luận văn trình bày hai hệ mã thơng dụng có hiệu OAEP Cramer Shoup, chứng minh an tồn phương pháp công mạnh CCA2 Tất nhiên đôi với điều phức tạp chi phí cho việc cài đặt hệ mã cao, đồng thời nhược điểm chứng minh tính bảo mật Với OAEP, phải xem hàm băm máy tư vấn ngẫu nhiên (Random Oracle) chứng minh tính bảo mật Việc có hàm băm với tính chất thực tế, nghiên cứu Cịn Cramer Shoup tính an toàn, phải dựa giả thuyết Decisionnal Diffie Hellman Để so sánh hai hệ mã, OAEP có ưu điểm dựa giả thuyết toán học mạnh hàm phía (RSA), cịn Cramer Shoup dựa giả thuyết toán học yếu Decisionnal Diffie Hellman (mặc dù chưa LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com có chứng minh cụ thể mạnh nào), ngược lại OAEP lại phải dựa vào mơ hình RO cịn gây nhiều tranh cải Tất nhiên tuỳ theo yêu cầu thực tế người dùng tính chất thực tế mà hệ mã phải đáp ứng, người sử dụng chọn hệ mã cho phù hợp với u cầu Ví dụ để mã hố thơng tin khơng mang tính quan trọng, khơng thiết phải dùng hệ mã cài đặt với chi phí tốn hai hệ mã Có thể cài đặt phiên đơn giản hai hệ mã Cramer Shoup giới thiệu cách cài đặt đơn giản hơn, đạt an tồn IND-CCA1 dùng hệ mã đơn giản tốn Và tất nhiên tính khơng ngừng phát triển mật mã, nên phương pháp cơng độ an tồn hệ mã đánh giá, tương đối Tương lai phải xem xét đến mơ hình kẻ cơng dùng đến máy tính lượng tử Trên sở đánh giá phân tích hệ mã, luận văn biện pháp bảo vệ an tồn thơng tin Chƣơng 1: CƠ SỞ LÝ THUYẾT LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 1.1 SỐ HỌC CÁC SỐ NGUYÊN Ta ký hiệu Z tập số nguyên Z+ tập số nguyên không âm Trong mục ta nhắc lại số kiến thức số học số nguyên cần cho việc trình bày lý thuyết mật mã 1.1.1 Tính chia hết số ngun Tập Z đóng kín phép cộng, trừ nhân, khơng đóng kín phép chia Vì số nguyên a chia cho số nguyên b thương số nguyên q có ý nghĩa đặc biệt, ta nói a chia hết cho b, a bội số b, b ước số a, ký hiệu b|a Dễ thấy ước số số nguyên, bội số số nguyên, moi số nguyên a ước số, đồng thời bội số Số ngun d gọi ước số chung hai số nguyên a b d|a d|b Số nguyên d gọi ước số chung lớn a b d > 0, d ước số chung a b, ước số chung a b ước số d Ta ký hiệu ước số chung lớn a b gcd(a, b) Dễ thấy với số nguyên dương a ta có gcd(a, 0) = a, ta quy ước gcd(0, 0) = Số nguyên a > gọi số ngun tố a khơng có ước số ngồi a Số a hợp số nguyên tố Số nguyên n > viết dạng: n = p1α1 p2α2… pkαk Trong p1, p2, …, pk số nguyên tố khác nhau, α1, α2, …, αk số mũ nguyên dương Nếu không kể thứ tự thừa số nguyên tố dạng biểu diễn nhất, ta gọi dạng khai triển tắc n Định lý 1.1 10 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Nếu b > b|a gcd(a, b) = b Nếu a = bq + r gcd(a, b) = gcd(b, r) Số nguyên m gọi bội số chung a b m chia hết cho a b Số m gọi bội số chung nhỏ a b ký hiệu lcm(a, b), m bội số chung a b, bội số chung a b bội m Với số nguyên dương a b ta có quan hệ Lcm(a, b).gcd(a, b) = a.b Thuật toán Euclide tìm ước số chung lớn nhất: INPUT: hai số nguyên không âm a b, với a ≥ b OUTPUT: ước số chung lớn a b While b > Begin r := a mod b; a := b; b := r; End; Cho kết (a) Ta biết gcd(a, b) = d, phương trình bất định a.x + b.y = d Có nghiệm nguyên (x, y), nghiệm ngun tìm thuật tốn Euclide mở rộng sau: Thuật toán Euclide mở rộng: 11 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Nhận xét: Như nhận xét trên, t t‟ có khả tính tốn thiết bị phần cứng tương đương nhau, 2-k0 2-k1 lượng không đáng kể, nên ‟ lượng không đáng kể Kết luận: Ý nghĩa định lý : B thám mã CCA1 tạo mã nào, tồn máy Plaintext – Extractor P với xác xuất lớn chạy thời gian đa thức, để tìm rõ tương ứng Tức thám mã B khơng có khả tạo mã hợp lệ, mà khơng biết rõ tương ứng Vì theo định nghĩa WPA (3.5.2.1), hệ mã OAEP đạt an toàn WPA, hay đạt an toàn IND-CCA1 78 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 3.5.4.3 Điều kiện OAEP đạt an tồn IND-CCA2 * Khái niệm hàm phía phận có cửa sập Hàm f: {0, 1}k → {0, 1}k, hay tương đương với f : {0, 1}n+k1 × {0, 1}k0 → {0, 1}n+k1 × {0, 1}k0 , với k = n + k1 + k0 Hàm f (, ) - phía, thám mã A chạy thời gian giới hạn , có xác xuất thành cơng Succow(A), giới hạn , đó: Succow(A) = Prx,y [ A(f(x, y)) = (x, y)] ≤ Ký hiệu Succow(A) xác xuất thành công thám mã A, từ đầu vào f(x, y) cho đầu (x, y) Hàm f (, ) - phía phận (partial – domain one – way) thám mã A chạy thời gian giới hạn , có xác xuất thành cơng Succpd-ow(A), giới hạn , đó: Succpd-ow(A) = Prx,y [ A(f(x, y)) = x ] ≤ Ký hiệu Succpd-ow(A) xác xuất thành công thám mã A, từ đầu vào f(x, y) cho đầu x Hàm f (l, , ) - phía phận tập (set partial – domain one – way) thám mã A cho đầu tập l phần tử, chạy thời gian giới hạn , có xác xuất thành cơng Succs-pd-ow(A), giới hạn , đó: Succs-pd-ow(A) = Prx,y [ x A(f(x, y)) ] ≤ Ký hiệu Succs-pd-ow(A) xác xuất thành công thám mã A, từ đầu vào f(x, y) cho đầu x Khác so với Succpd-ow(A) thám mã A cho đầu tập giá trị x, cần x thuộc giá trị tập thám mã A thành cơng 79 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Ta ký hiệu Succow() xác xuất thành công lớn Succow(A), (của tất thám mã A) Hay Succow() = max (Succow(A)) với A Tương tự: Succpd-ow() xác xuất thành công lớn Succpd-ow(A) Succs-pd-ow(l, ) xác xuất thành công lớn Succs-pd-ow(A) Rõ ràng với l ≥ ta ln có: Succs-pd-ow(l, ) ≥ Succpd-ow() ≥ Succow() Trong trường hợp hàm RSA ([7]) ba khái niệm tương đương 80 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Định lý 3.6: Gọi A thám mã CCA2 chống lại an toàn ngữ nghĩa lược đồ OAEP (Gk, E, D), f hàm phía phận có cửa sập Giả sử A có xác xuất thành cơng việc phá vỡ tính an tồn ngữ nghĩa hệ mã OAEP , thời gian chạy lớn , tạo qD , qG qH truy vấn tới máy tư vấn giải mã, hàm băm G H Thì: Succs-pd-ow(qH , ‟) + (qD qG + qD + qG )/2k0 + qD/2k1 ≥ / Với ‟ ≤ + qH qG (Tf + O(1)), Tf thời gian để tính tốn f Nhận xét: Do chọn ban đầu nên 2k0 2k1 số lớn, giá trị (qD qG + qD + qG )/2k0 + qD/2k1 “không đáng kể” Mặt khác tính chất hàm phía phận có cửa sập nên Succs-pd-ow(qH , ‟) giá trị “không đáng kể”, dẫn đến tổng Succs-pd-ow(qH , ‟) + (qD qG + qD + qG )/2k0 + qD/2k1 lượng “không đáng kể”, nên / lượng không đáng kể, cuối suy giá trị “khơng đáng kể” Điều chứng tỏ lược đồ OAEP an toàn IND-CCA2 f hàm phía phận có cửa sập Kết luận Với đánh giá trên, hệ OAEP an tồn phương pháp cơng CCA2, có nhược điểm phải giả thuyết mơ hình Random Oracle tồn tại, tức hàm G H phải có tính chất đặc biệt kết luận 3.5.1.1 Gần số nghiên cứu rằng, để xây dựng hàm khó thực tế ([20]) Những hệ OAEP cài đặt thực tế nay, xây dựng hàm băm, mà tác giả (người xây dựng hàm băm đó) chứng minh có tính chất phương pháp Heuristic, chưa có luận tốn học cụ thể 81 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Chƣơng 4: THỬ NGHIỆM CHƢƠNG TRÌNH MÃ HĨA Cơng cụ Ngơn ngữ lập trình Java, dùng soạn thảo Jcreator Pro, trình biên dịch JDK Sun Chương trình viết dạng Applet, chạy máy tính cài hệ điều hành (Window, Linux, ) có cài trình duyệt Các thành phần chƣơng trình mã hóa Cramer-Shoup Modul 1: Xây dựng hàm băm private BigInteger hashOnOneNumber(BigInteger p, BigInteger g3, BigInteger g4, BigInteger nn){ BigInteger q = p.shiftRight(1); return hashOnTwoNumbers(p,g3,g4,nn.divide(q),nn.mod(q)); } private BigInteger hashOnTwoNumbers(BigInteger p, BigInteger g3, BigInteger g4, BigInteger a1, BigInteger a2){ return ((g3.modPow(a1,p)).multiply(g4.modPow(a2,p))).mod(p); } private BigInteger hashBitList(int k, BigInteger p, HashFunction hash, boolean[] bits){ BigInteger g3 = hash.hash_g1; BigInteger g4 = hash.hash_g2; int m = k+k-2; int len = m - k - 1; int lengthDeficit = len - (bits.length % len); int index = - lengthDeficit; int i; BigInteger arg; byte[] zero = {0}; BigInteger res = new BigInteger(zero); BigInteger e; boolean[] transferList = new boolean[len]; while(index < bits.length){ for(i = 0; i < len; i++){ if(index < 0) transferList[i] = false; 82 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com else transferList[i] = bits[index]; index++;} arg = bits2BigInteger(transferList).add((res.shiftLeft(1)).setBit(0).shiftLeft(len)); res = hashOnOneNumber(p, g3, g4, arg); } return res; } class HashFunction { BigInteger hash_g1; BigInteger hash_g2; HashFunction(byte[] hash_g1_rep, byte[] hash_g2_rep){ hash_g1 = new BigInteger(hash_g1_rep); hash_g2 = new BigInteger(hash_g2_rep); } } Modul 2: Xây dựng lớp khóa cơng khai khóa bí mật class SecretKey { int k; BigInteger p; BigInteger x1; BigInteger x2; BigInteger y1; BigInteger y2; BigInteger z; HashFunction hash; SecretKey(int k_id, byte[] p_rep, byte[] x1_rep, byte[] x2_rep, byte[] y1_rep, byte[] y2_rep, byte[] z_rep, byte[] hash_g1_rep, byte[] hash_g2_rep){ k = k_id; p = new BigInteger(p_rep); x1 = new BigInteger(x1_rep); x2 = new BigInteger(x2_rep); y1 = new BigInteger(y1_rep); y2 = new BigInteger(y2_rep); z = new BigInteger(z_rep); hash = new HashFunction(hash_g1_rep,hash_g2_rep); } } 83 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com class PublicKey { int k; BigInteger p; BigInteger g1; BigInteger g2; BigInteger c; BigInteger d; BigInteger h; HashFunction hash; PublicKey(int k_id, byte[] p_rep, byte[] g1_rep, byte[] g2_rep, byte[] c_rep, byte[] d_rep, byte[] h_rep, byte[] hash_g1_rep, byte[] hash_g2_rep){ k = k_id; p = new BigInteger(p_rep); g1 = new BigInteger(g1_rep); g2 = new BigInteger(g2_rep); c = new BigInteger(c_rep); d = new BigInteger(d_rep); h = new BigInteger(h_rep); hash = new HashFunction(hash_g1_rep,hash_g2_rep); } } Modul 3: Xây dựng hàm mã hóa hàm giải mã Hàm mã hoá: public boolean[] encrypt(boolean[] message){ int messageLength = message.length; int el = pk.k - 1; int i; int toEncrypt = (1+ (message.length / el))*pk.k*4; boolean[] mChunk = new boolean[pk.k]; mChunk[pk.k-1] = false; boolean[] cChunk = new boolean[pk.k*4]; boolean[] res = new boolean[toEncrypt]; int resIndex = 0; BigInteger r,u1,u2,e,m,alpha,v; int pointer = 0; int index = 0; while(pointer < messageLength){ index = 0; while((index < el)&&(pointer < messageLength)) mChunk[index++] = message[pointer++]; 84 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com while(index < el) mChunk[index++] = ( (rnd.nextInt() & 1) == 1); m = bits2BigInteger(mChunk); r = bigRandom(pk.k+1).mod(pk.p); u1 = pk.g1.modPow(r,pk.p); u2 = pk.g2.modPow(r,pk.p); e = ((pk.h.modPow(r,pk.p)).multiply(m)).mod(pk.p); alpha = hashBitList(pk.k,pk.p,pk.hash,bitListThree(pk.k,u1,u2,e)); v= ((pk.c.modPow(r,pk.p)).multiply(pk.d.modPow(r.multiply(alpha),pk.p))).mod(pk.p); cChunk = bitListFour(pk.k,u1,u2,e,v); for(i=0; i < 4*pk.k; i++) res[resIndex++] = cChunk[i]; } return res; } Hàm giải mã: public boolean[] decrypt(boolean[] cryptoText){ boolean[] res = new boolean[((cryptoText.length / (4 * sk.k))+1)*(sk.k-1)]; boolean[] cChunk = new boolean[sk.k]; boolean[] mChunk = new boolean[sk.k]; BigInteger c; int index = 0; int resIndex = 0; int len = cryptoText.length; int i; byte[] zero = {0}; BigInteger zeroBig = new BigInteger(zero); BigInteger u1,u2,e,v,alpha,m; while(index+(4*sk.k) < len){ for(i = 0; i< sk.k; i++) cChunk[i] = cryptoText[index++]; u1 = bits2BigInteger(cChunk); for(i = 0; i< sk.k; i++) cChunk[i] = cryptoText[index++]; u2 = bits2BigInteger(cChunk); for(i = 0; i< sk.k; i++) cChunk[i] = cryptoText[index++]; e = bits2BigInteger(cChunk); for(i = 0; i< sk.k; i++) cChunk[i] = cryptoText[index++]; v = bits2BigInteger(cChunk); alpha = hashBitList(sk.k,sk.p,sk.hash,bitListThree(sk.k,u1,u2,e)); if((v.equals(((u1.modPow(sk.x1.add(alpha.multiply(sk.y1)),sk.p)).multiply(u2.modPow(sk.x2.a dd(alpha.multiply(sk.y2)),sk.p))).mod(sk.p)))) 85 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com { m = (e.multiply((u1.modPow(sk.z,sk.p)).modInverse(sk.p))).mod(sk.p); cChunk = bigInteger2bits(sk.k, m); for(i = 0; i < sk.k - 1; i++) res[resIndex++] = cChunk[i]; } else for(i = 0; i < sk.k-1; i++) res[resIndex++] = true; } return res; } } Modul 4: Xây dựng số hàm hỗ trợ khác private BigInteger bits2BigInteger(boolean[] bits){ int len = bits.length; byte[] bytes = new byte[2 + (len/8)]; int b; int index = 1+ len/8; int bitIndex = 0; bytes[0] = 0; bytes[1] = 0; while(bitIndex