Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 117 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
117
Dung lượng
1,39 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ ĐÀO VIỆT ANH NGHIÊN CỨU MỘT SỐ CHỮ KÝ ĐẶC BIỆT TRÊN ĐƢỜNG CONG ELLIPTIC LUẬN VĂN THẠC SĨ HẢI PHÒNG – 2011 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ ĐÀO VIỆT ANH NGHIÊN CỨU MỘT SỐ CHỮ KÝ ĐẶC BIỆT TRÊN ĐƢỜNG CONG ELLIPTIC Ngành: Công nghệ thông tin Chuyên ngành: Hệ thống thông tin Mã số: 60 08 45 LUẬN VĂN THẠC SĨ Ngƣời hƣớng dẫn khoa học: PGS TS Trịnh Nhật Tiến HẢI PHÒNG – 2011 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com MỤC LỤC LỜI CAM ĐOAN MỤC LỤC BẢNG DANH MỤC CÁC TỪ VIẾT TẮT DANH MỤC CÁC HÌNH VẼ Chương CÁC KHÁI NIỆM CƠ BẢN 1.1 MỘT SỐ KHÁI NIỆM TRONG SỐ HỌC 1.1.1 Số nguyên tố 1.2 MỘT SỐ KHÁI NIỆM TRONG ĐẠI SỐ 1.2.1 Khái niệm Nhóm, Vành, Trƣờng 1.2.3 Không gian vector 11 1.2.4 Vành tuyến tính 12 1.2.5 Trƣờng hữu hạn 13 1.3 KHÁI NIỆM VỀ ĐỘ PHỨC TẠP CỦA THUẬT TOÁN 16 1.3.1 Khái niệm thuật toán 16 1.3.2 Độ phức tạp thuật toán 16 1.3.3 Một số lớp toán 18 1.4 MỘT SỐ KHÁI NIỆM TRONG MẬT Mà 21 1.4.1 Mã hóa 21 1.4.2 Chữ ký số 25 1.4.2.1 Sơ đồ chữ ký số 25 Chương SƠ ĐỒ CHỮ KÝ TRÊN ĐƢỜNG CONG ELLIPTIC 26 2.1.2 Đƣờng cong Elliptic trƣờng Galois 27 2.1.3 Đƣờng cong Elliptic trƣờng hữu hạn 30 2.1.3.1 Đường cong elliptic trường FP (p số nguyên tố) 30 2.1.3.2 Đường cong elliptic trường F2m 31 2.1.4 CÁC PHÉP TOÁN TRÊN ĐƢỜNG CONG ELLIPTIC 32 2.1.4.1 Phép cộng 32 2.1.4.2 Phép nhân 35 2.1.5 SỐ ĐIỂM TRÊN ĐƢỜNG CONG ELLIPTIC VỚI TRƢỜNG FQ 38 2.2 MỘT SỐ SƠ ĐỒ CHỮ KÝ TRÊN ĐƢỜNG CONG ELLIPTIC 39 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 2.2.1 NHÚNG BẢN RÕ VÀO ĐƢỜNG CONG ELLIPTIC 40 2.2.1.1 Phép nhúng (Imbeding) 40 2.2.1.2 Phép mặt nạ (Mask) 41 2.2.2 SƠ ĐỒ CHỮ KÝ TRÊN ĐƢỜNG CONG ELLIPTIC 41 2.2.2.1 Sơ đồ chữ ký ECDSA 41 2.2.2.2 Sơ đồ chữ ký Nyberg - Rueppel 43 2.2.2.3 Sơ đồ chữ ký mù Harn EC 43 2.2.2.4 Sơ đồ chữ ký mù bội Harn EC 46 2.3 MỘT SỐ PHƢƠNG PHÁP TẤN CÔNG CHỮ KÝ ECC 48 2.3.1 Phƣơng pháp công “baby-step giant - step” 48 2.3.2 Phƣơng pháp công MOV 49 2.3.3 Các thuật tốn cơng khác 52 2.4 LỰA CHỌN ĐƢỜNG CONG ELLIPTIC PHÙ HỢP 52 2.4.1 Trƣờng K 52 2.4.2 Dạng đƣờng cong elliptic 53 2.4.3 Phƣơng pháp lựa chọn 54 2.5 MỘT SỐ CHUẨN SỬ DỤNG HỆ MẬT ECC 55 Chương CHỮ KÝ ECC TRONG TIỀN ĐIỆN TỬ 58 3.1 THANH TOÁN BẰNG TIỀN ĐIỆN TỬ 58 3.1.1 Khái niệm tiền điện tử 58 3.1.2 Lƣợc đồ giao dịch 59 3.1.3 Phân loại 60 3.1.4 Những đặc điểm tiền điện tử 61 3.1.4.1 Tính an tồn 61 3.1.4.2 Tính riêng tƣ 62 3.1.4.3 Tính độc lập 62 3.1.4.4 Tính chuyển nhƣợng 62 3.1.4.5 Tính phân chia 63 3.1.4.6 Tính dể sử dụng 63 3.1.4.7 Hình thức tốn 63 3.2 MỘT SỐ VẤN ĐỀ VỀ TIỀN ĐIỆN TỬ 64 3.2.1 Vấn đề ẩn danh 65 3.2.2 Vấn đề khai man giá trị đồng tiền 65 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 3.2.3 Vấn đề tiêu xài đồng tiền nhiều lần 66 3.3 CHỮ KÝ ECC DÙNG TRONG TIỀN ĐIỆN TỬ 69 3.3.1 Sử dụng chữ ký “mù” nhằm ẩn danh ngƣời dùng tiền điện tử 70 3.3.2 Sử dụng chữ ký "dùng lần" nhằm tránh tiêu đồng tiền hai lần 71 3.3.3 Sơ đồ tiền điện tử đề xuất 72 Chương CHƢƠNG TRÌNH MƠ PHỎNG GIẢI THUẬT CHỮ KÝ SỐ TRÊN ĐƢỜNG CONG ELLIPTIC 79 4.1 Cài đặt hệ điều hành Ubuntu 79 4.2 Cài đặt chƣơng trình mơ sơ đồ chữ ký ECDSA 79 4.3 Tổng quan chƣơng trình 80 4.4 Các chức chƣơng trình 80 KẾT LUẬN 84 TÀI LIỆU THAM KHẢO 85 PHỤ LỤC 86 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com BẢNG DANH MỤC CÁC TỪ VIẾT TẮT Từ viết tắt Từ gốc Nghĩa tiếng Việt DLP Discrete Logarithm Problem Vấn đề logarit rời rạc ECC Elliptic Curve Cryptography Hệ mật đƣờng cong Elliptic EDLP Elliptic Curve Discrete Logarithm Problem Vấn đề logarit rời rạc đƣờng cong Elliptic MD5 Message Digest Algorithm Thuật toán tạo "vết" TOF Trap Door One-Way Function Hàm cửa sập chiều RFC SHA Request for Comments Yêu cầu bình luận Thuật tốn "băm" an tồn Secure Hash Algorithm LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 2 DANH MỤC CÁC HÌNH VẼ Hình vẽ Tên hình vẽ Hình 2.1 Một ví dụ đƣờng cong elliptic Hình 2.2 Điểm vơ cực Hình 2.3 Phép cộng đƣờng cong elliptic Hình 2.4 Phép nhân đơi đƣờng cong elliptic Hình 3.1 Mơ hình giao dịch hệ thống tiền điện tử Hình 3.2 Phân loại tiền điện tử Hình 3.3 Mơ hình giao dịch có tính chuyển nhƣợng Hình 4.1 Giao diện q trình sinh khóa Hình 4.2 Giao diện q trình ký Hình 4.3 Giao diện trình giải mã LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com LỜI MỞ ĐẦU Hiện ứng dụng công nghệ thông tin đời sống ngày lớn Với phát triển thiết bị cầm tay với ƣu điểm tiện lợi, linh hoạt nhu cầu xây dựng ứng dụng thiết bị ngày lớn Một đặc điểm thiết bị cầm tay nhớ nhỏ với tốc độ tính tốn thấp Chính xuất phát từ thực tế đó, thuật tốn mã hóa đƣờng cong Elliptic với ƣu điểm tốc độ xử lý nhanh, không cần nhiều tài nguyên đời thích hợp với thiết bị cầm tay vừa đảm bảo độ an tồn khơng u cầu nhiều tài ngun Chính em chọn đề tài:" Nghiện cứu số chữ ký đặc biệt đƣờng cong Elliptic" làm đề tài luận văn thạc sĩ Nội dung đề tài: Chương 1: Một số khái niệm Nêu lên số khái niệm đại số, số học, khái niệm mã hóa, chữ ký số nhƣ độ phức tạp thuật toán Chương 2: Sơ đồ chữ ký đường cong Elliptic Nêu lên số sơ đồ chữ ký số đặc biệt đƣờng cong Elliptic Chương 3: Chữ ký ECC tiền điện tử Nêu lên ứng dụng chữ ký số đƣờng cong Elliptic(ECC) hệ thống tiền điện tử, Chương 4: Xây dựng chương trình mơ giải thuật chữ ký số đường cong Elliptic Xây dựng chƣơng trình nhỏ nhằm mơ sơ đồ chữ ký số đƣờng cong Elliptic (ECDSA- Elliptic curve digital signature algorithm) Em xin chân thành cảm ơn PGS.TS Trịnh Nhật Tiến giúp đỡ em suốt trình viết luận văn LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Chương CÁC KHÁI NIỆM CƠ BẢN 1.1 MỘT SỐ KHÁI NIỆM TRONG SỐ HỌC 1.1.1 Số nguyên tố Số nguyên a > đƣợc gọi số nguyên tố, a có ƣớc số a Một số nguyên lớn khơng số ngun tố đƣợc gọi hợp số Ví dụ số 2, 3, 5, số nguyên tố; số 6, 8, 10, 12, 14, 15 hợp số Hai số a b đƣợc gọi nguyên tố nhau, chúng có ƣớc số chung 1, tức gcd (a,b) = Một số nguyên n > viết dƣới dạng n = p1a1 p2a2 pkak p1, p2, ,pk số nguyên tố khác nhau, a1, a2, ak số mũ nguyên dƣơng Nếu không kể thứ tự thừa số ngun tố dạng biểu diễn nhất, ta gọi dạng khai triển tắc n Ví dụ dạng khai triển tắc 1800 233252 Các số nguyên tố vấn đề số ngun tố có vai trị quan trọng số học ứng dụng vào lý thuyết mã hóa, xét riêng chƣơng sau Định lý 1.1 (Thuật tốn Euclid tìm ƣớc số chung lớn nhất) Với a, b Z, b 0, tồn q, r Z để: a = bq + r, r | b | Nếu r = b|a, nghĩa b ƣớc số a Ngƣợc lại b a Với a1, …, ak Z, b|ai (i = 1,…, k) b gọi ƣớc chung a1,…, ak Ƣớc chung lớn a1, …, ak ký hiệu gcd(a1, …, ak) LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Định lý 1.2 Nếu a, b Z khác d = gcd(a, b) phần tử nhỏ tất số nguyên dƣơng có dạng ax + by (x, y Z) Chứng minh Giả sử C = {c N | c = ax + by, x, y Z} C ф Đặt e = ax0 + by0 phần tử nhỏ C Chúng ta cần d = e Nếu a = eq + r, r e thì: r = a – eq = a(1 – qx0) + b(-qy0) Nếu r phải thuộc C điều mâu thuẫn với lựa chọn e Vì vậy, e|a Tƣơng tự, e|b; e d Mặt khác, e = ax0 + by0 d|a, d|b, suy d|e Vì vậy, d e Kết luận, d = e Hệ 1.3 Tồn x, y Z thỏa mãn: ax + by = c d|c với d = gcd(a, b) Chứng minh Nếu a = ed, b = fd, rõ ràng d|c Mặt khác d|c, đặt kd = c Vì tồn x0, y0 Z để ax0 + by0 = d, nên a(kx0) + b(ky0) = kd = c Với a, b, m Z ta định nghĩa a b mod m m|(a - b) Dễ nhận thấy, với m cố định, quan hệ tƣơng đƣơng Z Vì vậy, Z đƣợc phân hoạch thành lớp tƣơng đƣơng: Zm = {[a] | a Z}, với [a] = {b Z | a b mod m} Mỗi lớp tƣơng đƣơng [a] đƣợc thể phần tử Ví dụ, Zm = {0, 1, 2, …, m – 1} LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 98 point_at_infinity(R); /* Vịng lặp thơng qua bit số ngun cho bit, bit x thêm vào kết quả*/ int bits = mpz_sizeinbase(multiplier, 2); unsigned long int bit = 0; while(bit p);//t1 = x^3 mod p mpz_mul(t3, x, curve->a); //t3 = a*x mpz_mod(t2, t3, curve->p); //t2 = t3 mod p mpz_add(t3, t1, t2); //t3 = t1 + t2 mpz_add(t4, t3, curve->b); //t4 = t3 + b mpz_mod(a, t4, curve->p); //a = t4 mod p //beta = sqrt(alpha) mod p LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 99 number_theory_squareroot_modp(b, a, curve->p); //Lấy y mod từ đầu vào mpz_set_ui(t2, zPoint[1] == '2' ? : 1); mpz_set(P->x, x); //t2 = beta mod p mpz_mod_ui(t1, b, 2); if(mpz_cmp(t1, t2)) mpz_set(P->y, b); //y = beta else mpz_sub(P->y, curve->p, b);//y = p -beta //Giải phóng nhớ mpz_clear(x); mpz_clear(a); mpz_clear(b); mpz_clear(t1); mpz_clear(t2); mpz_clear(t3); mpz_clear(t4); } /* Nén điểm thành chuỗi thập lục phân(hệ 16).*/ char* point_compress(point P) { //Điểm không điểm vô cực assert(!P->infinity); //Đảo ngược nhớ int l = mpz_sizeinbase(P->x, 16) + 2; char* result = (char*)malloc(l + 1); result[l] = '\0'; mpz_t t1;mpz_init(t1); //Tính x theo hệ 16 mpz_get_str(result +2, 16, P->x); //x chẵn hay lẻ? mpz_mod_ui(t1, P->y, 2); if(mpz_cmp_ui(t1, 0)) strncpy(result, "02", 2); else strncpy(result, "03", 2); mpz_clear(t1); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 100 return result; } /*Giải phóng nhớ*/ void point_clear(point p) { mpz_clear(p->x); mpz_clear(p->y); free(p); } Tạo chữ ký theo sơ đồ chữ ký ECDSA: #include #include #include #include #include #include "domain_parameters.h" #include "point.h" #include "signature.h" #include "numbertheory.h" #include "random.h" /*Khởi tạo chữ ký*/ signature signature_init() { signature sig; sig = malloc(sizeof(struct signature_s)); mpz_init(sig->r); mpz_init(sig->s); return sig; } /*In chữ ký theo tiêu chuẩn dòng liệu*/ void signature_print(signature sig) { printf("\nSignature (r,s): \n\t("); mpz_out_str(stdout, 10, sig->r); printf(",\n\t"); mpz_out_str(stdout, 10, sig->s); printf(")\n"); } void signature_set_str(signature sig, char *r, char *s, int base) { LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 101 mpz_set_str(sig->r, r, base); mpz_set_str(sig->s, s, base); } /Tạo định dạng hexadecimal cho chữ ký*/ void signature_set_hex(signature sig, char *r, char *s) { signature_set_str(sig,r,s,16); } /*Tạo định dạng thập phân cho chữ ký*/ void signature_set_ui(signature sig, unsigned long int r, unsigned long int s) { mpz_set_ui(sig->r, r); mpz_set_ui(sig->s, s); } void signature_copy(signature R, signature sig) { mpz_set(R->r, sig->r); mpz_set(R->s, sig->s); } /*So sánh chữ ký, trả lại kết chúng không đồng nhất, ngược lại trả giá trị 0*/ bool signature_cmp(signature sig1, signature sig2) { return !mpz_cmp(sig1->r,sig2->r) && !mpz_cmp(sig1->s,sig2->s); } /*Khởi tạo khóa cơng khai từ khóa bí mật*/ void signature_generate_key(point public_key, mpz_t private_key, domain_parameters curve) { point_multiplication(public_key, private_key, curve->G, curve); } /*Khởi tạo chữ ký cho thông điệp*/ void signature_sign(signature sig, mpz_t message, mpz_t private_key, domain_parameters curve) { assert(mpz_sizeinbase(message, 2) n, 2)); //Khởi tạo biến mpz_t k;mpz_init(k); mpz_t x;mpz_init(x); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 102 point Q = point_init(); mpz_t r;mpz_init(r); mpz_t t1;mpz_init(t1); mpz_t t2;mpz_init(t2); mpz_t t3;mpz_init(t3); mpz_t s;mpz_init(s); gmp_randstate_t r_state; signature_sign_start: //Đặt giá trị k gmp_randinit_default(r_state); random_seeding(r_state); mpz_sub_ui(t1, curve->n, 2); mpz_urandomm(k , r_state , t1); gmp_randclear(r_state); //Tính x point_multiplication(Q, k, curve->G, curve); mpz_set(x, Q->x); point_clear(Q); //Tính r mpz_mod(r, x, curve->n); if(!mpz_sgn(r)) //Bắt đầu lại if r=0 goto signature_sign_start; mpz_clear(x); //Tính s //s = k¯¹(e+d*r) mod n = (k¯¹ mod n) * ((e+d*r) mod n) mod n number_theory_inverse(t1, k, curve->n);//t1 = k¯¹ mod n mpz_mul(t2, private_key, r);//t2 = d*r mpz_add(t3, message, t2); //t3 = e+t2 mpz_mod(t2, t3, curve->n); //t2 = t3 mod n mpz_mul(t3, t2, t1); //t3 = t2 * t1 mpz_mod(s, t3, curve->n); //s = t3 mod n mpz_clear(t1); mpz_clear(t2); mpz_clear(t3); //Đặt lại chữ ký mpz_set(sig->r, r); mpz_set(sig->s, s); //Giải phóng nhớ mpz_clear(k); mpz_clear(r); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 103 mpz_clear(s); } /*Kiểm tra chữ ký*/ bool signature_verify(mpz_t message, signature sig, point public_key, domain_parameters curve) { //Kiểm tra r s nằm khoảng [1, n-1] mpz_t one;mpz_init(one); mpz_set_ui(one, 1); if( mpz_cmp(sig->r,one) < && mpz_cmp(curve->n,sig->r) s,one) < && mpz_cmp(curve->n,sig->s) s, curve->n); //u1 = message * w mod n mpz_mod(tt2, message, curve->n); mpz_mul(t, tt2, w); mpz_mod(u1, t, curve->n); //u2 = r*w mod n mpz_mul(t, sig->r, w); mpz_mod(u2, t, curve->n); //x = u1*G+u2*Q point_multiplication(t1, u1, curve->G, curve); point_multiplication(t2, u2, public_key, curve); point_addition(x, t1, t2, curve); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 104 // Có kết quả, cách so sánh giá trị x với r xác minh x không vô cực bool result = mpz_cmp(sig->r, x->x) == && !x->infinity; //Giải phóng nhớ point_clear(x); point_clear(t1); point_clear(t2); mpz_clear(w); mpz_clear(u1); mpz_clear(u2); mpz_clear(t); mpz_clear(tt2); //Trả kết return result; } /*Giải phóng chữ ký*/ void signature_clear(signature sig) { mpz_clear(sig->r); mpz_clear(sig->s); free(sig); } Tệp chương trình (main.c): #include #include #include #include #include #include "domain_parameters.h" #include "point.h" #include "sha1.h" #include "signature.h" #include "test.h" #include "benchmark.h" #include "curves.h" /*Version chương trình*/ #define VERSION "1.0.0" /*Đường cong mặc định*/ #define DEFAULT_CURVE secp160r1 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 105 /*Hệ điều hành Linux*/ #define NULL_DEVICE "/dev/null" //Các câu lệnh int command_undefined(int argc, char* argv[]); int command_generate(int argc, char* argv[]); int command_sign(int argc, char* argv[]); int command_verify(int argc, char* argv[]); int command_crack(int argc, char* argv[]); int command_benchmark(int argc, char* argv[]); int command_test(int argc, char* argv[]); int command_test_generate(int argc, char* argv[]); int command_test_verify(int argc, char* argv[]); int command_test_compression(int argc, char* argv[]); int command_test_self(int argc, char* argv[]); int command_test_number_theory(int argc, char* argv[]); int command_help(int argc, char* argv[]); int command_version(int argc, char* argv[]); //Trợ giúp void get_message(mpz_t m, int argc, char* argv[]); domain_parameters get_curve(int argc, char* argv[]); bool is_parameter_defined(int argc, char* argv[], char* parameter); /* Đọc thông số tùy chọn từ danh sách đối số, yêu cầu cho tham số cách sử dụng stdin / stdout */ char* read_optional_parameter_or_ask(int argc, char* argv[], char* parameter, char* question, char EndChar); /* Đọc tham số tùy chọn từ danh sách đối số, trả NULL khơng có tham số có sẵn */ char* read_optional_parameter(int argc, char* argv[], char* parameter); /* Yêu cầu tham số sử dụng stdin / stdout */ char* ask_for_parameter(char* question, char EndChar); FILE* get_output(int argc, char* argv[]); /*Các hàm chính*/ int main(int argc, char *argv[]) { int return_value = 4; LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 106 // Thực lệnh tùy thuộc vào thông số if(argc == 1){ return_value = command_undefined(argc, argv); }else if(!strcmp(argv[1]," generate") || !strcmp(argv[1],"-g")){ return_value = command_generate(argc, argv); }else if(!strcmp(argv[1]," sign") || !strcmp(argv[1],"-s")){ return_value = command_sign(argc, argv); }else if(!strcmp(argv[1]," verify")){ return_value = command_verify(argc, argv); }else if(!strcmp(argv[1]," crack")){ return_value = command_crack(argc, argv); }else if(!strcmp(argv[1]," benchmark") || !strcmp(argv[1],"-b")){ return_value = command_benchmark(argc, argv); }else if(!strcmp(argv[1]," test") || !strcmp(argv[1],"-t")){ return_value = command_test(argc, argv); }else if(!strcmp(argv[1]," test-generate")){ return_value = command_test_generate(argc, argv); }else if(!strcmp(argv[1]," test-verify")){ return_value = command_test_verify(argc, argv); }else if(!strcmp(argv[1]," test-compression")){ return_value = command_test_compression(argc, argv); }else if(!strcmp(argv[1]," test-numbertheory")){ return_value = command_test_number_theory(argc, argv); }else if(!strcmp(argv[1]," test-self")){ return_value = command_test_self(argc, argv); }else if(!strcmp(argv[1]," help") || !strcmp(argv[1],"-h")){ return_value = command_help(argc, argv); }else if(!strcmp(argv[1]," version") || !strcmp(argv[1],"-v")){ return_value = command_version(argc, argv); }else{ return_value = command_undefined(argc, argv); } // Trả lại giá trị từ lệnh return return_value; } /* Lệnh không xác định, không đọc đƣợc thông số */ int command_undefined(int argc, char* argv[]) { fprintf(stderr, "%s: Thiếu ký tự.\n", argv[0]); fprintf(stdout, "Thử '%s help' để biết thêm thơng tin.\n", argv[0]); } /*Khởi tạo khóa cơng khai */ int command_generate(int argc, char* argv[]) { LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 107 FILE* out = get_output(argc, argv); domain_parameters curve = get_curve(argc, argv); //Lấy giá trị khóa bí mật char* str_key = read_optional_parameter(argc, argv, "-g"); if(str_key == NULL) str_key = read_optional_parameter_or_ask(argc, argv, " generate", "Khoa bi mat:", '\n'); char* str_hash = sha1(str_key); mpz_t key;mpz_init(key); mpz_set_str(key, str_hash, 16); free(str_hash); //Release memory free(str_key); //khóa modulo n mpz_t temp; mpz_init(temp); mpz_mod(temp, key, curve->n); mpz_set(key, temp); mpz_clear(temp); bool quite = is_parameter_defined(argc, argv, " quite"); if(!quite) quite = is_parameter_defined(argc, argv, "-q"); //Khởi tạo khóa cơng khai point Q = point_init(); signature_generate_key(Q, key, curve); //In dạng rút gọn khóa cơng khai char* pubkey = point_compress(Q); //Viết khóa cơng khai hình if(quite) fputs(pubkey, out); else fprintf(out, "Khoa cong khai:\n%s\n", pubkey); domain_parameters_clear(curve); point_clear(Q); mpz_clear(key); free(pubkey); fclose(out); return 0; LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 108 } /*Lệnh ký khởi tạo chữ ký*/ int command_sign(int argc, char* argv[]) { FILE* out = get_output(argc, argv); domain_parameters curve = get_curve(argc, argv); //Lấy giá trị khóa bí mật char* str_key = read_optional_parameter(argc, argv, "-s"); if(str_key == NULL) str_key = read_optional_parameter_or_ask(argc, argv, " sign", "Khoa bi mat:", '\n'); char* str_hash = sha1(str_key); mpz_t key;mpz_init(key); mpz_set_str(key, str_hash, 16); free(str_hash); free(str_key); //khóa modulo n mpz_t temp; mpz_init(temp); mpz_mod(temp, key, curve->n); mpz_set(key, temp); bool quite = is_parameter_defined(argc, argv, " quite"); if(!quite) quite = is_parameter_defined(argc, argv, "-q"); //Đọc thong điệp mpz_t m;mpz_init(m); get_message(m, argc, argv); //Thông điệp modulo n mpz_mod(temp, m, curve->n); mpz_set(m, temp); mpz_clear(temp); //Khởi tạo chữ ký signature sig = signature_init(); signature_sign(sig, m, key, curve); //In kết if(quite) { fprintf(out, "R:"); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 109 mpz_out_str(out, 16, sig->r); fprintf(out, "\nS:"); mpz_out_str(out, 16, sig->s); fprintf(out, "\n"); }else{ fprintf(out, "Signature:\n\tR:"); mpz_out_str(out, 16, sig->r); fprintf(out, "\n\tS:"); mpz_out_str(out, 16, sig->s); fprintf(out, "\n"); } domain_parameters_clear(curve); mpz_clear(key); mpz_clear(m); fclose(out); return 0; } /*Câu lệnh kiểm tra chữ ký*/ int command_verify(int argc, char* argv[]) { FILE* out = get_output(argc, argv); domain_parameters curve = get_curve(argc, argv); //Lấy giá trị khóa công khai char* zkey = read_optional_parameter_or_ask(argc, argv, " verify", "Khoa cong khai:", '\n'); point Q = point_init(); point_decompress(Q, zkey, curve); free(zkey); bool quite = is_parameter_defined(argc, argv, " quite"); if(!quite) quite = is_parameter_defined(argc, argv, "-q"); //Đọc thông điệp mpz_t m;mpz_init(m); get_message(m, argc, argv); //Thông điệp modulo n mpz_t temp; mpz_init(temp); mpz_mod(temp, m, curve->n); mpz_set(m, temp); mpz_clear(temp); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 110 //Đọc chữ ký char* str_r = ask_for_parameter("Chu ky R:", '\n'); char* str_s = ask_for_parameter("Chu ky S:", '\n'); signature sig = signature_init(); signature_set_str(sig, str_r, str_s, 16); free(str_r); free(str_s); //Kiểm tra chữ ký bool result = signature_verify(m, sig, Q, curve); { if(result) fprintf(out, "Chu ky la hop le.\n"); else fprintf(out, "Chu ky KHONG hop le!\n"); } domain_parameters_clear(curve); point_clear(Q); mpz_clear(m); fclose(out); if(result) return 0; else return 1; } /*Câu lệnh giải mã khóa cơng khai*/ int command_crack(int argc, char* argv[]) { FILE* out = get_output(argc, argv); domain_parameters curve = get_curve(argc, argv); //Lấy khóa cơng khai char* zkey = read_optional_parameter_or_ask(argc, argv, " crack", "Khoa cong khai:", '\n'); point Q = point_init(); point_decompress(Q, zkey, curve); free(zkey); bool quite = is_parameter_defined(argc, argv, " quite"); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 111 if(!quite) quite = is_parameter_defined(argc, argv, "-q"); point guess = point_init(); point_set(guess, curve->G); point guess2 = point_init(); mpz_t i; mpz_init(i); mpz_t i2; mpz_init(i2); mpz_set_ui(i, 0); if(!quite) fprintf(out, "Ban dang dung phuong phap vet can.Co the rat mat thoi gian An Ctrl+C de dung lai.\n Đã kiểm tra: "); //i int i_i = 0; int printed = 0; //Thực vòng lặp while(true) { if(point_cmp(guess,Q)) break; point_addition(guess2, guess, curve->G, curve); mpz_add_ui(i2, i, 1); if(point_cmp(guess2,Q)) break; point_addition(guess, guess2, curve->G, curve); mpz_add_ui(i, i2, 1); if(!quite) { while(printed>0) { printf("\b");// } printed = fprintf(stdout, "%i", i_i); i_i += 2; printed ; } } if(mpz_cmp(i,i2) < 0) mpz_set(i, i2); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 112 if(quite) { mpz_out_str(out, 16, i); }else{ fprintf(out, "Giá trị băm khóa bí mật là:\n"); mpz_out_str(out, 16, i); fprintf(out, "\n"); } domain_parameters_clear(curve); point_clear(Q); point_clear(guess); mpz_clear(i); fclose(out); } LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com ... Nghiện cứu số chữ ký đặc biệt đƣờng cong Elliptic" làm đề tài luận văn thạc sĩ Nội dung đề tài: Chương 1: Một số khái niệm Nêu lên số khái niệm đại số, số học, khái niệm mã hóa, chữ ký số nhƣ... toán Chương 2: Sơ đồ chữ ký đường cong Elliptic Nêu lên số sơ đồ chữ ký số đặc biệt đƣờng cong Elliptic Chương 3: Chữ ký ECC tiền điện tử Nêu lên ứng dụng chữ ký số đƣờng cong Elliptic( ECC) hệ thống... CÔNG NGHỆ ĐÀO VIỆT ANH NGHIÊN CỨU MỘT SỐ CHỮ KÝ ĐẶC BIỆT TRÊN ĐƢỜNG CONG ELLIPTIC Ngành: Công nghệ thông tin Chuyên ngành: Hệ thống thông tin Mã số: 60 08 45 LUẬN VĂN THẠC SĨ Ngƣời hƣớng dẫn khoa