Tải bản đầy đủ (.docx) (10 trang)

Lập trình Symbolic Lập trình mã hóa và giải mã thông tin trên Mapple dựa trên hệ mã RSA

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (246.07 KB, 10 trang )

Đạ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

×