Đại Học Quốc Gia TP.HCM Trường Đại Học Công Nghệ Thông Tin BÁO CÁO CHUYÊN ĐỀ Lập trình Symbolic ĐỀ TÀI: Lập trình mã hóa và giải mã thông tin trên Mapple dựa trên hệ mã RSA Giáo viên hướng dẫn :PGS.TS Đỗ Văn Nhơn Học viên thực hiện :Du Chí Hào Mã số học viên :CH1101083 Lớp :Cao học khóa 6 TP.HCM – 01/2013 Báo cáo chuyên đề Lập trình Symbolic Mục lục Trao đổi thông tin là nhu cầu thiết yếu trong sinh hoạt của con người. Với sự phát triển với tốc độc nhanh của khoa học máy tính hiện nay, việc trao đổi thông tin không còn là giới hạn về mặt thời gian cũng như không gian. Nhưng việc trao đổi thông tin như thế này sẽ phát sinh một số vấn đề như: rò rỉ, thất lạc, nội dung bị thay đổi. Do đó, con người cần có những cộng cụ để bảo vệ những thông tin riêng tư, bí mật. Trong bài thu hoạch này sẽ giới thiệu về vấn đề mã hóa và giải mã thông tin dựa trên hệ mã RSA và việc mã hóa và giải mã sẽ được lập trình trên công cụ hỗ trợ tính toán là Mapple. Để giải quyết bài toán trên, chúng ta cần xây dựng hàm để trả về các khóa công khai và các khóa bí mật. Sau đó dựa vào các khóa đó để tiến hành mã hóa và giải mã thông tin. I Giới thiệu về hệ mã RSA 1. Định nghĩa Mật mã khóa công khai còn gọi là mật mã bất đối xứng hay mật mã hai khóa là dùng hai khóa riêng biệt cho hai việc mã hóa và giải mã. Một trong hai khóa được phổ biến công khai gọi là khóa công khai, khóa còn lại gọi là khóa bí mật. Nếu trong quá trình mã hóa thì dùng khóa công khai và trong quá trình giải mã sẽ dùng khóa bí mật. 2. Nguyên tắc hoạt động Các bước cơ bản của một hệ thống dùng mật mã khóa công khai: 1. Người dùng tạo ra một cặp khóa gồm khóa công khai và khóa bí mật cho việc mã hóa và giải mã thông tin. 2. Người dùng thông báo khóa công khai cho các người dùng khác biết. Khóa còn lại được giữ bí mật. HVTH: Du Chí Hào Trang: 2 Báo cáo chuyên đề Lập trình Symbolic 3. Người dùng A muốn gửi thông tin cho người dùng B, người dùng A sẽ mã hóa thông tin bằng khóa công khai, sau đó gửi cho thông tin được mã hóa cho người dùng B. 4. Khi người dùng B nhận được thông tin được mã hóa, người dùng B sử dụng khóa bí mật của mình để mã hóa thông tin. Do khóa bí mật không được phổ biến công khai nên chỉ có người dùng B có khả năng giải mã. 3. Thuật toán hệ mã RSA RSA là thuật toán mật mã khóa công khai được xây dựng bởi Ron Rivest, Adi Shamir và Len Adleman tại viện công nghệ Massachusetts, do đó được đặt tên là Rivest - Shamir - Adleman hay RSA. Thuật toán này được ra đời năm 1977 và cho đến nay đã được ứng dụng trong nhiều lĩnh vực. Thuật toán RSA được mô tả như sau: 1. Để tạo ra một cặp khóa RSA, trước hết là phải chọn ra 2 số nguyên p và q đủ lớn. 2. Tính n = p.q 3. Tính (n) = (p-1).(q-1) 4. Chọn một số e sao cho e và (n) là hai số nguyên tố cùng nhau. 5. Tìm số d sao cho d = e -1 mod (n). 6. Với 3 thành phần là n, e, d, ta có: khóa công khai là tổ hợp (n, e), khóa bí mật là tổ hợp (n, d). 7. Việc mã hóa thông tin m được thực hiện theo công thức: c = m e mod n 8. Quá trình giải mã c được thực hiện theo công thức: m = c d mod n Ví dụ: 1. Chọn 2 số nguyên tố, p = 30,559, q = 21,517 2. Tính n=p.q = 30,559. 21,517 = 657,538,003 3. Tính (n) = (p-1).(q-1) = 30,558.21,516 = 657,485,928 HVTH: Du Chí Hào Trang: 3 Báo cáo chuyên đề Lập trình Symbolic 4. Chọn e = 28,351 là số nguyên tố cùng nhau với (n) 5. Tính d = e -1 mod (n) = 103,617,055 6. Như vậy, cặp khóa công khai là (657538003, 28351) và khóa bí mật là ((657538003, 103617055). II Tổ chức lưu trữ trên Mapple Việc mã hóa trên hệ mã RSA đòi hỏi phải làm việc với các con số nguyên lớn nên các ngôn ngữ lập trình thông thường có thể sẽ không hỗ trợ. Mapple hỗ trợ các số nguyên rất lớn nên việc lập trình mã hóa và giải mã sẽ dễ dàng hơn so với các ngôn ngữ khác. Trong bài toán này, chúng ta cần phải lưu trữ ba số nguyên có thể có giá trị rất lớn (hơn 2 2048 bit) và chuỗi văn bản như sau: 1. Một biến số nguyên module n cho việc thực hiện quá trình mã hóa và giải mã. 2. Một biến số nguyên e kết hợp với số module n tạo thành một cặp mã công khai sử dụng cho việc mã hóa. 3. Một biến số nguyên d kết hợp với số module n tạo thành cặp mã bí mật sử dụng cho việc giải mã. 4. Một chuỗi văn bản cần phải mã hóa. 5. Một chuỗi để lưu trữ đoạn chuỗi văn bản đã được hóa. III Các hàm được xây dựng để phục vụ cho bài toán Các hàm đã được triển khai trong phần sourcecode trên Mapple nên trên bài thu hoạch này chỉ mô tả ý nghĩa và cách sử dụng của các hàm đã triển khai: 1. Hàm modpow được xây dựng để tính công thức a b mod n. Trong Mapple cũng có hỗ trợ cách tính công thức này nhưng nếu số mũ b quá lớn thì rất chậm và bị lỗi "numeric exception: overflow". Ví dụ: HVTH: Du Chí Hào Trang: 4 Báo cáo chuyên đề Lập trình Symbolic 2. Hàm TaoSoNgauNhien dùng để tạo ra một số nguyên dương với một đối số truyền vào là kích thước số cần tạo. Ví dụ: TaoSoNgauNhien(32) ⇔ tạo một số ngẫu nhiên trong khoảng 0 → 2 32 . 3. Hàm KiemTraSoNguyenTo dùng để kiểm tra một số có phải là số nguyên tố hay không. Kết quả trả về là giá trị true hoặc false. 4. Hàm TaoSoNguyenTo dùng để tạo một số nguyên tố ngẫu nhiên với đối số truyền vào là kích thước số cần tạo. Trong hàm này sử dụng hàm TaoSoNgauNhien để tạo số và KiemTraSoNguyenTo để kiểm tra số vừa tạo có phải là số nguyên tố không. Nếu không sẽ lặp cho đến khi tìm ra số nguyên tố. 5. Hàm SoNghichDaoModule dùng để tìm số nghịch đảo của một số theo module n. Hàm được xây dựng dựa trên thuật toán Euclide mở rộng. Procedure Euclid_Extended (int e, int phiN) { int dividend = e % phiN; int divisor = phiN; int last_x =1; int curr_x = 0; while (divisor > 0) { int quotient = dividend / divisor; int remainder = dividend % divisor; if (remainder <= 0) HVTH: Du Chí Hào Trang: 5 Báo cáo chuyên đề Lập trình Symbolic { break; } int next_x = last_x - curr_x * quotient; last_x = curr_x; curr_x = next_x; dividend = divisor; divisor = remainder; } If(curr_x< 0) return curr_x + phiN; Else return curr_x; } Ví dụ: Tìm số nghịch đảo (nếu có) của 30 theo môđun 101 Bước lặp dividend divisor last_x curr_x quotient remainder next_x Khởi tạo 30 101 1 0 - - - 1 101 30 0 1 0 30 1 2 30 11 1 -3 3 11 -3 3 11 8 -3 7 2 8 7 4 8 3 7 -10 1 3 -10 5 3 2 -10 27 2 2 27 6 2 1 27 -37 1 1 -37 7 2 0 Đến bước 7, do remainder = 0 nên return ra kết quả -37. Lấy số đối của 37 theo mođun 101 được 64. Vậy 30 -1 mod 101 = 64. 6. Hàm TaoKhoaRSA dùng để phát sinh ra các số e, d, module n để phục vụ cho việc mã hóa và giải mã. Với hai đối số truyền vào là kích thước hai số nguyên tố P, Q và kích thước cho khóa. HVTH: Du Chí Hào Trang: 6 Báo cáo chuyên đề Lập trình Symbolic 7. Hàm MaHoaDuLieu dùng để mã hóa chuỗi thông tin cần mã hóa dựa trên cặp mã công khai (e, n). Hàm sẽ mã hóa từng ký tự, sau đó ghép lại thành một chuỗi các ký tự đã mã hóa. 8. Hàm GiaiMaDuLieu dùng để giải mã chuỗi các ký tự đã mã hóa ở trên thành lại chuỗi ban đầu dựa trên cặp mã bí mật (d, n). IV Một số ví dụ thử nghiệm cho bài toán 1. Ví dụ về mã hóa chuỗi "Y thuc co truoc, vat chat co sau, day la quan diem duy tam" theo kích thức khóa là 16 bit. 2. Ví dụ về mã hóa chuỗi "Y thuc co truoc, vat chat co sau, day la quan diem duy tam" theo kích thức khóa là 512 bit. Do chuỗi được mã hóa theo khóa 512 bit rất dài nên em không hiển thị trong bài thu hoạch. HVTH: Du Chí Hào Trang: 7 Báo cáo chuyên đề Lập trình Symbolic V HVTH: Du Chí Hào Trang: 8 Báo cáo chuyên đề Lập trình Symbolic Kết luận Qua bài thu hoạch này, em có cơ hội tìm hiểu chi tiết về lập trình và sử dụng các công thức tính toán trên Mapple. Qua đó, em có thể thấy được Mapple có khả năng tính toán các số có giá trị lớn, với thời gian nhanh và độ chính xác cao. Trong bài thu hoạch này em có kèm theo sourcecode Mapple trong file " MaHoaGiaiMaRSA.mw" và đã triển khai tất cả các thuật toán và các hàm đã mô tả ở phần trên. Tuy nhiên do thời gian và kiến thức còn gói gọn trong môn học nên chuyên đề sẽ không tránh được những thiếu sót, em mong nhận được sự đóng góp xây dựng tích cực của thầy PGS TS. Đỗ Văn Nhơn cùng bạn đọc. Em xin cảm ơn PGS TS. Đỗ Văn Nhơn đã tận tình truyền đạt cho em những kiến thức nền tảng về “Lập trình Symbolic” để em có thể thực hiện bài thu hoạch này. HVTH: Du Chí Hào Trang: 9 Báo cáo chuyên đề Lập trình Symbolic Tài liệu tham khảo [1] Các file bài giảng về lập trình Symbolic của PGS TS. Đỗ Văn Nhơn. [2] RSA – Tấn công và phòng thủ -Nguyễn Thành Nhân – Nhà xuất bản Thanh niên – 2007. HVTH: Du Chí Hào Trang: 10 . bảo vệ những thông tin riêng tư, bí mật. Trong bài thu hoạch này sẽ giới thiệu về vấn đề mã hóa và giải mã thông tin dựa trên hệ mã RSA và việc mã hóa và giải mã sẽ được lập trình trên công cụ. Quốc Gia TP.HCM Trường Đại Học Công Nghệ Thông Tin BÁO CÁO CHUYÊN ĐỀ Lập trình Symbolic ĐỀ TÀI: Lập trình mã hóa và giải mã thông tin trên Mapple dựa trên hệ mã RSA Giáo viên hướng dẫn :PGS.TS Đỗ. tính toán là Mapple. Để giải quyết bài toán trên, chúng ta cần xây dựng hàm để trả về các khóa công khai và các khóa bí mật. Sau đó dựa vào các khóa đó để tiến hành mã hóa và giải mã thông tin. I Giới