Giả sử khóa biết bí mật d, ta có thể tiếp tục sử dụng d, cùng với khóa cơng
khai (N, e), ta có thể tìm đến tận cùng p và q, phá vỡ hệ thống RSA. Thuật
toán được xây dựng dựa trên các nhận xét sau:
Nhận xét
Nhận xét 1: ta biết,
𝑑 ≡ 𝑒−1(𝑚𝑜𝑑 𝜑 𝑁 ),
với 𝜑 𝑁 = 𝑝 − 1 (𝑞 − 1).
Do p và q là các số nguyên tố lẻ, nên 𝜑(𝑁) là số chẵn. Hơn nữa,
gcd 𝑒, 𝜑 𝑁 = 1, nghĩa là e và (N) nguyên tố cùng nhau. Vậy e và d cùng là
số lẻ. Suy ra, 𝑒𝑑 − 1 = 2𝑠𝑡, với t là số lẻ. Vậy, 𝑒𝑑 − 1 ≡ 0 (𝑚𝑜𝑑 𝜑 𝑁 ) 4|𝜑 . Suy ra, 𝑠 ≥ 2. Như vậy, ∀𝑎 ∈ 𝑍𝑁∗, Đặt 𝑏0 ≡ 𝑎𝑡(𝑚𝑜𝑑 𝑁), 𝑏𝑖 ≡ 𝑎2𝑖𝑡 𝑚𝑜𝑑 𝑁 , ∀0 ≤ 𝑖 ≤ 𝑠,
Theo tiêu chuẩn Euler: ∀𝑥 ∈ 𝑍𝑁∗, 𝑥𝜑(𝑁) ≡ 1(𝑚𝑜𝑑 𝑁), ta có khả năng rất lớn tìm
84
Nhận xét 2: như trên ta thấy, cho e và d, ta cần tìm s và số lẻ t sao cho
𝑒𝑑 − 1 = 2𝑠𝑡. Ta có thể thực hiện nhanh việc tìm kiếm này chỉ thông qua phép
đếm như sau:
Gọi bkbk-1…b0 là biểu diễn nhị phân của ed – 1, giả sử ed – 1 = bk…bk-t+1bk-
t…b0, với bk-t = 1,bk-t =…= b0 = 0, thì s có biểu diễn nhị phân là bk…bk-t+1.
Thuật tốn
Phân tích N khi biết e và d Factor (n, e, d) {
//Tìm s, t sao cho ed − 1 = 2s t và t là số lẻ 1. s = 0; t = ed − 1;
2. while (t chẵn ) {s++; t/=2;}
// Tìm căn bậc hai không tầm thường của 1 (mod N)
do {
// Tìm căn ngẫu nhiên b of 1 (mod N) Chọn ngẫu nhiên a ∈ ZN*; b = at mod N; while (b ≢ 1 (mod N)) b = b2 mod N; } while (b ≢ ±1 (mod N)); // Phân tích N 3. p = gcd(b − 1, N); q = N/p; 4. return (p, q); } Ví dụ Giả sử N = 55, e = 3 và d = 27. (1) Ta có ed – 1 = 80 = 1010000 Suy ra s = 1012 = 5 và t = 5.
85
(2) Giả sử chọn được a = 2, ta tính được dãy số như sau:
b = at mod N = 25 mod 55 = 32 1; b = b2 mod N = 322 mod 55 = 34 1;
Do b = b2 mod N = 342 mod 55 = 1 1 nên thuật toán dừng ở bước trước với b = 34.
(3) Đặt p = gcd(34 – 1, 55) = 11, thì p = 55/11 = 5.
Như vậy, p = 11 và q = 5 là nhưng số nguyên tố cần tìm. Thực vậy, 55 = 115.
86