Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 245 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
245
Dung lượng
0,94 MB
Nội dung
i LỜI CAM ĐOAN Tôi xin cam đoan cơng trình nghiên cứu riêng tơi hướng dẫn tập thể cán hướng dẫn khoa học Các nội dung, số liệu kết trình bày Luận án hoàn toàn trung thực chưa có tác giả cơng bố cơng trình khác, liệu tham khảo trích dẫn đầy đủ Tác giả Luận án Nguyễn Đức Tâm ii LỜI CẢM ƠN Luận án nghiên cứu sinh thực Học viện Kỹ thuật mật mã Ban Cơ yếu Chính phủ Nghiên cứu sinh xin bày tỏ lòng biết ơn sâu sắc tới nhà khoa học: Phó Giáo sư Tiến sĩ Lê Mỹ Tú Tiến sĩ Nguyễn Nam Hải, Thầy tận tình giúp đỡ, trang bị phương pháp nghiên cứu, kinh nghiệm, kiến thức khoa học kiểm tra, đánh giá kết suốt trình thực Luận án Nghiên cứu sinh xin trân trọng cảm ơn Học viện Kỹ thuật mật mã sở đào tạo đơn vị quản lý chun mơn, Đồng chí lãnh đạo Học viện Kỹ thuật mật mã - Ban Cơ yếu Chính phủ, nơi nghiên cứu sinh cơng tác tạo điều kiện thuận lợi, hỗ trợ giúp đỡ nghiên cứu sinh suốt trình học tập, nghiên cứu thực Luận án Xin chân thành cảm ơn nhà giáo, nhà khoa học, đồng chí đồng nghiệp thuộc Khoa Mật mã, Phòng Sau Đại học - Học viện Kỹ thuật mật mã; nhà khoa học Viện Khoa học Công nghệ mật mã - Ban Cơ yếu Chính phủ giúp đỡ, hỗ trợ nghiên cứu sinh trình thực Luận án Nghiên cứu sinh chân thành cảm ơn động viên, giúp đỡ to lớn từ phía gia đình, đồng nghiệp hỗ trợ nghiên cứu sinh suốt q trình thực hồn thành Luận án Nghiên cứu sinh Nguyễn Đức Tâm iii MỤC LỤC trang DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT vi BẢNG ĐỐI CHIẾU THUẬT NGỮ viii DANH MỤC CÁC BẢNG ix DANH MỤC CÁC HÌNH VẼ x MỞ ĐẦU Chương TỔNG QUAN VỀ MÃ HÓA CÓ THỂ CHỐI TỪ 1.1 Tổng quan mã hóa chối từ 1.1.1 Khái niệm mã hóa chối từ .8 1.1.2 Ứng dụng mã hóa chối từ 10 1.1.3 Khái niệm khơng phân biệt mặt tính tốn 10 1.1.4 Tính đắn, an tồn, chối từ mã hóa chối từ .11 1.1.5 Một số định nghĩa phân loại lược đồ mã hóa chối từ 13 1.1.6 Tấn cơng cưỡng ép mã hóa chối từ 20 1.1.7 Thẩm quyền đối phương thực cưỡng ép 22 1.2 Các hướng nghiên cứu mã hóa chối từ 23 1.2.1 Các cơng trình nghiên cứu mà hóa chối từ .23 1.2.2 Nhận xét cơng trình nghiên cứu mã hóa chối từ 27 1.3 Phương thức gài đặt mã hóa chối từ dựa mã hóa xác suất 29 1.3.1 Mã hóa xác suất ứng dụng mã hóa xác suất để gài đặt MHCTCT .29 1.3.2 Hai chế độ hoạt động giao thức mã hóa chối từ .31 1.4 Mơ tả tốn cần giải Luận án .32 1.5 Kết luận chương 33 Chương ĐỀ XUẤT PHƯƠNG PHÁP MÃ HÓA CÓ THỂ CHỐI TỪ DỰA TRÊN GIAO THỨC BA BƯỚC SHAMIR 34 2.1 Giao thức ba bước Shamir 34 iv 2.1.1 Thuật toán mã hóa giao hốn 34 2.1.2 Giao thức ba bước Shamir .34 2.2 Phương pháp mã hóa chối từ dựa giao thức ba bước Shamir 35 2.2.1 Phương pháp thực MHCTCT ngữ cảnh công .35 2.2.2 Một số thuật toán sử dụng 37 2.3 Đề xuất số giao thức mã hóa chối từ dựa giao thức ba bước Shamir .38 2.3.1 Giao thức 2.1: giao thức mã hóa chối từ sử dụng thuật tốn Pohlig-Hellman 38 2.3.2 Giao thức 2.2: giao thức MHCTCT sử dụng thuật toán SRA 53 2.3.3 Giao thức 2.3: giao thức mã hóa chối từ sử dụng mã hóa Vernam kết hợp thuật toán ElGamal 62 2.4 Nhận xét khuyến nghị sử dụng giao thức đề xuất 72 2.4.1 Đánh giá độ phức tạp thời gian tính tốn giao thức đề xuất 72 2.4.2 So sánh giao thức đề xuất với số cơng trình hướng nghiên cứu 73 2.4.3 Nhận xét khuyến nghị sử dụng giao thức đề xuất 76 2.5 Kết luận chương 78 Chương ĐỀ XUẤT PHƯƠNG PHÁP MÃ HÓA CÓ THỂ CHỐI TỪ DỰA TRÊN MÃ KHỐI 79 3.1 Mô hình truyền tin, ngữ cảnh cơng tiêu chí thiết kế 79 3.2 Phương pháp mã hóa xác suất dựa mã khối 81 3.2.1 Lược đồ tổng quát mã hóa xác suất dựa mã khối .81 3.2.2 Lược đồ mã hóa xác suất dựa mã khối với hai giai đoạn mã hóa 83 3.3 Đề xuất phương pháp mã hóa chối từ dựa mã khối 84 3.3.1 Lược đồ gài đặt mã hóa chối từ dựa mã khối 84 v 3.3.2 Thuật tốn mã hóa chối từ dựa mã khối 93 3.4 Kết luận chương 108 KẾT LUẬN 109 DANH MỤC CÁC CƠNG TRÌNH CƠNG BỐ 111 TÀI LIỆU THAM KHẢO 113 PHỤ LỤC A: MỘT SỐ THUẬT TOÁN SỬ DỤNG 118 PHỤ LỤC B: MỘT SỐ KẾT QUẢ THỰC NGHIỆM VÀ MÃ NGUỒN CHƯƠNG TRÌNH THỰC NGHIỆM 121 K MHCTCT AES A a|b B C m m m1 m m M mod p CA CPA Dk ( c) DES ĐPTC e Ek ( m) gcd( a, b) fr ( Z ) f ( m) H ( x) IND-CPA I NIST vi b Bên nhận B DANH MỤC KÝ HIỆU VÀ CHỮ VIẾT TẮT Chuẩn mã hóa tiên tiến (Advanced Encryption Standard) Bên gửi A a Tập mã c Đơn vị cấp phát chứng thư (Certificate Authority) Tấn công rõ chọn lựa (CPA: Chosen Plaintext Attack) Hàm giải mã D , giải mã mã c C với khóa k K Chuẩn mã hóa liệu (Data Encryption Standard) Đối phương công Tập khóa mã riêng mã hóa khóa bất đối xứng Hàm mã hóa E , mã hóa thơng điệp m M với khóa k K Ước chung lớn a b (greatest common divisor) l Hàm trích chuỗi bit từ chuỗi bit z theo thuật tốn bí mật c Hàm băm x Hàm gài đặt mã hóa thơng điệp bí mật m Khơng phân biệt mặt tính tốn công lựa chọn rõ (Indistinguishability under chosen-plaintext attack) Khối mã trung gian s ố Tập tham số, khóa mã bí mật người dùng Mã hóa chối từ Thơng điệp giả mạo Thơng điệp bí mật Phép nối chuỗi bit m1 với chuỗi bit m2 Kích thước theo bit m Tập thơng điệp Phép toán modulo p Tập số tự nhiên Viện công nghệ chuẩn quốc gia Hoa Kỳ (National Institute of Standards and Technology) R RSA OTP ord (t ) PKE SRA SKE XOR vii {X n }n c {X n }n {Yn }n Mã hóa khóa sử dụng lần (one-time pad) Cấp phần tử t p * p Mã hóa khóa cơng khai (Public-key encryption) Tập ngẫu nhiên z ( n) Rivest -Shamir-Adlerman Shamir-Rivest -Adlerman Mã hóa khóa bí mật (Secret-key encryption) Phép toán cộng modulo Tập phân bố xác suất biến ngẫu nhiên X n {X n }n {Yn }n Tập số nguyên Trường p : tập hợp số nguyên nhỏ số nguyên p Nhóm nhân số nguyên theo modulo p Tham số bí mật dùng chung hai bên A B sử dụng giao thức trao đổi khóa an tồn để thống Hàm phi Eurler n viii BẢNG ĐỐI CHIẾU THUẬT NGỮ Nghĩa tiếng Anh Nghĩa tiế ng Việt Active coercives Tấn công chủ động (cưỡng ép chủ động) Bi-deniable encryption Mã hóa chối từ đồng thời hai bên Coercer Người/ quan ép buộc Computational indistinguishability Khơng phân biệt mặt tính tốn Correctness Tính xác Coercive adversary Tấn cơng cưỡng ép Coercer adversary Đối phương cưỡng ép Deniability Tính chối từ Deniable Encryption Mã hóa chối từ Flexible-deniable encryption Mã hóa chối từ linh hoạt Fully-deniable encryption Mã hóa chối từ hồn tồn Negligible Khơng đáng kể Passive coercives Tấn công bị động (cưỡng ép bị động) Plan-ahead deniable encryption Mã hóa chối từ kế hoạch trước Probabilistic encryption Mã hóa xác suất Sender-deniable encryption Mã hóa chối từ bên gửi Receiver-deniable encryption Mã hóa chối từ bên nhận Security Tính an toàn Shamir three-pass protocol Giao thức ba bước Shamir ix DANH MỤC CÁC BẢNG trang Bảng 1.1 Phân loại MHCTCT theo bên chối từ 14 Bảng 2.1 Độ phức tạp tính tốn giao thức 2.1 chế độ gài đặt MHCTCT .73 Bảng 2.2 Độ phức tạp tính tốn giao thức 2.2 chế độ gài đặt MHCTCT .73 Bảng 2.3 Độ phức tạp tính tốn giao thức 2.3 73 Bảng 2.4 So sánh giao thức Luận án đề xuất cơng trình nghiên cứu tương tự trước MHCTCT dựa giao thức ba bước Shamir .73 Bảng 2.5 So sánh giao thức 2.3 cơng trình nghiên cứu tương tự MHCTCT sử dụng hệ mã khóa bí mật OTP 75 Bảng B.1 Kết thực nghiệm tính đắn hiệu tính tốn giao thức 2.1 122 Bảng B.2 Kết thực nghiệm tính đắn hiệu tính tốn Lược đồ MHCTCT dựa mã khối 140 x DANH MỤC CÁC HÌNH VẼ trang Hình 1.1 Mơ hình cơng nghe EAV (Eavesdropping Attack) 20 Hình 1.2 Mơ hình cơng cưỡng ép mã hóa thơng thường 21 Hình 1.3 Mơ hình cơng cưỡng ép MHCTCT 21 Hình 2.1 Quá trình thực giao thức ba bước Shamir thuật tốn mã hóa giao hốn 35 Hình 2.2 Phương pháp tổng quát thực gài đặt MHCTCT dựa giao thức ba bước Shamir 36 Hình 2.3 Giao thức 2.1 hoạt động chế độ mã hóa xác suất (dùng để chối từ bị cưỡng ép) 41 Hình 2.4 Giao thức 2.1 hoạt động chế độ gài đặt mã hóa chối (dùng để mã hóa truyền tin mật) 42 Hình 2.5 Giao thức 2.2 hoạt động chế độ mã hóa xác suất (dùng để chối từ bị cưỡng ép) 56 Hình 2.6 Giao thức 2.2 hoạt động chế độ gài đặt MHCTCT (dùng để mã hóa truyền tin mật) 57 Hình 2.7 Giao thức 2.3: giao thức mã hóa Vernam kết hợp thuật tốn ElGamal gài đặt mã hóa chối từ 65 Hình 3.1 Lược đồ tổng quát mã hóa xác suất dựa mã khối 81 Hình 3.2 Lược đồ mã hóa xác suất dựa mã khối với hai giai đoạn mã hóa 83 Hình 3.3 Mã hóa xác suất dựa mã khối MHCTCT dựa mã khối (với hai giai đoạn mã hóa) 84 Hình 3.4 Giải mã MHCTCT dựa mã khối chế độ chối từ bị cưỡng ép 87 Hình 3.5 Giải mã MHCTC dựa mã khối chế độ mã hóa truyền tin mật 88 Hình 3.6 Lược đồ mã hóa xác suất dựa mã khối Lược đồ MHCTCT dựa mã khối kết hợp với hệ phương trình đồng dư 90 Hình 3.7 Giải mã lược đồ mã hóa xác suất dựa mã khối giải mã lược đồ MHCTCT dựa mã khối kết hợp với hệ phương trình đồng dư .91 Hình 3.8 Giải mã MHCTCT dựa mã khối (chế độ mã hóa truyền tin mật) 92 Hình 3.9 Lược đồ cải tiến MHCTCT dựa mã khối kết hợp với hệ phương trình đồng dư 103 154 mpz_t big_tmp1; mpz_init(big_tmp1); mpz_t big_tmp2; mpz_init(big_tmp2); mpz_t big_tmp3; mpz_init(big_tmp3); mpz_t big_tmp4; mpz_init(big_tmp4); /* big_tmp1 = (z * kz) */ mpz_mul(big_tmp1, big_kz, big_z); /* big_tmp2 = (kz * z * s) */ mpz_mul(big_tmp2, big_tmp1, big_s); /* big_tmp3 = (z * r) */ mpz_mul(big_tmp3, big_z, big_r); /* big_tmp4 = ((z * r) - (kz * z *s)) = big_tmp3 - big_tmp2 */ mpz_sub(big_tmp4, big_tmp3, big_tmp2); /* big_DC1 = (((z * r) - (kz * z *s)) mod p) = big_tmp4 mod p */ mpz_mod(big_DC1, big_tmp4, big_p); mpz_clear(big_tmp1); mpz_clear(big_tmp2); mpz_clear(big_tmp3); mpz_clear(big_tmp4); return; } /* HAM TINH DINH THUC: DC” = (s - r) mod p */ void get_DC2(mpz_t big_p, mpz_t big_s, mpz_t big_r, mpz_t big_DC2) { mpz_t big_tmp1; mpz_init(big_tmp1); /* big_tmp1 = (s - r) */ mpz_sub(big_tmp1, big_s, big_r); /* big_DC2 = (s - r) mod p */ mpz_mod(big_DC2, big_tmp1, big_p); mpz_clear(big_tmp1); return; } /* HAM TINH CAC GIA TRI si: si = (c’i + (z * c”i)) mod p */ void get_s(mpz_t big_p, mpz_t big_c1, mpz_t big_c2, mpz_t big_z, mpz_t big_s1) { mpz_t big_tmp1; mpz_init(big_tmp1); mpz_t big_tmp2; mpz_init(big_tmp2); /* big_tmp1 = (z * c2) */ mpz_mul(big_tmp1, big_z, big_c2); /* big_tmp2 = c1 + big_tmp1 */ mpz_add(big_tmp2, big_c1, big_tmp1); 155 /* big_s1 = big_tmp2 mod p */ mpz_mod(big_s1, big_tmp2, big_p); mpz_clear(big_tmp1); mpz_clear(big_tmp2); return; } /* HAM TINH CAC GIA TRI ui = (c’i + (kz *z * c”i)) mod p */ void get_u(mpz_t big_p, mpz_t big_c1, mpz_t big_c2, mpz_t big_z, mpz_t big_kz, mpz_t big_s2) { mpz_t big_tmp1; mpz_init(big_tmp1); mpz_t big_tmp2; mpz_init(big_tmp2); mpz_t big_tmp3; mpz_init(big_tmp3); } /* big_tmp1 = (z * c2) */ mpz_mul(big_tmp1, big_z, big_c2); /* big_tmp2 = (kz * z * c2) */ mpz_mul(big_tmp2, big_kz, big_tmp1); /* big_tmp3 = (c1 + (kz * z * c2)) = c1 + big_tmp2 */ mpz_add(big_tmp3, big_c1, big_tmp2); /* big_s2 = big_tmp3 mod p */ mpz_mod(big_s2, big_tmp3, big_p); mpz_clear(big_tmp1); mpz_clear(big_tmp2); mpz_clear(big_tmp3); return; /* HAM KIEM TRA m CO LA PHAN TU NGUYEN THUY CUA Zp* */ void test_m(mmpz_t big_m, mpz_t big_p, mpz_t big_p1, mpz_t test_value) { mpz_t big_tmp1; mpz_init(big_tmp2); mpz_mul(big_tmp1, big_m, big_m); mpz_mod(big_tmp1, big_tmp1, big_p); mpz_powm(big_tmp2, big_m, big_p1, big_p); if(big_tmp1 != 1) && (big_tmp2 != 1) { test_value = 1; } else { test_value = 0; } mpz_clear(big_tmp1); mpz_clear(big_tmp2); return; } /* HAM GIAI HE PHUONG TRINH DONG DU */ void ProcPH(mpz_t big_p, mpz_t big_r, mpz_t big_z, 156 mpz_t big_kz, mpz_t big_e, mpz_t big_m, mpz_t big_c1, mpz_t big_c2) { int ret = 0; mpz_t big_s; mpz_init(big_s); mpz_t big_r; mpz_init(big_r); mpz_t big_D; mpz_init(big_D); mpz_t big_DC1; mpz_init(big_DC1); mpz_t big_DC2; mpz_init(big_DC2); mpz_t big_tmp1; mpz_init(big_tmp1); mpz_t big_tmp2; mpz_init(big_tmp2); /* s = m^e mod p */ mpz_powm(big_s, big_m, big_e, big_p); /* D = (z - (kz * z))^-1 mod p */ get_D(big_p, big_z, big_kz, big_D); /* DC1 = (z*r - (z * kz *s)) mod p */ get_DC1(big_p, big_z, big_kz, big_r, big_s, big_DC1); /* DC2 = (z - r) mod p */ get_DC2(big_p, big_s, big_r, big_DC2); /* big_c1 = (D * DC1) mod p */ mpz_mul(big_tmp1, big_D, big_DC1); mpz_mod(big_c1, big_tmp1, big_p); /* big_c2 = (D * DC2) */ mpz_mul(big_tmp2, big_D, big_DC2); mpz_mod(big_c2, big_tmp2, big_p); mpz_clear(big_r); mpz_clear(big_s); mpz_clear(big_D); mpz_clear(big_DC1); mpz_clear(big_DC2); mpz_clear(big_tmp1); mpz_clear(big_tmp2); return; } static char* hex2char(char *dst, unsigned char b) { unsigned char v = b >> 4; *dst++ = (v Fake message message [m_fake] and true 163 printf("[A] have [m_fake, m_true, K1, K2, k1, k2]:\n"); printf("\t[m_true_A] = \t%s\n", hex2str((const char* )m_true_A, MESSAGE_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); printf("\t[m_fake_A] = \t%s\n", hex2str((const char* )m_fake_A, MESSAGE_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); printf("\t[K1] = \t\t%s\n", hex2str((const char* )K1, CIPHER_KEY_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); printf("\t[K2] = \t\t%s\n", hex2str((const char* )K2, CIPHER_KEY_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); gmp_printf ("\t[k1] = \t\t%Zd\n", big_k1); gmp_printf ("\t[k2] = \t\t%Zd\n", big_k2); start = clock(); printf("\n1 [A] encrypt message [m_fake] with key [K1], cm_fake = E(m_fake, K1):\n"); cipher_encrypt(m_fake_A, K1, cm_fake_A); printf("\t[cm_fake] = \t%s\n", hex2str((const char* )cm_fake_A, MESSAGE_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); printf("\n2 [A] encrypt message [m_true] with key [K2], cm_true = E(m_true, K2):\n"); cipher_encrypt(m_true_A, K2, cm_true_A); printf("\t[cm_true] = \t%s\n", hex2str((const char* )cm_true_A, MESSAGE_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); printf("\n3 [A] calculate [c] from [cm_fake] and [cm_true], [k1] and [k2]:\n"); str_to_mpz(cm_fake_A, big_cm_fake_A); str_to_mpz(cm_true_A, big_cm_true_A); compute_c(big_c, big_cm_fake_A, big_cm_true_A, big_k1, big_k2); gmp_printf ("\t[c] = \t\t%Zd\n", big_c); end = clock(); enc_true_fake_time_taken[i] = (((double) (end - start)) / CLOCKS_PER_SEC) * 1000; printf("\n\n4 [A] send [c] to [B] \n"); printf("\n "); printf("\n "); printf("\n "); printf("\n\n[B] receive [c] from [A]: \n"); gmp_printf ("\t[c] = \t\t%Zd\n", big_c); start = clock(); printf("\n\nWhen NORMAL condition:"); printf("\n1 [B] calculate [cm_true] from [c] and [k2]:\n"); compute_cm_value(big_cm_true_B, big_c, big_k2); mpz_to_str(big_cm_true_B, cm_true_B); /* Replaced cm_true_B=cm_true_A*/ printf("\t[cm_true] = \t%s\n", hex2str((const char* )cm_true_A, MESSAGE_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); printf("\n2 [B] decrypt [cm_true] with key [K2], m_true = D(cm_true, K2):\n"); cipher_decrypt(cm_true_B, K2, m_true_B); /* Replaced m_true_B=m_true_A*/ 164 printf("\t[m_true] = \t%s\n", hex2str((const char* )m_true_A, MESSAGE_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); printf("\n3 [B] have [m_true] that sent from [A]\n"); printf("\t[m_true] = \t%s\n", hex2str((const char* )m_true_A, MESSAGE_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); /* Replaced m_true_B=m_true_A*/ if(memcmp(m_true_A, m_true_A, MESSAGE_SIZE_BYTES) == 0) { printf("\nOK, [A] HAVE SUCCESSFULY SENT A MESSAGE [m_fake] TO [B]!\n"); dec_true_ok[i] = 1; } else { printf("\nWOW, THEY ARE NOT THE SAME (SOMETHING WENT WRONG!!!)\n"); dec_true_ok[i] = 0; } end = clock(); dec_true_time_taken[i] = (((double) (end - start)) / CLOCKS_PER_SEC) * 1000; start = clock(); printf("\n\nWhen ATTACKED condition:"); printf("\n1 [B] calculate [cm_fake] from [c] and [k1]:\n"); compute_cm_value(big_cm_fake_B, big_c, big_k1); mpz_to_str(big_cm_fake_B, cm_fake_B); printf("\t[cm_fake] = \t%s\n", hex2str((const char* )cm_fake_B, MESSAGE_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); printf("\n2 [B] decrypt [cm_fake] with key [K1], m_fake = D(cm_fake, K1):\n"); cipher_decrypt(cm_fake_B, K1, m_fake_B); printf("\t[m_fake] = \t%s\n", hex2str((const char* )m_fake_B, MESSAGE_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); printf("\n3 [B] have [m_fake] that sent from [A]\n"); printf("\t[m_fake] = \t%s\n", hex2str((const char* )m_fake_A, MESSAGE_SIZE_BYTES, buff_to_print, sizeof(buff_to_print))); if(memcmp(m_fake_B, m_fake_A, MESSAGE_SIZE_BYTES) == 0) { printf("\nOK, [A] HAVE SUCCESSFULY SENT A MESSAGE [m_fake] TO [B]!\n"); dec_fake_ok[i] = 1; } else { WRONG!!!)\n"); printf("\nWOW, THEY ARE NOT THE SAME (SOMETHING WENT dec_fake_ok[i] = 0; } end = clock(); dec_fake_time_taken[i] = (((double) (end - start)) / CLOCKS_PER_SEC) * 1000; enc_time_taken_average = enc_time_taken_average + enc_time_taken[i]; dec_time_taken_average = dec_time_taken_average + dec_time_taken[i]; enc_true_fake_time_average = enc_true_fake_time_average + enc_true_fake_time_taken[i]; dec_true_time_taken_average = dec_true_time_taken_average+ dec_true_time_taken[i]; 165 dec_fake_time_taken_average = dec_fake_time_taken_average + dec_fake_time_taken[i]; printf("\nEXECUTION: %d DONE\n", i + 1); printf("\n**************************************************\n"); /* Pause seconds */ sleep(1); } enc_time_taken_average = enc_time_taken_average/RUN_TIMES; dec_time_taken_average = dec_time_taken_average/RUN_TIMES; enc_true_fake_time_average = enc_true_fake_time_average/RUN_TIMES; dec_true_time_taken_average = dec_true_time_taken_average/RUN_TIMES; dec_fake_time_taken_average = dec_fake_time_taken_average/RUN_TIMES; printf("\n\t\t\t\tALG 3.1 EXECUTION TIME TAKEN AVERAGE\n"); printf("\t\t\t\t Number of running times: %d\n", RUN_TIMES); printf("\n\tNo/Time(ms) \tEnc_deni \tDec_deni \tEnc_sec \tDec_sec(true)\tDec_sec(fake)\tSUCCESSFULY"); printf("\n \n"); char *dec_char, *dec_true_char, *dec_fake_char; for (i = 0; i < RUN_TIMES; i++) { if (dec_ok[i]) { dec_char = "yes"; } else { dec_char = " no"; } if (dec_true_ok[i]) { dec_true_char = "yes"; } else { dec_true_char = " no"; } if (dec_fake_ok[i]) { dec_fake_char = "yes"; } else { dec_fake_char = " no"; } printf(" \t %d \t\t%f \t%f \t%f \t%f \t%f\t%s, %s, %s\n", i + 1, enc_time_taken[i], dec_time_taken[i], enc_true_fake_time_taken[i], dec_true_time_taken[i], dec_fake_time_taken[i], dec_char, dec_true_char, dec_fake_char); } printf("\n \n"); printf("Average (miliseconds) \t%f \t%f \t%f \t%f \t%f\n\n", enc_time_taken_average, dec_time_taken_average, enc_true_fake_time_average, dec_true_time_taken_average, dec_fake_time_taken_average); 166 mpz_clear(big_k1); mpz_clear(big_k2); mpz_clear(big_gcd); mpz_clear(big_r); mpz_clear(big_c); mpz_clear(big_cm_true_A); mpz_clear(big_cm_true_B); mpz_clear(big_cm_fake_A); mpz_clear(big_cm_fake_B); /* if(K1) free(K1); if(K2) free(K2); if(m_true_A) free(m_true_A); if(m_fake_A) free(m_fake_A); if(m_fake_A) free(m_fake_A); if(m_fake_B) free(m_fake_B); if(r) free(r); if(cm_true_A) free(cm_true_A); if(cm_true_B) free(cm_true_B); if(cm_fake_A) free(cm_fake_A); if(cm_fake_B) free(cm_fake_B); */ return 1; } static char* hex2char(char *dst, unsigned char b) { unsigned char v = b >> 4; *dst++ = (v