Khi nói đến độ dài khóa của một khóa RSA là nói đến 𝑚𝑜𝑑𝑢𝑙𝑜 𝑛 theo bit. Độ dài khóa được đề nghị nhỏ nhất cho một RSA an toàn hiện nay là 1024 bit. Để thực hiện các phép tính trên các số lớn như vậy đòi hỏi phải sử dụng các thuật toán tính toán hiệu quả do các thao tác chính phải thực hiện trong RSA chính là các phép lũy thừa
𝑚𝑜𝑑𝑢𝑙𝑜, phép tính có chi phí rất cao.
Một phương pháp hiệu quả rất thường được sử dụng để thực hiện phép tính lũy thừa
𝑚𝑜𝑑𝑢𝑙𝑜 trên máy tính là thuật toán nhị phân [2, tr. 40]. Để tính 𝑦 = 𝑥𝑒 𝑚𝑜𝑑 𝑛, ta triển khai 𝑦 dưới dạng cơ số 2:
𝑒 = 𝑒020 + 𝑒121 + 𝑒222+ ⋯ + 𝑒𝐼2𝐼 = 𝑒𝑖2𝑖 𝐼
Như vậy, 𝑦 = 𝑥𝑒 𝑚𝑜𝑑 𝑛 = 𝑥 𝑒0 𝑥2 𝑒1 𝑥4 𝑒2… 𝑥2𝑖 𝑒𝑖.
Dễ dàng nhận thấy, 𝑒𝑖 (𝑖 = 0, 1, … , 𝐼 với 𝐼 là chiều theo bit của biểu diễn nhị phân của 𝑒) có giá trị 0 hoặc 1 nên khi 𝑒𝑖 = 0 thì 𝑥2𝑖 𝑒𝑖 = 1 không làm thay đổi kết quả tổng thể còn 𝑒𝑖 = 1 thì 𝑥2𝑖 𝑒𝑖 = 𝑥2𝑖 ta sẽ nhân kết quả trước cho giá trị này.
Hơn nữa giá trị 𝑥2𝑖 có thể tính bằng 𝑥2𝑖−1 2, tức là chỉ bình phương số trước đó là ta có ngay kết quả mà không cần phải tính toán lại.
ModPowBinary(x, e, n)
Đầu vào: số nguyên 𝑥 > 0, số mũ nguyên 𝑒 ≥ 0, số nguyên 𝑛 > 0
Đầu ra: giá trị 𝑥𝑒 𝑚𝑜𝑑 𝑛
(1) 𝑦 = 1 (2) Nếu𝑒 = 0thì trả về 𝑦 (2) 𝐴 ← 𝑥 (4) Nếu𝑒0 = 0thì𝑦 ← 𝑥 (5) Với mỗi𝑖 = 1 → 𝐼 (5.1) 𝐴 ← 𝐴2 𝑚𝑜𝑑 𝑛 (5.2) Nếu𝑒𝑖 = 1thì𝑦 ← 𝐴 ∗ 𝑦 𝑚𝑜𝑑 𝑛 (6) Trả về 𝑦
Thuật toán 6.1. Tính lũy thừa modulo bằng thuật toán nhị phân
Thời gian thực hiện phép lũy thừa 𝑚𝑜𝑑𝑢𝑙𝑜 𝑐 = 𝑚𝑒 𝑚𝑜𝑑 𝑛 tăng theo số lượng bit 1 trong số mũ 𝑒. Với việc mã hóa, lựa chọn thích hợp của 𝑒 có thể làm giảm chi phí tính toán. Những giá trị phổ biến được chọn là 3, 17, 65537 là các số nguyên chỉ có duy nhất 2 bit được bật là 3 = 112, 17 = 1116, 65537 = 1000116. Các số này cũng được biết đến như là các số nguyên tố Fermat17
.
Tuy nhiên, các bit trong lũy thừa giải mã 𝑑 không thuận lợi và do đó giải mã sử dụng phương pháp chuẩn của phép lũy thừa 𝑚𝑜𝑑𝑢𝑙𝑜 như trên sẽ chậm hơn nhiều so với mã hóa. Lưu ý, không được chọn giá trị 𝑑 nhỏ nhằm giảm thời gian giải mã bởi vì chúng không an toàn (đã được trình bày ở mục 5.2.5).
17
Số nguyên tố Fermat là các số có dạng 𝐹 𝑥 = 22𝑥
Một phương pháp hiệu quả hơn là sử dụng định lý số dư Trung Hoa (Chinese Remainder Theorem – CRT) để tính lũy thừa 𝑚𝑜𝑑𝑢𝑙𝑜 𝑥𝑑 𝑚𝑜𝑑 𝑝𝑞 với 𝑝, 𝑞 là các số nguyên tố [2]. Điều này hoàn toàn thực hiện được bởi người giải mã do người này có khóa bí mật 𝑑 và các số nguyên tố 𝑝, 𝑞.
Cho 𝑚1, 𝑚2, …, 𝑚2 là các số nguyên, đôi một nguyên tố cùng nhau. Đặt 𝑚 = 𝑚1𝑚2… 𝑚𝑛. Theo định lý số dư Trung Hoa, ta có kết quả sau:
𝑓 ∶ ℤ𝑚 → ℤ𝑚1 × ℤ𝑚2 × … × ℤ𝑚𝑛
𝑓 𝑥 = 𝑥 𝑚𝑜𝑑 𝑚1, 𝑥 𝑚𝑜𝑑 𝑚2, … , 𝑥 𝑚𝑜𝑑 𝑚𝑛 là song ánh.
Như vậy, để tính 𝑥𝑑 𝑚𝑜𝑑 𝑚, 𝑚 = 𝑚1𝑚2… 𝑚𝑛 với 𝑚1, 𝑚2, … , 𝑚𝑛 là các số nguyên đôi một nguyên tố cùng nhau, ta có thể tính (𝑥𝑑 𝑚𝑜𝑑 𝑚1, 𝑥𝑑 𝑚𝑜𝑑 𝑚2, …,
𝑥𝑑 𝑚𝑜𝑑 𝑚𝑛).
Cụ thể, để thực hiện phép tính 𝑥𝑑 𝑚𝑜𝑑 𝑝𝑞, ta thực hiện như sau: Đặt 𝑑1 = 𝑑 𝑚𝑜𝑑 (𝑝 – 1) và 𝑑2 = 𝑑 𝑚𝑜𝑑 (𝑞 – 1)
Tồn tại số nguyên 𝑛1, 𝑛2 sao cho:
𝑑 = 𝑑1 + 𝑛1 𝑝 − 1 = 𝑑2 + 𝑛2 𝑞 − 1
Vậy:
𝑥𝑑 𝑚𝑜𝑑 𝑝 = 𝑥𝑑1 𝑚𝑜𝑑 𝑝 𝑥𝑝−1 𝑚𝑜𝑑 𝑝 𝑛1
Theo định lý Fermat nhỏ, ta có 𝑥𝑝−1 𝑚𝑜𝑑 𝑝 = 1, vậy:
𝑥𝑑 𝑚𝑜𝑑 𝑝 = 𝑥𝑑1 𝑚𝑜𝑑 𝑝
Tương tự ta có:
𝑥𝑑 𝑚𝑜𝑑 𝑞 = 𝑥𝑑2 𝑚𝑜𝑑 𝑞
Như vậy, tính 𝑥𝑑 𝑚𝑜𝑑 𝑞𝑝 được đưa về tính:
𝑥𝑑1 𝑚𝑜𝑑 𝑝 = 𝑥1𝑑1 𝑚𝑜𝑑 𝑝 𝑣ớ𝑖 𝑥1 = 𝑥 𝑚𝑜𝑑 𝑝 𝑥𝑑2 𝑚𝑜𝑑 𝑞 = 𝑥2𝑑2 𝑚𝑜𝑑 𝑞 𝑣ớ𝑖 𝑥2 = 𝑥 𝑚𝑜𝑑 𝑞
Từ các lập luận trên, ta có thuật toán sau để tính nhanh 𝑚 = 𝑐𝑑 𝑚𝑜𝑑 𝑝𝑞 với 𝑑, 𝑝, 𝑞
ModPowCRT(x, d, p, q)
Đầu vào: số nguyên 𝑥 > 0, số mũ nguyên 𝑑 ≥ 0, hai số nguyên tố 𝑝 và 𝑞 với 𝑝 > 𝑞
Đầu ra: giá trị 𝑥𝑑 𝑚𝑜𝑑 𝑝𝑞
(1) 𝑑𝑃 ← 𝑑 𝑚𝑜𝑑 𝑝 − 1 . (2) 𝑑𝑄 ← 𝑑 𝑚𝑜𝑑 𝑞 − 1 . (3) 𝑞𝐼𝑛𝑣 ← 𝑞−1 𝑚𝑜𝑑 𝑝. (4) 𝑐1 ← 𝑐 𝑚𝑜𝑑 𝑝. (5) 𝑐2 ← 𝑐 𝑚𝑜𝑑 𝑞. (6) 𝑚1 ← 𝑐1𝑑𝑃 𝑚𝑜𝑑 𝑝. (7) 𝑚2 ← 𝑐2𝑑𝑄 𝑚𝑜𝑑 𝑞. (8) ← 𝑞𝐼𝑛𝑣(𝑚1 – 𝑚2) 𝑚𝑜𝑑 𝑝. (9) 𝑚 ← 𝑚2 + 𝑞. (10) Trả về 𝑚.
Thuật toán 6.2. Tính lũy thừa modulo bằng thuật toán sử dụng định lý số dư Trung Hoa
Để không mất thời gian tính toán lại, bước (1), (2) và (3) có thể được tính trước và lưu trữ cùng với 𝑝 và 𝑞 như là khóa bí mật, nghĩa là khóa bí mật được đại diện như là một bộ năm (𝑝, 𝑞, 𝑑𝑃, 𝑑𝑄 𝑣à 𝑞𝐼𝑛𝑣), trong đó 𝑝 và 𝑞 là các thừa số nguyên tố của 𝑛,
𝑑𝑃 và 𝑑𝑄 được biết đến như là lũy thừa CRT và 𝑞𝐼𝑛𝑣 là hệ số CRT. Mặc dù có nhiều bước hơn trong thủ tục nhưng lũy thừa 𝑚𝑜𝑑𝑢𝑙𝑜 trong phương pháp này được thực hiện với các số mũ ngắn hơn và do đó trên tổng thể ít chi phí hơn. Thực nghiệm cho thấy phương pháp CRT trong giải mã nhanh hơn gần 9 lần trên tổng thể so với phương pháp nhị phân khi tính 𝑚 = 𝑐𝑑 𝑚𝑜𝑑 𝑛 (sẽ được trình bày ở Chương 7). Các kỹ thuật nhân nhanh như các phương pháp dựa trên biến đổi 𝐹𝑜𝑢𝑟𝑖𝑒𝑟 nhanh (Fast Fourier Transform – FFT) ít được sử dụng do phức tạp trong cài đặt và đôi khi chúng chậm hơn các thuật toán trên đối với một số kích thước khóa đặc trưng.