CHƯƠNG 2: CÁC PHƯƠNG PHÁP THÁM MÃ HỆ MẬT MÃ KHÓA CÔNG
2.3. Một số sơ hở dẫn đến tấn công hệ mật RSA
Tính bảo mật của RSA chủ yếu dựa vào việc giữ bí mật số mũ giải mã a và các thừa số p, q của n. Tuy nhiên, điều kiện an toàn trên của hệ mật chỉ là điều kiện chung.
Trong thực tế khi thiết kế một giao thức hay một kênh bí mật có sử dụng hệ mật RSA
vẫn tồn tại nhiều sơ hở, những sơ hở đó đã được thám mã lợi dụng nhằm phá hủy giao thức, kênh bí mật, phá vỡ tính an toàn của hệ mật.
2.3.1. Biết (n) tìm được p, q
Ta có thể xác định được p, q và ngược lại. Biết được p, q ta có thể dễ dàng tính được (n).
Nếu biết được (n) ta có thể tìm được p, q bằng cách giải hệ phương trình:
p.q = n p.q = n
(p – 1)(q – 1) = (n) p + q = n + 1 – (n) Do đó p, q là nghiệm của phương trình bậc 2:
x2 – (x – (n) + 1)x + n = 0
Bởi vậy nếu người thám mã biết được (n) anh ta có thể phân tích được n và phá được hệ mật.
Ngược lại cho trước p, q rõ ràng việc tính (n) được thực hiện dễ dàng:
(n) = (p – 1)(q – 1) 2.3.2. Biết số mũ giải a
Nếu biết số mũ giải mã a thì coi như đã làm xong việc thám mã, nên việc tìm được p, q cũng không còn ý nghĩa đối với việc thám mã nữa. Tuy nhiên, điều này có một ý nghĩa quan trọng hơn đó là nếu đối phương biết a thì không chỉ phải thay số mũ giải mã khác mà còn phải chọn modul n khác, vì khi đó đối phương cũng có thể biết p, q, do đó biết cách tìm khóa giải mã a bất kỳ, nếu khóa lập mã vẫn giữ modul n, n = p.q.
Ta sẽ chứng minh rằng biết số mũ giải mã a sẽ tìm được các thừa số p, q của n.
Do a.b 1 mod (n) nên a.b - 1 = l.(n) = k.
Do (n) là một số chẵn nên ta có thể viết k dưới dạng k = 2t.r (với r là số lẻ) và t 1.
Theo định lý Ơle: với a mà (a,n)=1 thì a(n) modn 1, do đó, ta có:
g Z*n thì gk 1 mod n (do k là bội của (n)) và do đó gk/2 là căn bậc hai của 1 theo modul n.
Theo định lý phần dư Trung hoa, 1 có 4 căn bậc hai modul n=p.q. Hai căn bậc hai là 1. Hai căn bậc hai khác là x (x 1 mod p và x -1 mod q) (1 < x <
p). Sử dụng một trong hai căn bậc hai không tầm thường này sẽ tìm được p, q trong thời gian đa thức bằng cách tính gdc(x-1,n).
x2 1 mod n (x-1)(x+1) 0 mod n -> (x-1)(x+1) chia hết cho n.
Đặt (x-1, n) = d1 và (x+1, n) = d2. Vì n = p.q và x 1, 0 < x < n, nên:
x-1 0 và 0 < x-1 < n x+1 n và 0 < x+1< n
Suy ra d1 hoặc d2 phải khác 1 và do n = p.q nên một trong hai giá trị d1 và d2
chính là p hoặc q.
2.3.3. Giao thức công chứng
Giao thức công chứng là giao thức được thiết kế cho một văn bản sau khi A ký lên đó, người khác có thể xác thực được rằng văn bản này thực sự được ký bởi A (nó cũng giống như việc công chứng của công chứng viên ký chữ ký của mình lên bảng công chứng).
Để thiết lập giao thức công chứng, Bob phải lựa chọn các tham số RSA: các số nguyên tố p, q và các số mũ hóa e và khóa giải mã d thỏa mãn e.d 1 mod (n) trong đó n = p.q. Các giá trị n, e là công khai, còn p, q và d được Bob giữ bí mật.
Để ký một văn bản M, Bob sử dụng số mũ bí mật d để tính chữ ký S = Md mod n. Bất cứ ai cũng có thể sử dụng những thông tin công khai của Bob để kiểm tra xem S có thật sự là chữ ký của Bob trên M hay không bằng cách tính Se mod n và so sánh với M. Vì chỉ có Bob biết giá trị d, giá trị dùng để tạo ra S. Giao thức công chứng khẳng định rằng chỉ có một mình Bob mới có thể tạo ra S.
Tuy nhiên Davida và Denning [13] đã chỉ ra rằng: có thể tạo ra chữ ký giả mạo của giao thức này. Sau đây là một phương thức để thực hiện điều đó.
Bob có khóa bí mật d và khóa công khai e. Giả sử Marvin muốn có được chữ ký của Bob trên văn bản M Zn*
. Khi đó Marvin có thể thực hiện theo cách sau đây:
Lấy một số ngẫu nhiên r Zn*
, tính M’ = reM mod n, và đề nghị Bob ký trên M’. Nếu Bob ký trên S’, trên M’ thì Marvin có thể dễ dàng tính được chữ ký S của Bob trên M:
S = S’.r-1 mod n.
Vì S’ (M’)d mod n (reM)d mod n r.S mod n
S = r-1.S’ mod n
S tìm được chính là chữ ký của Bob trên M.
Thật vậy:
Se (S’)e mod n (M’)ed/re (mod n) M’/re (mod n) M mod n.
Kỹ thuật trên được gọi là kỹ thuật che khuất (blinding), kỹ thuật này cho phép Marvin lấy được một số chữ ký hợp pháp trên một văn bản anh ta muốn, bằng cách yêu cầu Bob ký trên một văn bản “được che khuất” (blinding) ngẫu nhiên. Bob không có thông tin về văn bản mà anh ta đang thực sự ký.
Kết quả của kỹ thuật này dựa trên một thực tế: RSA sử dụng một hàm toán học (hàm mũ) bảo toàn phép nhân các giá trị đầu vào. Điểm mấu chốt của cách tấn công này nếu chọn X, M, d và n bất kỳ:
(XM)d XdMd mod n tức sigk(X.M) = sigk(X). sigk(M)
Vậy để ngăn cản việc tấn công vào giao thức công chứng bằng kỹ thuật che khuất ta phải hủy bỏ khả năng sử dụng tính bảo toàn của phép nhân mà kẻ định giả mạo chữ ký. Một trong nhiều cách đó là sử dụng hàm “hash một chiều” trên văn bản M trước khi ký và kỹ thuật này được áp dụng trong nhiều ứng dụng thực tế của RSA (ví dụ như thanh toán điện tử ẩn danh).
2.3.4. Giao thức số mũ công khai nhỏ
Một tình huống sử dụng RSA khác nhằm giảm thời gian mã hóa hoặc kiẻm thử chữ ký là dùng số mũ mã hóa nhỏ. Cách này hay được sử dụng trên mạng có yêu cầu truyền thông lớn.
Trong giao thức này mỗi người dùng chọn hai số nguyên tố lớn p, q và công bố khóa công khai <ni, ei> của mình. Chúng ta quan tâm đến trường hợp khi các số mũ mã hóa ei là giống nhau và là một số nguyên nhỏ. Với một vài ứng dụng, điều
đó khá hấp dẫn vì ứng dụng với số mũ nhỏ sẽ có thể thực hiện đơn giản và nhanh hơn. Tuy nhiên tính chất này sẽ làm cho giao thức thất bại nếu một người mã hóa cùng một văn bản bằng số mũ ei và gửi cho nhiều người.
Ví dụ, e = 3 và văn bản M được mã hóa để gửi cho 3 người. Khi đó các bản mã sẽ là: - C2 = M3 mod n2
- C3 = M3 mod n3
- C4 = M3 mod n4
Nếu n2, n3 và n4 nguyên tố cùng nhau, thì áp dụng định lý phần dư Trung hoa sẽ tính được M3 duy nhất thuộc khoảng (0, n2n3n4) thoả hệ phương trình trên. Lấy căn bậc 3 thông thường của M3 sẽ tìm được M.
Nếu ngược lại, n2 và n3 không nguyên tố cùng nhau, thì USCLN(n2 , n3) sẽ là p hoặc q chung của hai người. Khi đó người này hoàn toàn có thể phá vỡ hệ mật của người kia.
Để khắc phục nhược điểm này, văn bản M cần được gắn thêm một thông tin ngẫu nhiên trước khi mã hóa để gửi cho mỗi người. (ví dụ gắn thêm tem thời gian).
Trong ví dụ của chúng ta ở trên, các bản mã mới trong giao thức sẽ là:
C2 = (2|t2|M + t2)3 modn2
C3 = (2|t3|M + t3)3 modn3 C4 = (2|t4|M + t4)3 modn4
Tuy nhiên, Hastad đã chỉ ra rằng cách này có thể không cho đủ các bản rõ khác nhau để khắc phục nhược điểm vốn có của giao thức số mũ nhỏ. Trong tài liệu của ông, Hastad đã chỉ ra rằng một hệ phương trình đồng dư:
Pi(x) = 0 modni, 1 i k
có bậc không lớn hơn d có thể giải được trong thời gian đa thức nếu số phương trình lớn hơn d(d+1)/2. Vì trong trường hợp này số mũ là 3, nếu văn bản được điều chỉnh bằng tem thời gian được gửi cho ít nhất 7 thành viên trong mạng, văn bản sẽ không còn là bí mật đối với người tấn công sau một khoảng thời gian không dài. Tất nhiên, để tấn công theo cách này thì phải biết tem thời gian. Tuy nhiên, tem thời gian chỉ gồm một số bit nhỏ so với kích thước của văn bản vì vậy nó có thể được ước lượng
trước khi áp dụng thuật toán của Hastad. Rõ ràng tính bí mật của hệ thống không thể tuỳ thuộc vào tính bí mật của một mình tem thời gian.
Thất bại của giao thức được đề cập đến trong phần này nhấn mạnh một điều là người thiết kế giao thức phải quan tâm đến việc tăng thêm các thông tin cho các bản mã mà bản rõ của nó có quan hệ (trong ví dụ là bằng nhau hoặc sai khác tem thời gian) hoặc khóa của chúng có liên quan với nhau (như cùng số mũ với modul nguyên tố cùng nhau).
2.3.5. Giao thức số mũ bí mật nhỏ
Để giảm thời gian giải mã (hoặc thời gian sinh chữ ký), người ta muốn sử dụng một giá trị d nhỏ hơn là giá trị d ngẫu nhiên. Vì việc mũ hóa theo modul mất một khoảng thời gian tuyến tính với log2d, nên số mũ d nhỏ có thể nâng hiệu quả thực thi nhanh ít nhất 10 lần (đối với modul 1024 bit). Tuy nhiên, M.Wiener chỉ ra rằng một số mũ giải mã d nhỏ sẽ dẫn đến sập toàn bộ hệ thống mật mã.
Định lý M.Wiener: Cho n = p.q với q<p<2q. Giả sử 1/4 3 1n
d . Biết <n,e> với ed = 1 mod (n) thì có thể khôi phục d một cách hiệu quả.
Chứng minh:
Cách chứng minh dựa trên tính gần đúng của các phân số.
Vì ed = 1 mod (n) nên tồn tại một k sao cho ed - k (n) = 1. Do đó:
) ( 1 )
( d d n
k n e
Vì thế d
k xấp xỉ với ) (n
e
. Mặc dù Marvin không biết (n), anh ta có thể sử dụng n để xấp xỉ nó. Thực vậy, do q < p nên q < n. Mặt khác p < 2q nên p + q <
3q < 3 n do đó p+q-1 < 3 n,
Ta có (n) = n - p - q + 1 nên n(n) 3 n. Thay n vào (n):
n d
k nd
n n k nd
n k kn n k ed d
k n
e ( ) ( ) 1 ( ( )) 3
k(n) = ed -1 < ed và e < (n) nên k < d < 1/4 3 1n .
Vì thế: 1/4 2
2 1 1
d d dn
k n
e
Như vậy, số các phân số d
kvới d < n xấp xỉ bằng n e.
Thực tế, tất cả các phân số này có được là do sự hội tụ của khai triển phân số liên tục của e/n. Tất cả mọi việc phải làm là tính logn hội tụ của phân số liên tục e/n. Một trong những phân số đó sẽ bằng k/d. Vì ed - k(n) = 1, chúng ta có gcd(k,d) = 1 và do đó k/d là phân số tối giản. Đây là thuật toán tuyến tính để khôi phục khóa bí mật d.
Vì n phổ biến là 1024 bit nên độ dài của d ít nhất là 256 bit để tránh việc bị tấn công theo kiểu này. Thật không may đối với những thiết bị có công suất nhỏ như thẻ thông minh (smartcard), ở đó d nhỏ sẽ tiết kiệm được nhiều. Nhưng không sao, Wiener[ đã đưa ra một số kỹ thuật cho phép giải mã nhanh và tránh được sự tấn công đó:
* Số e lớn: Giả sử thay vì giảm e modul (n), một người sử dụng <n,e'> làm khóa công khai, trong đó e' = e + t.(n) với t lớn. Rõ ràng e' có thể được sử dụng vào vị trí của e đối với văn bản mã hóa. Tuy nhiên, khi một giá trị của e lớn được dùng thì giá trị k trong chứng minh ở trên không nhỏ nữa. Một phép tính đơn giản chỉ ra rằng nếu e' > n1.5 thì sẽ không có vấn đề là liệu với d nhỏ như thế nào thì cách tấn công ở trên không thể thực hiện được. Tuy nhiên, giá trị e lớn dẫn đến việc tăng thời gian mã hóa.
* Sử dụng CRT: Một phương pháp khác là sử dụng định lý phần dư Trung Hoa. Giả sử chọn d sao cho cả dp = d mod(p-1) và dq = d mod(q-1) nhỏ (khoảng 128 bit). Việc giải mã nhanh bản mã C thực hiện như sau: tính Mp = Cdp mod p và Mq = Cdq modq. Sau đó sử dụng định lý phần dư Trung Hoa để tính giá trị duy nhất M Z'n thoả mãn M = Mp modp và M=Mq modq. Kết quả M thoả mãn M = Cdmodn
được yêu cầu. Vấn đề là mặc dù dp và dq nhỏ, giá trị d mod(n) có thể lớn. Như thế cách tấn công theo định lý trên không thực hiện được.
Chúng ta chú ý rằng với <n,e> đã biết thì tồn tại cách tấn công cho phép phân tích n ra các thừa số nguyên tố trong thời gian O(min dp , dq ) vì vậy dp và dq không thể chọn quá nhỏ.
Chúng ta không biết phương pháp nào kể trên là an toàn. Điều mà chúng ta biết là cách tấn công của Wiener là không có hiệu quả với chúng. Một định lý do Boneh và Durfee cải tiến chỉ ra rằng nếu d< n0,292 thì có thể khôi phục d từ <n,e>.
Kết quả này chỉ rằng giới hạn của Wiener là chưa chặt chẽ khi cho rằng giới hạn là d < n0,25. Đây vẫn còn là một vấn đề mở cho đến thời điểm hiện nay.
2.3.6. Trường hợp các tham số p-1 và q-1 có các ước nguyên tố nhỏ
Trong khi xây dựng hệ mật RSA, nếu ta bất cẩn trong việc chọn các tham số p và q để p-1 hoặc q-1 có ước nguyên tố nhỏ thì hệ mật mã trở nên mất an toàn. Khi p-1 hoặc q-1 có ước nguyên tố nhỏ thì ta có thể dùng thuật toán Pollar đưa ra vào năm 1974 phân tích N một cách hiệu quả.
Thuật toán được mô tả như sau:
Input: N và một cận B Output: Trả lời:
- Thành công và đưa ra thừa số của N - Không thành công
Thuật toán:
1. a=2
2. For j=2 to B do A= aj mod N
3. d=gcd(a-1, N) 4. If 1<d<N then
Printf ("Thành công và các thừa số của N là:",d,N/d);
Else
Printf ("Không thành công");
Giả sử p là một ước nguyên tố của N và p-1 có phân tích ra các số mũ nguyên tố sau:
n
i a i
p i
p
1
1
Đặt: qmax piai , với i=1,…,n Nếu q B khí đó: (p-1)|B!
ở cuối bước 2 ta có:
a=2B! mod N nên ta cũng có a=2B! mod p vì p|N.
Theo định lý Fermat ta có: 2p-1 1 mod p
Vì p-1|B! nên a 1 mod p. Tại bước 4 ta có p|(a-1) và p|N, do đó p|d=gcd(a- 1, N). Số nguyên tố d sẽ là ước không tầm thường của N trừ khi a=1 ở bước 3.
Ví dụ:
Giả sử N=15770708441. Nếu áp dụng với p-1 với B=180 thì sẽ thấy rằng a=11620221425 ở bước 3, còn d=135979 và N/d=115979
Trên thực tế N=15770708441=135979x115979
Trong trường hợp này, phép phân tích sẽ thành công do:
p-1=135979-1=135978=2x3x131x173 Nếu lấy B 173 thì chắc chắn rằng 135978|B!
Trong thuật toán có (B-1) luỹ thừa theo module, mỗi luỹ thừa cần nhiều nhất là 2log2B phép nhân module dùng cho thuật toán bình phương và nhân. Việc tính ước chung lớn nhất có thể thực hiện trong thời gian O((log2B)3) bằng thuật toán Euclidean. Bởi vậy độ phức tạp của bài toán là: O(B.log2B(log2N)+(log2N)3). Nếu B là O((log2N)i), với số nguyên i xác định nào đó thì thuật toán thật sự là thuật toán thời gian đa thức. Tuy nhiên với phép chọn B như vậy, xác suất thành công sẽ rất nhỏ. Mặt khác nếu tăng kích thước của B lên thật lớn, chẳng hạn tới N1/2 thì thuật toán sẽ thành công nhưng khi đó nó sẽ không thực hiện nhanh hơn phép chia thử.
Như vậy, điểm bất lợi của thuật toán này là nó yêu cầu n phải có ước nguyên tố p sao cho (p-1) chỉ có các thừa số nguyên tố bé.
Giải pháp khắc phục
Ta có thể dễ dàng xây dựng hệ mật RSA với module n=pq hạn chế được việc phân tích theo phương pháp này.
Trước tiên tìm một số nguyên tố p1 sao cho p=2p1+1 cũng là một số nguyên tố và một số nguyên tố q1 sao cho q=2q1+1 cũng là một số nguyên tố(chúng ta có thể kiểm tra điều này bằng các thuật toán kiểm tra tính nguyên tố). Khi đó module RSA n=pq sẽ chống được cách phân tích theo phương pháp p-1.