Thuật toán được phát triển vào năm 1977 do ba học viên của Học viện Công nghệ Massachusetts (MIT) là Ron Rivest, Adi Shamir và Len Adleman (RSA), thuật toán RSA được công bố lần đầu tiên vào năm 1978, cũng là một thể chế mật mã khóa đôi hoàn thiện cho đến ngày nay về phương diện lý luận. Tính an toàn của nó dựa vào sự phân giải đại số nguyên. Thuật toán RSA là thuật toán tiêu biểu dùng cho mã hóa không đối xứng.
RSA có dạng mã khối, plaintext và ciphertext là các số nguyên trong khoảng 0 đến n-1 cho mỗi n.
Mô tả thuật toán:
blocks với mỗi block có một giá trị nhị phân nhỏ hơn một số n nào đó. Việc mã hóa và giải mã theo một form cho mỗi plaintext block M và ciphertext block C:
C = Me mod n [4]
M = Cd mod n [4]
Cho p,q là 2 số nguyên tố phân biệt, n = pq, φ = φ(n) = (p-1)(q-1), 1 < e < φ, e và φ là hai nguyên tố cùng nhau, d = e-1 mod φ, 1 < d < φ, 0 ≤ m < n và c = me mod n thì m = cd mod n.
Chứng minh: do ed = 1 mod n, tồn tại 1 số nguyên k thỏa ed = 1 + kφ, theo định luật Euler, ta có mφ = 1 mod n, vì thế: [4]
(mφ mod n)k 1k mod n = 1 mod n.
((mφ mod n)k mod n) m = (1 mod n) m = m mod n = m. m = (mkφ mod n)(m mod n) = m1+kφ mod n = med mod n. Vậy cd mod n = (me)d mod n = m.
Thuật toán RSA dựa vào độ khó của sự phân tích một số thành hai số nguyên tố, vì vậy với thuật toán RSA, p và q phải đủ lớn để không thể tìm ra được p, q từ n.
Cả người gửi và người nhận đều phải biết giá trị n. Người gửi biết giá trị của e và chỉ nguời nhận mới biết giá trị của d. Vì vậy, đây là một thuật toán mã hóa với khóa công khai là KU={e,n} và một khóa mật là KR={d,n}.
Ta có thể biểu diễn từng bước RSA như sau :
p,q là hai số nguyên tố Được chọn bí mật
n = pq Được tính toán, công khai
e, với gcd(φ(n),e) = 1, 1 < e < n Được chọn, công khai d, de ≡ 1 (mod φ(n)) Được tính toán, bí mật Tìm giá trị d ở bước 4 có thể viết lại là tìm giá trị số nguyên x sao cho : d = [ x(p-1)(q-1) + 1 ] / e với d cũng là số nguyên. [9] gcd(φ(n),e) = 1: ước số chung lớn nhất của φ(n) và e là 1.
Khóa mật là tổ hợp của {d,n} và khóa công khai là tổ hợp của {e,n}.
Giả sử A công bố khóa công khai của mình và B muốn gửi thông điệp M cho A. Khi đó B tính C = Me(mod n) và gửi C. Khi nhận được thông điệp mã hóa này,
người sử dụng A sẽ giải mã bằng việc tính: M = Cd(mod n)
Ta có thể trình bày tổng quát thuật toán RSA như sau: + Sinh khóa:
Chọn p,q p và q là hai số nguyên tố khác nhau Tính n = pq
Chọn số nguyên e gcd(φ(n),e) = 1 , 1<e<n
Tính d de = 1( mod φ(n))
Khóa công khai KU = {e,n}
Khóa bí mật KR = {d,n} + Mã hóa : Plaintext: M < n Ciphertext: C = Me mod n + Giải mã : Ciphertext: C Plaintext: M = Cd mod n
Việc mã hóa và giải mã trong RSA đều thực hiện trên số nguyên với một số nguyên lớn. Nếu việc lũy thừa được thực hiện hoàn toàn trên các số nguyên thì các giá trị trung gian sẽ rất lớn.
Ta sử dụng một đặc tính toán học xử lý để rút gọn kết quả trung gian: (a mod n) x (b mod n) = (a x b) mod n
Ví dụ: p =11, q = 3. n = p x q = 33.
φ(n) = (p -1)(q-1) = 20. Chọn e = 3 ?
Kiểm tra gcd(p-1,e) = gdc(10,3) =1. gcd (q -1, e) = gcd(2,3) =1.
⇒ gcd(φ(n),e) = gcd(20,3) = 1. Tính toán d = ?
ed ≡ 1 (mod φ(n))
Tìm d sao cho d = [x(p-1)(q-1) + 1 ] / e với x là số nguyên dương.
⇒ d = 7.
⇒ Khóa công khai KU = (n,e) = (33,3). Khóa bí mật KR = (n,d) = (33,7). Giả sử ta muốn mã hóa bản tin m = 7. c = me mod n = 73 mod 33 = 13.
⇒ bản tin đã mã hóa c = 13.
Để giải mã ta có m = cd mod n = 137 mod 33 = 7.
Với bộ khóa công khai và khóa bí mật như trên ta có thể mã hóa các giá trị từ 0 đến 32 như sau : c 0 1 2 3 4 5 6 7 8 9 10 m 0 1 8 27 31 26 18 13 17 3 10 c 11 12 13 14 15 16 17 18 19 20 21 m 11 12 19 5 9 4 29 24 28 14 21 c 22 23 24 25 26 27 28 29 30 31 32 m 22 23 30 16 20 15 7 2 6 25 32 + Tạo khóa :
Trước khi ứng dụng các hệ thống mã hóa khóa công khai, mỗi người tham dự phải phát sinh ra một cặp khóa. Nó bao hàm những công việc sau:
- Xác định hai số nguyên p và q.
- Lựa chọn một trong hai số e và d và tính cái kia.
- Trước hết, vì giá trị n = pq có thể đã biết và về mặt tổng quát thì các số nguyên tố p và q phải được chọn trong một tập đủ lớn, trong trường hợp khác phương án được sử dụng để tìm một số nguyên tố lớn phải hợp lý.
Một vấn đề nữa để hoàn thiện quá trình sinh khóa đó là xác định giá trị e và tính giá trị d hoặc ngược lại xác định giá trị d và tính giá trị e. Giả sử ta cần lựa chọn giá trị e, e được chọn sao cho gcd(φ(n),e)=1 và tính d=e-1 mod φ(n). Để thực hiện
công việc này, nói chung sử dụng một thuật toán tìm ước số chung lớn nhất của hai số nguyên, nếu gcd=1 xác định nghịch đảo của một trong hai số nguyên modulo với số kia.
Tóm lại : Từ thuật toán RSA ta rút ra một số kết luận sau:
Ưu điểm của mật mã không đối xứng là thuận tiện cho công tác quản lý khóa và một số chức năng mới của hệ thống.
Nhược điểm của mật mã không đối xứng là phép tính mật mã khóa đôi, nói chung là tương đối phức tạp, tốc độ giải mã chậm.