c 實現rsa演算法 RSA 演算法 基本原理篇

2021-10-13 18:35:41 字數 2949 閱讀 5936

咱們每天說非對稱加密,說公鑰私鑰,但是公鑰和私鑰到底是怎麼產生的,加密和解密過程到底是怎麼樣的,不看看具體演算法實現還真是感覺心裡沒底。rsa 演算法是非對稱加密演算法鼻祖,至今仍然是最為廣泛使用的演算法之一,所以我們就來拆解一下 rsa 演算法本身。

學東西最怕的就是沒有大思路,直接深入細節。所以開始之前,我們先巨集觀上討論一下 rsa 演算法到底是用來幹嘛的?總體的實現思路又是怎樣的呢?

說到最底層,rsa 演算法的作用非常簡單,就是生成公鑰和私鑰的。公鑰用於加密資訊,私鑰用來解密,先上鎖,後開鎖。alice 自己先買一把鎖,然後把鎖頭髮送給 bob ,注意 bob 給資訊上鎖的時候,肯定是不需要鑰匙的,上了鎖的資訊傳送給 alice 之後,alice 就可以用鑰匙開啟鎖,拿到資訊。鎖和開鎖明顯是兩個不同的過程,沒有必要讓鑰匙參與到上鎖過程中,這個就是非對稱加密的的思想源頭了。上鎖的時候,bob 只需要公鑰,而 alice 開鎖的時候才需要私鑰。所以公鑰就是加密 key ,私鑰就是解密 key 。實現加密和解密的第一步就是找到乙個函式,函式的正向運算很容易,但是逆向運算很難。對應 rsa 的情況,也就是把公鑰和資訊作為引數進行運算,得到密文,這個過程要很容易,而逆向運算,由密文和公鑰想要獲得資訊,是很難做到的。

當然,這個函式還必須有另外乙個特點。就是逆向操作雖然預設很難做到的,但是如果擁有了特定的提示資訊,操作就變得非常容易了。這裡的提示資訊,顯然就是私鑰。

總之,找到這樣乙個正向容易運算,反向預設很難,但是如果有了私鑰就很容易運算的函式,就是實現 rsa 演算法的核心思路。

下面我們就來看看 rsa 演算法具體的實現方式。

先來補充乙個數學知識:取模運算。取模運算其實就是算餘數。例如 3 mod 2 的結果就是1,mod 就是取模的意思。

rsa 使用的單向函式是這樣的,拿出要加密的資訊 m ,我們知道任何的計算機資訊都能轉換成二進位制數,所以當然也能轉換成十進位制的乙個整數。這裡 m 是乙個整數,接下來隨機選擇乙個 e ,來作為 m 的指數。注意,這裡的指數 e 的選擇範圍是有一定限制的,但是在這個範圍內是任意選擇的。接下來,進行 m 的 e 次方運算,然後對另乙個隨機選取整數 n 進行取模運算,最後得到的結果就是密文,用 c 表示 。舉個例子,m 等於7 ,e 選擇為2 ,n 選擇23,這樣,最後的密文 c 就等於49對23取模,結果是6。也就是說7經過加密,最後密文是6。這個運算有個特點,給定 m 和 e 以及 n 的值,很容易算出 c ,但是給定 c 和 e 以及 n 很難算出 m 來。這就是我們需要的單向函式。

於是,我們的鎖就有了,也就是 」e 次方然後對 n 取模「。那麼,開這把鎖的鑰匙是什麼呢?簡單來說,就是讓逆向運算過程變得簡單的資訊。

逆向運算,就是從密文得到資訊。經過數學推導,可以得到這樣的逆向運算過程,一定存在乙個整數 d ,使得 c 的 d 次方對 n 取模,是可以得到 m 的。最終,e 和 n 按照一定規範組合到一起,就是公鑰,而 d 和 n 組合到一起就是私鑰。

總之,rsa 演算法的單向函式找到了,於是加密用的鎖也就找到了。但是其實這個函式本身不是 rsa 演算法最複雜的地方,最複雜的內容在於如何由 e 算出 d 。而如何給定 e ,算出合適的 d ,其實是要引入第二個單向運算了,這就是整數分解問題了。

如何運算出 d 的過程本節不展開。粗略來講,從 e 運算出 d 的過程,涉及到 n 的整數分解問題。整個 rsa 演算法的安全性就取決於整數分解這個基本數學問題。

來解釋一下整數分解問題。整數分解就是把乙個數分解成多個素數的乘積。素數就是那些只能被1和自己整除的整數,這個小時候咱們學過的。例如 45 可以分解成 3x3x5 。而 rsa 演算法中的整數分解有一定的特殊性。被分解的數需要是兩個,而不是多個素數的乘積。雖然由兩個素數相乘獲得結果非常簡單,但是反過來,分解過程是很難的。很難的意思就是如果數足夠大,即使用計算機也需要成千上萬年才能算出來的問題,或者可以說「很難」就等於」實際中不能實現「。而這一點就是 rsa 演算法的安全基石。如果有一天,有數學家找出整數分解的有效運算方法,那麼 rsa 演算法也就不能用了。

實際生成公鑰和私鑰的過程是,我們選出 p1 和 p2 兩個大素數,讓 n = p1 * p2 。隨機選擇乙個指數 e ,這樣公鑰就有了。而在知道 p1 和 p2 的前提下,從公鑰算出私鑰,也就是算出 d ,是非常容易的。而外人,因為不知道 p1 和 p2 ,而只知道 n ,所以不可能從 e 算出 d ,也就是不可能用公鑰算出私鑰。

總之只要整數分解問題無解,那麼 rsa 就是安全的。

這就是 rsa 演算法的工作原理了。巨集觀上的思路就是,要找到乙個包含取模運算的單向函式,保證資訊加密容易,而反向解密很難。另外,還要找到第二個單向函式,也就是整數分解問題的函式,保證在知道分解結果的條件下,從公鑰算出私鑰是容易的,而如果不知道,就不可能算出私鑰。真正的 rsa 演算法,是這兩個單向函式的綜合使用。但是對於如何進行解密,公鑰和私鑰生成的細節,我們沒有展開,因為這涉及到更多的數學推導,下個小節 peter 再給大家介紹。

參考:

filcloud 幫你迅速了解 ipfs 領域的熱點技術和應用

c 實現rsa演算法 RSA演算法實現過程

rsa演算法是實現非對稱加密的一種演算法,其用到很多有關數論的內容,在此我們不多討論。而將目光聚焦於演算法的實現過程。rsa過程 第二步 計算n a b 61 53 3233 第三步 計算 a 1 b 1 60 52 3120 第四步 選擇與3120互質的乙個數e 17,這個e也就是我們的公鑰,需要...

RSA演算法實現

設計說明 rsa演算法為一種非對稱密碼演算法,選取兩個互異大素數p,q,計算n pq,f p 1 q 1 選取不同於q,p的另一素數e並計算在模f下的乘法逆元d,若明文為m,即可根據加密演算法c me mod n進行加密編碼,解密時使用m cd mod n即可。e也稱為加密指數,d被稱為解密指數。以...

RSA演算法基本原理(RSA加密和RSA數字簽名)

引言 rsa演算法是一種很經典的非對稱性演算法,所謂的非對稱性加密即指的是任何乙個人都有兩個金鑰,乙個公鑰 別人可以知道 乙個私鑰 只有自己知道 非對稱性加密在能保證資訊保安的前提下,相比於對稱性加密能極大地縮小資訊加密的成本,同時在快捷和實用性上有著極大的便利 rsa演算法 rsa演算法中有兩對金...