RSA系列——大質數找尋

RSA的安全性關鍵在於大整數的分解是十分困難的。本節將討論大質數的尋找辦法。

根據素數定理:pi(n)sim frac{n}{lnn} 。隨機一個數n,它是質數的概率是frac{1}{lnn}(此結論存疑,真實值應該是比這要高的,但足夠了)。

上一章提到過費馬小定理,根據其逆否命題,有:若正整數a,n滿足a<na^{n-1}notequiv1 ,則n是合數。但很遺憾此命題的否命題並不成立。數論上存在「偽素數」的概念:若a^{n-1}equiv 1(mod n)n為合數,則稱n是一個基於a的偽素數。研究表明,即使是只取基數a=2,檢驗結果的正確率也是很可觀的。但如果要追求完美,想要通過改變基數進行多次檢驗來提高正確率,會有一種叫做卡邁克爾(Carmichael)數的數讓人感到十分尷尬。若n是卡邁克爾數,對於任意與n互質的aa^{n-1}equiv1(mod n)(雖說對於與n不互質的a是可以檢測出來的,但若n是大質數的乘積,varphi(n)幾乎是與n處於相同數量級的)。

令人慶幸的是,只需要一個小引理便可以對抗卡邁克爾數:若p為質數,則同餘方程x^2equiv1(mod p)在模p意義下只有兩解xequivpm 1(mod n)。能看懂之前內容的讀者應該很容易就能對此進行證明(不過事實上,若p是奇素數,egeq 1,上述引理對於模p^e也成立)。

同餘方程x^2equiv1(mod n)xequivpm 1(mod n)的任何根稱為n為模的1的非平凡平方根。根據上述引理的逆否命題,得推論:若n存在以n為模的1的非平凡平方根,則n是合數。它的否命題不成立,但若n不是質數或質數的冪就成立了。證明也很簡單。

有了這些事實,我們便可以開始敘述著名的Miller-Rabin演算法(以下簡稱MR)了。注意:偽素數測試並不是MR(筆者身邊有人犯過把偽素數測試當作MR的錯誤)

MR較偽素數測試區別是,MR增加了非平凡平方根的檢驗因此當選定了基數a之後,在計算a^{n-1} mod n時,需要稍微改變快速冪的演算法。令n-1=u2^t,其中u為奇數那麼a^{n-1}=(a^u)^{2^t},那麼只需先算出a^u mod n的值,再將其連續平方t次,在此過程中檢驗非平凡平方根即可。

顯然MR是可能出錯的。若我們把可以證明n為合數的基數a稱為一個「證據」,可以證明,隨機得到一個是證據的基數的概率不小於frac{1}{2}。也就是說,隨機選取s個基數進行驗證,出錯概率至多為2^{-s}。事實上這個概率還可以進行優化,且可以通過構造n的方法增加證據的數量。由於所用的界已經足夠了,在此不再贅述。畢竟,經過人們的計算,即便是上述最簡單的MR,取s=50個基數進行驗證時,若返回結果為n為質數,已足夠令人信服了。

至此算導搬運工作已結束。下次將進入RSA的另一個方面。


推薦閱讀:

用密碼學玩暗軍棋 -- 閑聊多方計算
為什麼 Touch ID 存儲在本地的指紋信息可以用來驗證 Apple ID,是否存在安全隱患?
如何看待微軟發布的一個87K的庫帶了約760M測試數據?
中國五大銀行的加密方式主要用的什麼方式?
如何理解"語義安全(semantic security)"?

TAG:计算机科学 | 数学 | 密码学 |