Giải thuật RSA (Rivest – Shamir Aldeman)

Một phần của tài liệu NGHIÊN CỨU VÀ ỨNG DỤNG CHỮ KÝ SỐ TRONG BẢO MẬT TRUYỀN THÔNG (Trang 35 - 37)

Thuật toán RSA là một trong những thuật toán khóa công khai được phát triển sớm nhất, được đưa ra vào năm 1977 bởi Ron Rivest, Adi Shamir và Len Adleman. RSA hỗ trợ cả mã hóa và giải mã dữ liệu với độ dài khóa thay đổi. Sử dụng khóa dài giúp tăng độ an toàn của hệ thống nhưng phải trả giá về thời gian tính toán

RSA là một khối mã hóa (block cipher) trong đó plaintext và ciphertext là những số nguyên từ 0 đến (n-1) với n xác định

Khối plaintext M và khối ciphertext C C = Me mod n

M = Cd mod n = (Me)d mod n = Med mod n

Cả người gửi và người nhận đều phải biết giá trị của n và e, và chỉ có người nhận mới biết giá trị của d. Đây là thuật toán mã hóa khóa công khai với khóa công kha KPU = {e, n} và khóa riêng KPR = {d, n},

Để thuật toán này thỏa mãn những điều kiện của mã hóa khóa công khai thì những yêu cầu sau phải được thỏa mãn :

1) Có thể tìm ra giá trị của e, d, n mà thỏa mãn Med = M mod n với mọi M < n 2) Dễ dàng tính toán Me và Cd với mọi giá trị M < n.

3) Với e và n đã cho, việc tìm ra d là điều không thể.

Hai yêu cầu đầu tiên có thể dễ dàng đáp ứng, yêu cầu thứ 3 có thể đáp ứng với giá trị lớn của e và n.

Thuật toán RSA được tổng quát trong 3 quá trình như sau :

1) Tạo cặp khóa

Để tạo được cặp khóa, đầu tiên cần lựa chọn 2 số nguyên tố p và q. Tiếp đó tính tích của chúng được giá trị n tức là tính n = p x q.

Tính φ(n) = (p -1)(q -1). Hai số nguyên tố p, q lựa chọn là đủ lớn để khó có thể tính ngược lại từ n và φ(n).

Sau đó lựa chọn số nguyên e (1 < e < φ(n) ) là số nguyên tố cùng nhau với φ(n), tức là thỏa mãn ƯSCLN (φ(n),e) = 1.

Tính d thỏa mãn d = e-1 mod φ(n)

Khi đó cặp khóa sinh ra với khóa công khai là KPU = {n, e} và khóa riêng KPR={n, d}.

2) Mã hóa

Giả sử người dùng A công khai khóa của họ và người dùng B muốn gửi tin cho A thì B sẽ mã hóa bản tin sử dụng khóa KPU của A : C = Me mod n

Sau đó truyền C đi.

3) Giải mã

Khi A nhận được bản ciphertext, A sẽ thực hiện giải mã bằng cách tính : M = Cd mod n

Ví dụ thuật toán RSA

Ta xét một ví dụ thuật toán RSA được thực hiện qua những bước như sau : 1. Lựa chọn 2 số nguyên tố p =7 và q =17

2. Tính n = 7 x 17 = 119 ; φ(n) = (7 -1)(17 - 1) =96

3. Chọn e < 96 và là nguyên tố cùng nhau với 96, chọn e = 5 (có thể chọn e = 3, 7 ..)

4. Xác định d : thỏa mãn d = e-1 mod φ(n) = 5-1 mod 96, ta xác định được d = 77 vì 77 x 5 = 385 = 4 x 96 + 1

5. Khóa sinh ra là KPU = {96, 5} và KPR = {96, 77}

6. Giả sử đầu vào plaintext M = 83. Sử dụng khóa công khai để mã hóa ta cần tính C = 835 mod 96

835 mod 96 = [(831 mod 96) x (832 mod 96)2 mod 96] mod 96 83 mod 96 = 83

832 mod 96 = 73

C = 835 mod 96 = (83 x 732) mod 96 = 35 (adsbygoogle = window.adsbygoogle || []).push({});

7. Khi tới nơi nhận, bên nhận thực hiện giải mã sử dụng khóa riêng, cần tính M = 3577 mod 96

3577 mod 96 = [352 mod 96 x (355 mod 96)15 mod 96] mod 96 352 mod 96 = 73

355 mod 96 = 35, (355 mod 96)15 mod 96 = 353 mod 96 = 59 M = 3577 mod 96 = (73 x 59) mod 96 = 83

Tấn công giải thuật RSA :

Có hai hướng tiếp cận để đánh bại giải thuật RSA. Cách thứ nhất đó là hướng tiếp cận brute-force : cố gắng thử tất cả các khóa riêng có thể. Do đó để đảm bảo an toàn cho thuật toán, người ta thường lựa chọn lựa chọn số lượng lớn các bít trong e và d.

Tuy nhiên vì có thể lại ảnh hưởng đến quá trình sinh khóa và mã hóa, giải mã nên với cỡ khóa lớn, chương trình thường chạy chậm. Cách tiếp cận thứ hai để tấn công giải thuật RSA đó là thử phân tách n thành 2 thừa số nguyên tố, thực hiện tìm p và q sau đó sẽ tính ra được n, d. Nhưng với cách tấn công này, chúng ta có thể phòng ngừa bằng cách chọn những số nguyên tố đủ lớn, như vậy việc phân tách n sẽ càng

khó. Hiện nay, cỡ khóa thường là 1024 bit, tương đương với 300 số decimal mới được xem là đủ mạnh và an toàn cho các ứng dụng.

Tuy nhiên với số n càng lớn thì thời gian thực hiện mã hóa càng lâu. Trong thực tế để khắc phục nhược điểm về tốc độ xử lý của phương pháp mã hóa công khai người ta sẽ tiến hành mã hóa bản tin bằng một thuật toán khóa bí mật (mã hóa đối xứng) như DES, rồi mã hóa chìa khóa bí mật (secret - key) với một hệ khóa công khai như RSA. Như vậy thì hệ mã hóa công khai “truyền tải” khóa bí mật. Do khóa bí mật thường ngắn hơn so với bản tin nên việc mã hóa theo cách này sẽ nhanh hơn so với việc chỉ dùng hệ khóa công khai để mã hóa. Do vậy mỗi bức điện khi truyền một cách an toàn trên mạng sẽ có hai phần: một bản tin được mã hóa bằng hệ mã hóa đối xứng, và chìa khóa đuợc dùng để mã hóa bản tin đuợc mã hóa dùng hệ mã hóa khóa công khai. Việc đọc bản tin theo đó sẽ có hai bước: đầu tiên là giải mã khóa bí mật, sau đó dùng khóa bí mật này giải mã bản tin

Một phần của tài liệu NGHIÊN CỨU VÀ ỨNG DỤNG CHỮ KÝ SỐ TRONG BẢO MẬT TRUYỀN THÔNG (Trang 35 - 37)