# RSA 公鑰加密算法

Blai
Blai

終端之間信息傳遞安全性的保證始終是業務的剛性需求。不一樣的加密算法針對不一樣的業務需求,
由於公司是金融公司性質,又不是傳統的金融公司(PS:牽扯到數字貨幣、常據說的好比:比特幣),加密算法這塊也算是有一部分的瞭解。算法

這裏要講的內容如 標題😄數組

數字簽名

  • 數字簽名就是相似紙質文件上的手寫簽名的電子版。任何人均可以輕鬆地覈對簽名,不能僞造它是其存在的根本目的。
  • 數字簽名能夠爲簽名者身份和其簽署的信息內容提供證實。
  • 對於電子簽署的商業性合同,電子支票,電子購貨單和其餘一些各方但願進行認證的電子信息來講是一種理想的解決方案。

素數

在密碼學中須要找到最大的隨機素數是必須的。大素數不少,一般測試適當的隨機整數,知道找到素數的過程是可行的。
素數的分佈函數 π(n): 描述了小於或等於n的素數的數目
素數定理給了 π(n) 一個有用近似:安全

$$ \lim_{n \to +\infty} \frac{π(n)}{n/(\ln n)} \quad = 1 $$
函數

e.g:區塊鏈

n = 10^9 時其偏差不超過 6% 其:π(n)=508,475,34,且 n/ln * n≈ 482,549,42測試

伯努利實驗加密

RSA基於素數原理:尋求大素數是很容易的,把一個數分解成兩個最大素數的積卻至關的困難code

公鑰加密


公鑰加密,顧名思義有一把 公鑰私鑰
在 RSA 加密算法中,每個祕鑰由一對整數組成。在密碼學中常以 AliceBob 做爲例子,這也是每當有人普及比特幣相關的技術的時候頻率出現較多的名詞。cdn


如圖:用 $P_A$ 表示 Alice 公鑰,$S_A$ 表示 Alice 私鑰
同理:

如圖:用 $P_B$ 表示 Bob 公鑰,$S_B$ 表示 Bob 私鑰

祕鑰須要保密,公鑰能夠對任何人透露,這個跟比特幣地址是同樣的。
公鑰和祕鑰指定了可用於任何信息的函數。設 $\mathfrak{D}$ 表示容許的信息集合。其多是因此有限長度的位序列的集合。blog

在最原始的公鑰加密設想中,要求公鑰與祕鑰指定一種從 $\mathfrak{D}$ 到其自身的一一對應的函數。對應 Alice 的公鑰 $P_A$ 的函數用 $P_A()$ 表示,他的祕鑰 $S_A$ 的函數表示成 $S_A()$, 所以 $P_A()$ 與 $S_A()$ 函數都是 $\mathfrak{D}$ 的排列。架設已知祕鑰 $P_A$ 或 $S_A$,能夠有效的計算出函數 $P_A()$ 和 $S_A()$

系統中任何參與者的公鑰和祕鑰都是一個「匹配對」,它們指定的函數互爲反函數,也就是說,對於任何消息 $M\in\mathfrak{D} $ 有:
$$ M = S_A(P_A(M)) \ M = P_A(S_A(M)) $$

由此能夠看出,運用兩把祕鑰 $P_A$ 和 $S_A$ 對 $M$ 相繼進行變換後,最後任然獲得消息 $M$

故在應用程序中:要求除了 Alice 外,沒人能在較實用的時間內計算出函數 $S_A()$。 對於送給 Alice 加密郵件的保密性與 Alice 的數字簽名的有效性。

由於$P_A$是公開的,就好比 數字貨幣的地址,這樣就能夠計算出 $P_A()$ 它也是 $S_A()$ 的反函數,這個時候就要保證只有 Alice 可以計算出 $S_A()$ 。

模擬一個發送環境:

如上圖: BobAlice 發送一條加密的消息 Message,竊取着獲得的是一串亂碼。

  1. Bob 獲得 Alice 的公鑰 $P_A$
  2. Bob 計算出對應的 M 的密文 $C=P_A(M)$,並把 C發送給 Alice
  3. Alice 獲得密文 C 以後,運用本身的祕鑰 $S_A$ 恢復原始信息: $S_A(C)=S_A(P_A(M))=M$.

因爲 $S_A()$ 和 $P_A()$ 互爲反函數,因此 Alice 可以根據 C 計算出 M。由於只有 Alice 可以計算出 $S_A()$, 因此也只有 Alice 能根據 C計算出 M。由於 Bob 運用 $P_A$ 對M進行加密,因此只有 Alice 能夠理解接收的消息。

用相似的公鑰系統的設想能夠很容易的實現數字簽名,如今 Alice 但願把一個數字簽署的答覆 M^' 發送給 Bob

在公鑰的數字簽名中, Alice 將她的數字簽名 $\sigma = S_A(M')$ 附加到消息 M‘上,來對消息 M’ 簽名。她將消息/簽名對 $(M', \sigma)$ 發送給 Bob,Bob 經過檢查等式 $M’ = P_A(\sigma)$ 來驗證它。若是等式成立,則他接受 $(M',\sigma)$ 做爲 Alice 已經簽名的一個消息

  1. Alice 運用她的祕鑰 $S_A$ 和等式 $\sigma = S_A(M')$ 計算出信息 M’ 的數字簽名 $\sigma$.
  2. Alice 把消息/簽名對 $(M', \sigma)$ 發送給 Bob.
  3. 當 Bob 收到 $(M', \sigma)$ 時,他能夠利用 Alice 的公鑰,經過驗證等式 $M’ = P_A(\sigma)$ 來證明該消息的確是來自 Alice.

    若是 M’ 包含 Alice 的名字,這樣 Bob 就知道應該使用誰的公鑰。
    由上圖中的驗證能夠看到,若是符合 Bob 能夠得出消息 M‘ 確實是 Alice 簽名的結論。若是不成立,那麼 Bob 就能夠得出一個結果: 要麼就是信息 M‘或數字簽名 $\sigma$ 因傳輸錯誤而損壞,要麼信息對 $(M',\sigma)$ 是一個故意的僞造。

由於一個數字簽名既證實了簽署者身份,也證實了簽署的信息內容,因此它是對文件末尾的手寫簽名的一種模擬。

數字簽名必須能夠被能取得簽署者公鑰的人去驗證,一條所簽署過的信息能夠被確認方確後再傳送到其餘能夠驗證簽名的各方。

好比我給你的一個比特幣其實就是一個簽名的過程,只是比特幣採用的是屢次簽名加密技術,比這個要複雜許多(作區塊鏈開發的人可能見笑了),其原理是怎樣的呢?密碼學中一個通俗的例子:
AliceBob 的一張電子支票,Bob 確認了支票上 Alice 的簽名後,就能夠把這張支票交送給銀行,而銀行也能夠對簽名進行一個驗證,而後就能夠調撥相應的資金。

上面講到的是簽署的信息是沒有加密的,該信息是公開透明的,好比比特幣交易的過程當中是公開透明,該行爲會向全網進行一個廣播,同而使各個節點都能同步到該交易事件。

而咱們這裏要說的反而偏偏相反,咱們要把信息進行一個加密,怎樣去加密呢?就是把有關加密和簽名的兩種方案結合起來使用,就能夠建立出同時被簽署和加密的消息,簽署者首先把其數字簽名附加在消息的後面,而後再用他預約的接受者的公鑰對最終的消息/簽名對進行加密。接收者用其密鑰對收到的消息進行解密,以同時得到原始消息和數字簽名。而後接收者能夠用簽署者的公鑰對簽名進行驗證。頗有意思!

RSA加密系統

公鑰私鑰建立過程

1.隨機選出最大素數 $\mathcal{P}$ 和 $\mathcal{q}$, 使得 $\mathcal{P}\not=\mathcal{q}$ e.g:素數 $\mathcal{P}$ 和$\mathcal{q}$ 可能各有 1024 位。
2.計算 $n=\mathcal{P} \mathcal{q}$
3.選取一個與 $\phi(n)$互質的最小奇數 e,其中由等式 $\phi(n)$ 等於 ($\mathcal{P}-1$)($\mathcal{q}-1$)
4.對模 $\phi(n)$, 計算出 e 的乘法逆元 d 值。
5.將對 $P=(e,n)$ 公開,並做爲參與者的 RSA 公鑰
6.使對 $S=(d,n)$ 保密,並做爲參與者的 RSA祕鑰

設 $D$ 爲集合 $Z_n$.爲了變換與公鑰 $P=(e,n)$ 相關的消息 $M$, 計算 $$P(M) = M^e\mod n$$
這個時候變換與祕鑰 $S =(d,n)$ 相關的密文 C,計算 $$S(C)=C^d \mod n$$

上面所看到的等式對加密與簽名是通用的。爲了建立一個簽名,簽署人把其祕鑰應用於待簽署的消息,而不是密文中。爲了確認簽名,將簽署人的公鑰應用在簽名中,而並不是在加密的消息中。

用模的求冪過程,來對公鑰與祕鑰的一些操做。
咱們設公鑰(e,n)和祕鑰(d,n)知足 $\lg e = O(1)$, $\lg d \leq \beta$, 且 $\lg n \leq \beta$.
而後,應用公鑰須要執行 $O(1)$ 次模乘法運算和 $O(\beta^2)$ 次位操做。 應用祕鑰須要執行 $O(\beta)$ 次模乘法運算 $O(\beta^3)$ 次位操做。

RSA安全性保證

RSA加密的安全性主要來源於對最大整數進行因式分解的困難性。若是對方對公鑰中的模 n 進行分解,就能夠根據公鑰推導出祕鑰,主要是由於對方和公鑰建立者以一樣的方法使用因子 $\mathcal{P}$ 和 $\mathcal{q}$ .故若是可以分解大整數,就能夠輕易破解 RSA 加密算法。

這樣來說:對RSA加密系統的破解難易程度取決於分解最大整數的困難度。

在計算機發展的歷史中至今尚未發行比分解模 n 更容易的方法來打破 RSA加密。

經過隨機選取兩個 1024 位的素數並求出它們的積,就能夠建立出一把用如今技術在可行時間內破解的公鑰。也就是說在算法的發展史上沒有取得新的突破性進展的時候,RSA 加密算法是一種安全方面的保證。

基於上面論述的原理,在實際的實現過程當中 選取的位素數一般在 768到 2048 位。由此就須要可以有效的找出最大素數。

在實際的應用當中爲了提升效率,最長使用的是一種 祕鑰管理 模式的RSA,來實現快速無公鑰加密系統。在這樣的一個系統中,加密祕鑰與解密祕鑰是同一個。

e.g:
Alice 把一條長消息 M 發送給 Bob, 她從快速無公鑰加密系統中選取一把隨機祕鑰 K,而後運用 K 對 M進行加密,獲得密文 C。這個時候 C的長度與 M同樣長,可是 K至關短。在一步, Alice 利用 Bob的公開 RSA祕鑰對 K進行加密。 由於 K 很短,因此計算 $P_B(K)$ 的速度也很快。$t_1 = P_B(K)的計算時間$,$t_2 = P_B(M)的計算時間$, 有: $t_1 > t_2$.
最後 Alice 把 $(C,P_B(K))$ 傳送給 Bob, Bob對 $P_B(K)$ 解密獲得 K,而後在用 K 對 C 進行解密,獲得 M。

經過上面例子瞭解到:使用一種混合的方法來提升數字簽名的執行效率。

把 RSA 與一個公開的 抗衝突散列算法 h 結合。 使用該函數的目的就是找出兩條消息 M和M',有 h(M)=h(M').
h(M)的值是消息M的一個短 「指紋」 的一個概念。
若是 Alice 簽署消息 M,她第一步要作的就是把函數 h 做用於 M獲得的指紋h(M),而後用她的祕鑰加密h(M). Alice 將 $(M,S_A(h(M)))$ 做爲她簽署的 M 的版本發送給 Bob. Bob 能夠經過計算 h(M),並將 $P_A$ 應用於收到的 $P_A(h(M))$ 驗證其是否等於h(M)來驗證簽名的真實性。
原理:沒有人可以同時建立出兩條具備相同指紋的消息,因此在計算機上不可能改變簽署的消息,又保持了簽名的合法性。

因此利用證書能夠輕鬆地分配公鑰。
e.g:
在公網中有一個 T,每一個人都知道其 公鑰。 Alice 從T獲得一條簽署的證書,聲明 「Alice」 的公鑰是 $P_A$. 因爲每一個人都知道 $P_T$,該證書是 「自我認證」。 Alice 能夠把本身的證書含在簽名信息當中,使得接受者能夠當即獲得 Alice 的公鑰,來驗證其簽名。由於 Alice 的祕鑰是被 T 簽署的,因此接收者知道 Alice 的祕鑰確實是 Alice 本人的祕鑰。

若是你看到這路以爲公式看着彆扭,我也無能爲力( ⊙ o ⊙ )!,掘金的富文本還有待增強!!!

相關文章
相關標籤/搜索