Con người đã sử dụng mã hóa từ hàng ngàn năm trước, ví dụ như mã Caesar cách đây hơn 2000 năm. Tuy nhiên, các phương pháp cổ điển chỉ dùng một khóa cho cả mã hóa và giải mã, gây bất tiện và thiếu an toàn. Ví dụ như trong chiến tranh do phải chuyển khóa cho người nhận, khóa dễ bị đánh cắp hoặc thất lạc. Năm 1977, ba nhà khoa học máy tính là Ron Rivest, Adi Shamir và Leonard Adleman phát minh thuật toán RSA – mã hóa bất đối xứng với hai khóa: khóa công khai (public key) để mã hóa và khóa bí mật (private key hay secret key) để giải mã. RSA đánh dấu bước tiến lớn trong mật mã học, đặt nền tảng cho bảo mật internet như HTTPS, chữ ký số (digital signature) và VPN.
Ý tưởng chủ đạo
Từ một thông điệp gốc m cần được mã hóa, bản mã M được tạo ra bằng cách
M=mencryption factormodk Sau đó M lại được giải mã đề trờ về thông điệp ban đầu m bằng cách:
m=Mdecryption factormodk Nghĩa là Mdecryption factor=mencryption factor * decryption factormodk=m, suy ra:
mencryption factor * decryption factor−1≡1(modk) Từ đây, chúng ta có thể dùng “encryption factor“ trở thành khóa công khai và “decryption factor“ trở thành khóa bí mật. Tuy nhiên, làm cách nào để xác định chúng?
Định lý Euler
Cho a,n∈N,gcd(a,m)=1, ta luôn có aϕ(n)≡1(modm) với ϕ(m) là hàm đếm tổng các số tự nhiên nhỏ hơn và nguyên tố cùng nhau với m:
ϕ(n)=∣{0<x<m,gcd(x,m)=1}∣ Hàm ϕ(m) có vài tính chất sau:
ϕ(1)=1
Nếu gcd(a,b)=1 thì ϕ(a)∗ϕ(b)=ϕ(a∗b)
Nếu p là số nguyên tố, thì ϕ(p)=p−1
Mình xin giới thiệu một chứng minh đơn giản của định lý này như sau:
Gọi S={x1,x2,…,xϕ(m)} với xi<m,gcd(xi,m)=1. Rõ ràng, theo định nghĩa thì tập hợp này có đúng ϕ(m) phần tử.
Xét tập hợp S′={ax1,ax2,…,axϕ(m)}, vì gcd(xi,m)=1 và gcd(a,m)=1 nên gcd(axi,m)=1. Hơn nữa nếu axi≡axj(modm) thì xi≡xj(modm) vì gcd(a,m)=1.
Do đó các phần tử của S′ khi lấy dư cho m sẽ đôi một khác nhac và vẫn nguyên tố cùng như với m. Vì thế ta có thể kết luận là S′ modulo m là một hoán vị của tập hợp S.
Xét tích của tất cả các phần tử trong tập hợp S′ và S (đều modulo với m) , ta có:
(ax1)(axs)…(axϕ(m))≡x1x2…xϕ(m)(modm)aϕ(m)(x1x2…xϕ(m))≡x1x2…xϕ(m)(modm)aϕ(m)≡1(modm) điều phải chứng minh.
Áp dụng Định lý Euler để xây dựng lược đồ mã hóa
Nếu xem thông điệp cần mã hóa m với vai trò như a ở định lý trên, ta cần tìm n sao cho:
gcd(a,n)=1, nếu tìm được n thỏa, thì theo định lý Euler bên trên ta có aϕ(n)≡1(modn)
Để ý rằng theo công thức đồng dư, nếu: a≡b(modm) thì ak≡bk(modn) do đó nếu aϕ(n)≡1(modn)thì (aϕ(n))t≡1t(modn) tương đương với at.ϕ(n))≡1(modn). Như vậy vấn để là ta cần tìm một số nguyên t>0 để xây dựng: encryption factor×decryption factor=t×ϕ(n)+1
Đó là ý tưởng chính của thuật toán. Dưới đây là các bước của thuật toán.
Thuật toán RSA
Chọn 2 số nguyên tố: p,q
Tính n=p.q,ϕ(p)=p−1,ϕ(q)=q−1⟹ϕ(n)=(p−1)(q−1)
Chọn d,e∈N sao cho: d.e=1+t.ϕ(n),∀t>0,t∈N. Thực ra, đây là thứ mình diễn giải để tiện cài đặt từ nguyên văn thuật toán:
Chọn 1<e<ϕ(n) sao cho gcd(e,ϕ(n))=1, thực ra ở bước này, bạn có thể tìm một số nguyên tố bất kỳ bé hơn ϕ(n) là đảm bảo tính chất
Chọn d sao cho d.e≡1(modϕ(n)), để tính chúng ta có thể dùng thuật toán Euclide mở rộng (Extented Euclide Algorithm). Demo này mình chọn brute force cho đơn giản.
Khóa công khai (public key) là pk=(n,e), và khóa bí mật (secret key) là sk=(d,n)
Từ đó, ta có:
Demo
Các bạn chú ý nhập p,q sao cho n=p.q>128 để tránh lỗi do mất mát thông tin nhé!