RSA算法原理(二)

2021-02-15 數學職業家

上一次,作者介紹了一些數論知識。

有了這些知識,我們就可以看懂RSA算法。這是目前地球上最重要的加密算法。


我們通過一個例子,來理解RSA算法。假設愛麗絲要與鮑勃進行加密通信,她該怎麼生成公鑰和私鑰呢?

愛麗絲選擇了61和53。(實際應用中,這兩個質數越大,就越難破解。)

愛麗絲就把61和53相乘。

n = 61×53 = 3233

n的長度就是密鑰長度。3233寫成二進位是110010100001,一共有12位,所以這個密鑰就是12位。實際應用中,RSA密鑰一般是1024位,重要場合則為2048位。

根據公式:

φ(n) = (p-1)(q-1)

愛麗絲算出φ(3233)等於60×52,即3120。

第四步,隨機選擇一個整數e,條件是1< e < φ(n),且e與φ(n) 互質。

愛麗絲就在1到3120之間,隨機選擇了17。(實際應用中,常常選擇65537。)

所謂"模反元素"就是指有一個整數d,可以使得ed被φ(n)除的餘數為1。

ed ≡ 1 (mod φ(n))

這個式子等價於

ed - 1 = kφ(n)

於是,找到模反元素d,實質上就是對下面這個二元一次方程求解。

ex + φ(n)y = 1

已知 e=17, φ(n)=3120,

17x + 3120y = 1

這個方程可以用"擴展歐幾裡得算法"求解,此處省略具體過程。總之,愛麗絲算出一組整數解為 (x,y)=(2753,-15),即 d=2753。

至此所有計算完成。

在愛麗絲的例子中,n=3233,e=17,d=2753,所以公鑰就是 (3233,17),私鑰就是(3233, 2753)。

實際應用中,公鑰和私鑰的數據都採用ASN.1格式表達(實例)。

回顧上面的密鑰生成步驟,一共出現六個數字:

p
q
n
φ(n)
e
d

這六個數字之中,公鑰用到了兩個(n和e),其餘四個數字都是不公開的。其中最關鍵的是d,因為n和d組成了私鑰,一旦d洩漏,就等於私鑰洩漏。

那麼,有無可能在已知n和e的情況下,推導出d?

(1)ed≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。

(2)φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。

(3)n=pq。只有將n因數分解,才能算出p和q。

結論:如果n可以被因數分解,d就可以算出,也就意味著私鑰被破解。

可是,大整數的因數分解,是一件非常困難的事情。目前,除了暴力破解,還沒有發現別的有效方法。維基百科這樣寫道:

" 對極大整數做因數分解的難度決定了RSA算法的可靠性。換言之,對一極大整數做因數分解愈困難,RSA算法愈可靠。

假如有人找到一種快速因數分解的算法,那麼RSA的可靠性就會極度下降。但找到這樣的算法的可能性是非常小的。今天只有短的RSA密鑰才可能被暴力破解。到2008年為止,世界上還沒有任何可靠的攻擊RSA算法的方式。

只要密鑰長度足夠長,用RSA加密的信息實際上是不能被解破的。"

舉例來說,你可以對3233進行因數分解(61×53),但是你沒法對下面這個整數進行因數分解。

12301866845301177551304949
58384962720772853569595334
79219732245215172640050726
36575187452021997864693899
56474942774063845925192557
32630345373154826850791702
61221429134616704292143116
02221240479274737794080665
351419597459856902143413

它等於這樣兩個質數的乘積:

33478071698956898786044169
84821269081770479498371376
85689124313889828837938780
02287614711652531743087737
814467999489
×
36746043666799590428244633
79962795263227915816434308
76426760322838157396665112
79233373417143396810270092
798736308917

事實上,這大概是人類已經分解的最大整數(232個十進位位,768個二進位位)。比它更大的因數分解,還沒有被報導過,因此目前被破解的最長RSA密鑰就是768位。

有了公鑰和密鑰,就能進行加密和解密了。

(1)加密要用公鑰 (n,e)

假設鮑勃要向愛麗絲髮送加密信息m,他就要用愛麗絲的公鑰 (n,e) 對m進行加密。這裡需要注意,m必須是整數(字符串可以取ascii值或unicode值),且m必須小於n。

所謂"加密",就是算出下式的c:

me ≡ c (mod n)

愛麗絲的公鑰是 (3233, 17),鮑勃的m假設是65,那麼可以算出下面的等式:

6517 ≡ 2790 (mod 3233)

於是,c等於2790,鮑勃就把2790發給了愛麗絲。

(2)解密要用私鑰(n,d)

愛麗絲拿到鮑勃發來的2790以後,就用自己的私鑰(3233, 2753) 進行解密。可以證明,下面的等式一定成立:

cd ≡ m (mod n)

也就是說,c的d次方除以n的餘數為m。現在,c等於2790,私鑰是(3233, 2753),那麼,愛麗絲算出

27902753 ≡ 65 (mod 3233)

因此,愛麗絲知道了鮑勃加密前的原文就是65。

至此,"加密--解密"的整個過程全部完成。

我們可以看到,如果不知道d,就沒有辦法從c求出m。而前面已經說過,要知道d就必須分解n,這是極難做到的,所以RSA算法保證了通信安全。

你可能會問,公鑰(n,e) 只能加密小於n的整數m,那麼如果要加密大於n的整數,該怎麼辦?有兩種解決方法:一種是把長信息分割成若干段短消息,每段分別加密;另一種是先選擇一種"對稱性加密算法"(比如DES),用這種算法的密鑰加密信息,再用RSA公鑰加密DES密鑰。

最後,我們來證明,為什麼用私鑰解密,一定可以正確地得到m。也就是證明下面這個式子:

cd ≡ m (mod n)

因為,根據加密規則

me ≡ c (mod n)

於是,c可以寫成下面的形式:

c = me - kn

將c代入要我們要證明的那個解密規則:

(me - kn)d ≡ m (mod n)

它等同於求證

med ≡ m (mod n)

由於

ed ≡ 1 (mod φ(n))

所以

ed = hφ(n)+1

將ed代入:

mhφ(n)+1 ≡ m (mod n)

接下來,分成兩種情況證明上面這個式子。

(1)m與n互質。

根據歐拉定理,此時

mφ(n) ≡ 1 (mod n)

得到

(mφ(n))h × m ≡ m (mod n)

原式得到證明。

(2)m與n不是互質關係

此時,由於n等於質數p和q的乘積,所以m必然等於kp或kq。

以 m = kp為例,考慮到這時k與q必然互質,則根據歐拉定理,下面的式子成立:

(kp)q-1 ≡ 1 (mod q)

進一步得到

[(kp)q-1]h(p-1) × kp ≡ kp (mod q)

(kp)ed ≡ kp (mod q)

將它改寫成下面的等式

(kp)ed = tq + kp

這時t必然能被p整除,即 t=t'p

(kp)ed = t'pq + kp

因為 m=kp,n=pq,所以

med ≡ m (mod n)

原式得到證明。

RSA算法原理(一)

文章來源:科學松鼠會

∑ 編輯 /豆汁

相關焦點

  • Golang 實現簡單的rsa加密算法
    Golang 實現簡單的rsa加密算法NOTE:
  • 基於RSA加密算法的隨機區塊鏈
    我們使用相同的值並且將RSA籤名應用在其中,這就是RSA算法的工作原理。 由於game id和RSA算法的結果是未知的,因此不可能操控其最終數值,並且猜測最終數值也變得毫無意義。# @return 1 ... 100 func GenerateRandInt (gameId,rsaSign) = { # verify RSA signature to proof random let rsaSigValid
  • RSA算法研究
    2、 中國剩餘理論(Chinese Remainder Theorem )中國有一本數學古書《孫子算經》有這樣的記載:「今有物,不知其數,三三數之,剩二,五五數之,剩三,七七數之,剩二,問物幾何?」答曰:「二十三」術曰:「三三數之剩二,置一百四十,五五數之剩三,置六十三,七七數之剩二,置三十,並之,得二百三十三,以二百一十減之,即得。凡三三數之剩一,則置七十,五五數之剩一,則置二十一,七七數之剩一,則置十五,即得。」
  • 銀行的動態口令令牌是什麼原理?
    有網銀的少年們一般都收到過銀行給的這樣一個令牌,俗稱動態口令,在支付的時候輸入自己的密碼和動態口令上的動態密碼,就能完成驗證,銀行就相信你不是壞人了,今天我們來簡述一下這個動態口令令牌是個什麼原理。 PS:本篇閱讀可能需要讀者有一些密碼學基礎,預警一下。
  • 記一次APP的java層算法逆向(七)
    CertificateException v0_2) { throw new EncryptException(((Throwable)v0_2)); } } return v0; }接著上面的內容繼續跟,通過如下幾句可以發現,其實 env則是aes加密某個內容之後的值,然後envKey則是通過rsa
  • 圖解- 立體視覺BM算法原理
    注意幾點:BM和SGBM算法對參數敏感,一定要耐心調節參數攝像頭一定要標定這些立體算法對光照敏感BM算法實現原理這種算法實現起來的優點就是快,缺點是深度圖的效果不是很好。BM算法只能對8為灰度圖像計算視差。
  • AlphaGo算法原理淺析
    圍棋界公認AlphaGo的圍棋能力已經遠遠超過了人類職業圍棋的頂尖水平了,那麼AlphaGo為什麼這麼厲害,它的算法原理是什麼呢,下面結合在網際網路上看到的一些文章,整理思路進行淺析。雖然贏了人類,但沒有智能,因為整個算法完全就是按人工設計的一個算法,體現不出智能之處。計算機下圍棋,理論上也是可以暴力破解的,但是問題就在於圍棋的可走的步子太多了,以至於按目前的計算性能根本做不到暴力破解。而另外一種方式,是使用蒙特卡洛樹搜索的方法,蒙特卡洛算法通過某種「實驗」的方法,得到一個隨機變量的估計,從而得到一個問題的解。
  • 常見 Hash 算法的原理
    SHA-1 設計時基於和MD4同樣原理,而且模仿了該算法。哈希表不可避免衝突(collision)現象:對不同的keyword可能得到同一哈希地址 即key1≠key2,而hash(key1)=hash(key2)。因此,在建造哈希表時不僅要設定一個好的哈希函數,並且要設定一種處理衝突的方法。
  • KNN算法原理及代碼實現
    如何選擇K值首先讓我們理解K值到底如何影響KNN算法。如果我們有很多藍色點和紅色點數據,使用不同K值,最終的分類效果大概如下圖。我們發現隨著K值的增大,分界面越來越平滑。一般在機器學習中我們要將數據集分為訓練集和測試集,用訓練集訓練模型,再用測試集評價模型效果。這裡我們繪製了不同k值下模型準確率。
  • 【算法】高頻彩票概率及賠率計算原理
    目前外圍的主要玩法有:1、猜定膽(即買名次)2、猜大小、單雙、龍虎3、猜冠亞和(即冠軍+亞軍相加數字總和)猜定膽:目前外圍給出的賠率是1賠9.6~9.8,即玩家下注1元冠軍開數字8,如中獎可得9.6元至9.8元。定膽的理論賠率是1:10;算法非常簡單,10個數字出現在冠軍位置的概率是1/10。
  • Cortex―M0單片機二-十進位整數轉換的快速算法
    摘要:為了提高Cortex—M0系列單片機應用系統的二進位到十進位BCD碼整數轉換代碼的執行效率,採用除十求餘數法來實現。該快速算法的核心內容是通過高效的彙編語言來實現常數除法,無論在程序代碼的運行時間和存儲空間上,都遠勝於sprintf函數。
  • AlphaGo Zero 強化學習算法原理深度分析
    下一篇中,我們將在已有的N子棋OpenAI Gym 環境中用Pytorch實現一個簡化版的AlphaGo Zero算法。這一篇,從原理上來解析AlphaGo Zero的運行方式。AlphaGo Zero 算法由三種元素構成:強化學習(RL)、深度學習(DL)和蒙特卡洛樹搜索(MCTS,Monte Carlo Tree Search)。
  • 程式設計師必須掌握的核心算法有哪些?
    二、基礎數據結構1、線性表列表(必學)鍊表(必學)跳躍表(知道原理,應用,最後自己實現一遍)二叉樹:各種遍歷(遞歸與非遞歸)(必學)哈夫曼樹與編碼(原理與應用)AVL樹(必學)B 樹與 B+ 樹(原理與應用)前綴樹(原理與應用)
  • AlphaGo基本原理:算法每個部分其實都是已有技術
  • 論算法的法律規制
    最後,本文對算法公開、個人數據賦權與反算法歧視的制度進行初步建構。二、算法的界定與可規制性在分析算法規制之前,需要先對算法進行界定。算法可作狹義界定,也可作廣義或中義界定。但現實是,算法黑箱的原理與國家機密或商業秘密的原理並不相同,算法黑箱是由算法的技術性特徵造成的,而非人為刻意保持造成的。在大數據與人工智慧時代,為了提高算法的準確性,算法的複雜性往往會加強,一個企業或網站的算法往往由數十上百甚至上千的工程師寫作完成,同時機器學習中的算法是經過訓練數據集而不斷進行調整優化而產生的,並非完全按照工程師編寫的代碼而產生。
  • AlphaGo 算法原理的本質
    二、模型和訓練2.1 向人類學習人類積累了大量的棋譜,展示了各種棋局如何落子的示例。這些可以作為訓練樣本。谷歌從圍棋對戰平臺KGS上獲得了人類選手的圍棋對弈棋譜,對於每一種棋局,都會有一個人類進行的落子,這也就是一個天然訓練樣本 ,如此可以得到3000萬個訓練樣本。谷歌的實驗結果表明,這個方法不夠好。
  • NMF的算法原理
    nmf更詳盡的原理可以參考維基百科:Non-negative matrix factorization。
  • 樂透彩算法
    樂透彩算法(二)返期分析返期:是我自己取的名稱,大家大多叫它遺漏,我認為不貼切,就改了個名字,大家先暫時接受這個名字。為什麼改,慢慢就知道了。返期定義:本號碼在前一次出現的期次離當前期的期數差。樂透彩算法(六)二碼分析二碼:就是對二個號碼組合進行分析。這是尋找號碼間關係的首要方法。雙色球紅區開出號共6個,可以組合成15個二碼,如果33個號碼組合共33*32/2=528對,這個比較多,不方便判斷,但對統計來說是必需的,特別是計算機運算時,必需要考慮這528個二碼。1、期內二碼分析。
  • 攻擊AI模型之DeepFool算法
    概述在前面文章《對抗樣本的基本原理》中,我們介紹了生成對抗樣本的基本思路,其中大體思路分為白盒攻擊和黑盒攻擊,區別在於黑盒測試把模型當做黑盒,只能輸入樣本獲得預測結果,白盒在黑盒的基礎上還可以獲取模型的參數、梯度等信息。本文將介紹白盒攻擊中鼎鼎大名的DeepFool算法。