**Lý thuyết chung:**
- RSA là một thuật toán mật mã hóa khóa công khai.
- Thuật toán RSA do **R**ivest, **S**hamir, **A**dleman đề xuất năm 1977
- Thuật toán RSA có hai khóa: khóa công khai (hay khóa công cộng) và khóa bí mật (hay khóa cá nhân). Mỗi khóa là những số cố định sử dụng trong quá trình mã hóa và giải mã. Khóa công khai được công bố rộng rãi cho mọi người và được dùng để mã hóa. Những thông tin được mã hóa bằng khóa công khai chỉ có thể được giải mã bằng khóa bí mật tương ứng. Nói cách khác, mọi người đều có thể mã hóa nhưng chỉ có người biết khóa cá nhân (bí mật) mới có thể giải mã được.
**Các để bước triển khai RSA**
- Chọn bí mật 2 số nguyên tố lớn **p**, **q**
- Tính **n= p*q** và công khai n
- Tính giá trị hàm Euler: **phi(n) = (p-1)*(q-1)**
- Chọn khóa công khai **e** sao cho e nguyên tố cùng nhau với phi(n) và 1<e<phi(n). Tức là **UCLN(e, phi(n))=1 và 1<e<phi(n)**
- Tính khóa bí mật **d** là phần tử nghịch đảo của e theo mod phi(n): **e*d = 1 mod phi(n)**
=> Sau khi có tất cả các thông số trên, ta có
- Khóa công khai: **[e,n]**
- Khóa bí mật: **[d]**
- Mã hóa thông điệp x bằng khóa công khai, ta sẽ có thông điệp x sau khi được mã hóa là y. Ta có **y = (x^e) mod n**
- Giải mã y để được thông điệp x ban đầu bằng khóa bí mật, ta có: **x = (y^d) mod n**
**Code thuật toán RSA trên Python**
```
p=5
q=11
print("p =",p,"q =",q)
n=p*q
print("n =",n)
phi=(p-1)*(q-1)
print("phi =",phi)
def ucln(a, b):
tg = 0
while(1>0):
tg = a % b
if (tg == 0):
return b
a = b
b = tg
e=2
while (e < phi):
if(ucln(e, phi) == 1):
break
else:
e=e+1
print("e =", e);
k = 1
while (1>0):
d = (k*phi+1)/e
if (d%1==0): break
k=k+1
print("d =", d)
x = 5
print("Thong diep = ", x)
# Viet lai thuat toan tinh so du
y = (x**e) % n
print("Ma hoa = ", y)
x = (y**d) % n
print("Thong diep ban dau = ", x)
```