Back to Home

RSA - Kỹ thuật mã hóa khóa công khai

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óagiả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 ShamirLeonard Adleman phát minh thuật toán RSAmã 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 mm cần được mã hóa, bản mã MM được tạo ra bằng cách

M=mencryption factormodkM = m^{\text{encryption factor}} \mod k

Sau đó MM lại được giải mã đề trờ về thông điệp ban đầu mm bằng cách:

m=Mdecryption factormodkm = M^{\text{decryption factor}} \mod k

Nghĩa là Mdecryption factor=mencryption factor * decryption factormodk=mM^{\text{decryption factor}} = m^{\text{encryption factor * decryption factor}} \mod k= m, suy ra:

mencryption factor * decryption factor11(modk)m^{\text{encryption factor * decryption factor} - 1} \equiv 1 (\mod k)

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,nN,gcd(a,m)=1a,n \in \mathbb{N}, \gcd(a,m)=1, ta luôn có aϕ(n)1(modm)a^{\phi(n)} \equiv 1 \quad (\mod{m}) với ϕ(m)\phi(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 mm:

ϕ(n)={0<x<m,gcd(x,m)=1}\phi(n)=|\{0\lt x \lt m, \gcd(x,m)=1\}|

Hàm ϕ(m)\phi(m) có vài tính chất sau:

  • ϕ(1)=1\phi(1)=1

  • Nếu gcd(a,b)=1\gcd(a,b)=1 thì ϕ(a)ϕ(b)=ϕ(ab)\phi(a)*\phi(b)=\phi(a*b)

  • Nếu pp là số nguyên tố, thì ϕ(p)=p1\phi(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)}S=\{x_1,x_2,\dots,x_{\phi(m)}\} với xi<m,gcd(xi,m)=1x_i \lt m, \gcd(x_i,m)=1. Rõ ràng, theo định nghĩa thì tập hợp này có đúng ϕ(m)\phi(m) phần tử.

Xét tập hợp S={ax1,ax2,,axϕ(m)}S'=\{ax_1,ax_2,\dots,ax_{\phi(m)}\}, vì gcd(xi,m)=1\gcd(x_i,m)=1gcd(a,m)=1\gcd(a,m)=1 nên gcd(axi,m)=1\gcd(ax_i,m)=1. Hơn nữa nếu axiaxj(modm)ax_i \equiv ax_j \pmod m thì xixj(modm)x_i \equiv x_j \pmod mgcd(a,m)=1\gcd(a,m)=1.

Do đó các phần tử của SS' khi lấy dư cho mm sẽ đôi một khác nhac và vẫn nguyên tố cùng như với mm. Vì thế ta có thể kết luận là SS' modulo mm là một hoán vị của tập hợp SS.

Xét tích của tất cả các phần tử trong tập hợp SS'SS (đều modulo với mm) , ta có:

(ax1)(axs)(axϕ(m))x1x2xϕ(m)(modm)aϕ(m)(x1x2xϕ(m))x1x2xϕ(m)(modm)aϕ(m)1(modm)(ax_1)(ax_s)\dots(a x_{\phi(m)}) \equiv x_1x_2 \dots x_{\phi(m)} \pmod m \\ a^{\phi(m)} (x_1x_2 \dots x_{\phi(m)}) \equiv x_1x_2 \dots x_{\phi(m)} \pmod m \\ a^{\phi(m)} \equiv 1 \pmod m

đ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 mm với vai trò như aa ở định lý trên, ta cần tìm nn sao cho:

  • gcd(a,n)=1\gcd(a,n) = 1, nếu tìm được nn thỏa, thì theo định lý Euler bên trên ta có aϕ(n)1(modn)a^{\phi(n)} \equiv 1 (\mod n)

  • Để ý rằng theo công thức đồng dư, nếu: ab(modm)a \equiv b (\mod m) thì akbk(modn)a^k \equiv b^k (\mod n) do đó nếu aϕ(n)1(modn)a^{\phi(n)} \equiv 1 (\mod n)thì (aϕ(n))t1t(modn)(a^{\phi(n)})^t \equiv 1^t (\mod n) tương đương với at.ϕ(n))1(modn)a^{t.\phi(n)}) \equiv 1 (\mod n). Như vậy vấn để là ta cần tìm một số nguyên t>0t \gt 0 để xây dựng: encryption factor×decryption factor=t×ϕ(n)+1\text{encryption factor}\times\text{decryption factor} = t\times \phi(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,qp,q

  • Tính n=p.q,ϕ(p)=p1,ϕ(q)=q1    ϕ(n)=(p1)(q1)n=p.q, \phi(p)=p-1, \phi(q)=q-1 \implies \phi(n)=(p-1)(q-1)

  • Chọn d,eNd,e \in \mathbb{N} sao cho: d.e=1+t.ϕ(n),t>0,tNd.e=1+t.\phi(n), \forall t > 0, t \in \mathbb{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)1 < e < \phi(n) sao cho gcd(e,ϕ(n))=1\gcd(e, \phi(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)\phi(n) là đảm bảo tính chất

    • Chọn dd sao cho d.e1(modϕ(n))d.e \equiv 1 (\mod \phi(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)pk=(n,e), và khóa bí mật (secret key) là sk=(d,n)sk = (d,n)

  • Từ đó, ta có:

    • Mã hóa M=memodnM = m^e \mod n

    • Giải mã m=Mdmodnm=M^d \mod n

Demo

Các bạn chú ý nhập p,qp,q sao cho n=p.q>128n=p.q \gt 128 để tránh lỗi do mất mát thông tin nhé!

Comments

0/300

Leave name/email blank to comment anonymously

No comments yet. Be the first to comment!