終端之間信息傳遞安全性的保證始終是業(yè)務的剛性需求架专。不同的加密算法針對不同的業(yè)務需求,
因為公司是金融公司性質,又不是傳統(tǒng)的金融公司(PS:
牽扯到數(shù)字貨幣、常聽說的比如:比特幣)贺喝,加密算法這塊也算是有一部分的了解。
這里要講的內容如 標題??
數(shù)字簽名
- 數(shù)字簽名就是類似紙質文件上的手寫簽名的電子版宗兼。任何人都可以輕松地核對簽名躏鱼,不能偽造它是其存在的根本目的。
- 數(shù)字簽名可以為簽名者身份和其簽署的信息內容提供證明殷绍。
- 對于電子簽署的商業(yè)性合同,電子支票,電子購貨單和其他一些各方希望進行認證的電子信息來說是一種理想的解決方案染苛。
素數(shù)
在密碼學中需要找到最大的隨機素數(shù)是必須的。大素數(shù)很多主到,通常測試適當?shù)碾S機整數(shù)殖侵,知道找到素數(shù)的過程是可行的。
素數(shù)的分布函數(shù) π(n): 描述了小于或等于n的素數(shù)的數(shù)目
素數(shù)定理給了 π(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基于素數(shù)原理:尋求大素數(shù)是很容易的镰烧,把一個數(shù)分解成兩個最大素數(shù)的積卻相當?shù)睦щy
公鑰加密
公鑰加密,顧名思義有一把 公鑰 與 私鑰
在 RSA 加密算法中楞陷,每一個秘鑰由一對整數(shù)組成怔鳖。在密碼學中常以 Alice 與 Bob 作為例子,這也是每當有人普及比特幣相關的技術的時候頻率出現(xiàn)較多的名詞固蛾。
如圖:用 $P_A$ 表示 Alice 公鑰结执,$S_A$ 表示 Alice 私鑰
同理:
如圖:用 $P_B$ 表示 Bob 公鑰度陆,$S_B$ 表示 Bob 私鑰
秘鑰需要保密,公鑰可以對任何人透露,這個跟比特幣地址是一樣的献幔。
公鑰和秘鑰指定了可用于任何信息的函數(shù)懂傀。設 $\mathfrak{D}$ 表示允許的信息集合。其可能是所以有限長度的位序列的集合蜡感。
在最原始的公鑰加密設想中蹬蚁,要求公鑰與秘鑰指定一種從 $\mathfrak{D}$ 到其自身的一一對應的函數(shù)。對應 Alice 的公鑰 $P_A$ 的函數(shù)用 $P_A()$ 表示郑兴,他的秘鑰 $S_A$ 的函數(shù)表示成 $S_A()$, 因此 $P_A()$ 與 $S_A()$ 函數(shù)都是 $\mathfrak{D}$ 的排列犀斋。架設已知秘鑰 $P_A$ 或 $S_A$,可以有效的計算出函數(shù) $P_A()$ 和 $S_A()$
系統(tǒng)中任何參與者的公鑰和秘鑰都是一個“匹配對”,它們指定的函數(shù)互為反函數(shù)情连,也就是說叽粹,對于任何消息 $M\in\mathfrak{D} $ 有:
$$ M = S_A(P_A(M)) \ M = P_A(S_A(M)) $$
由此可以看出,運用兩把秘鑰 $P_A$ 和 $S_A$ 對 $M$ 相繼進行變換后却舀,最后任然得到消息 $M$
故在應用程序中:要求除了 Alice 外虫几,沒人能在較實用的時間內計算出函數(shù) $S_A()$。 對于送給 Alice 加密郵件的保密性與 Alice 的數(shù)字簽名的有效性挽拔。
因為$P_A$是公開的辆脸,就比如 數(shù)字貨幣的地址,這樣就可以計算出 $P_A()$ 它也是 $S_A()$ 的反函數(shù)篱昔,這個時候就要保證只有 Alice 能夠計算出 $S_A()$ 每强。
模擬一個發(fā)送環(huán)境:
如上圖: Bob 給 Alice 發(fā)送一條加密的消息 Message,竊取著得到的是一串亂碼。
- Bob 得到 Alice 的公鑰 $P_A$
- Bob 計算出對應的 M 的密文 $C=P_A(M)$州刽,并把 C發(fā)送給 Alice
- 當 Alice 得到密文 C 之后空执,運用自己的秘鑰 $S_A$ 恢復原始信息: $S_A(C)=S_A(P_A(M))=M$.
由于 $S_A()$ 和 $P_A()$ 互為反函數(shù),所以 Alice 能夠根據(jù) C 計算出 M穗椅。因為只有 Alice 能夠計算出 $S_A()$, 所以也只有 Alice 能根據(jù) C計算出 M辨绊。因為 Bob 運用 $P_A$ 對M進行加密,所以只有 Alice 可以理解接收的消息匹表。
用類似的公鑰系統(tǒng)的設想可以很容易的實現(xiàn)數(shù)字簽名门坷,現(xiàn)在 Alice 希望把一個數(shù)字簽署的答復 M^' 發(fā)送給 Bob
![](http://on9ek9f89.bkt.clouddn.com/15027290704130.jpg)
在公鑰的數(shù)字簽名中, Alice 將她的數(shù)字簽名 $\sigma = S_A(M')$ 附加到消息 M‘上袍镀,來對消息 M’ 簽名默蚌。她將消息/簽名對 $(M', \sigma)$ 發(fā)送給 Bob,Bob 通過檢查等式 $M’ = P_A(\sigma)$ 來驗證它。如果等式成立苇羡,則他接受 $(M',\sigma)$ 作為 Alice 已經(jīng)簽名的一個消息
Alice 運用她的秘鑰 $S_A$ 和等式 $\sigma = S_A(M')$ 計算出信息 M’ 的數(shù)字簽名 $\sigma$.
Alice 把消息/簽名對 $(M', \sigma)$ 發(fā)送給 Bob.
-
當 Bob 收到 $(M', \sigma)$ 時绸吸,他可以利用 Alice 的公鑰,通過驗證等式 $M’ = P_A(\sigma)$ 來證實該消息的確是來自 Alice.
如果 M’ 包含 Alice 的名字,這樣 Bob 就知道應該使用誰的公鑰锦茁。
由上圖中的驗證可以看到攘轩,如果符合 Bob 可以得出消息 M‘ 確實是 Alice 簽名的結論。如果不成立码俩,那么 Bob 就可以得出一個結果: 要么就是信息 M‘或數(shù)字簽名 $\sigma$ 因傳輸錯誤而損壞度帮,要么信息對 $(M',\sigma)$ 是一個故意的偽造。
因為一個數(shù)字簽名既證明了簽署者身份稿存,也證明了簽署的信息內容笨篷,所以它是對文件末尾的手寫簽名的一種模擬。
數(shù)字簽名必須可以被能取得簽署者公鑰的人去驗證,一條所簽署過的信息可以被確認方確后再傳送到其他可以驗證簽名的各方挠铲。
比如我給你的一個比特幣其實就是一個簽名的過程冕屯,只是比特幣采用的是多次簽名加密技術,比這個要復雜許多(做區(qū)塊鏈開發(fā)的人可能見笑了)拂苹,其原理是怎樣的呢安聘?密碼學中一個通俗的例子:
Alice 給 Bob 的一張電子支票,Bob 確認了支票上 Alice 的簽名后瓢棒,就可以把這張支票交送給銀行浴韭,而銀行也可以對簽名進行一個驗證,然后就可以調撥相應的資金脯宿。
上面講到的是簽署的信息是沒有加密的,該信息是公開透明的念颈,比如比特幣交易的過程中是公開透明,該行為會向全網(wǎng)進行一個廣播连霉,同而使各個節(jié)點都能同步到該交易事件榴芳。
而我們這里要說的反而恰恰相反,我們要把信息進行一個加密跺撼,怎樣去加密呢窟感?就是把有關加密和簽名的兩種方案結合起來使用,就可以創(chuàng)建出同時被簽署和加密的消息歉井,簽署者首先把其數(shù)字簽名附加在消息的后面柿祈,然后再用他預定的接受者的公鑰對最終的消息/簽名對進行加密。接收者用其密鑰對收到的消息進行解密哩至,以同時獲得原始消息和數(shù)字簽名躏嚎。然后接收者可以用簽署者的公鑰對簽名進行驗證。很有意思菩貌!
RSA加密系統(tǒng)
公鑰私鑰創(chuàng)建過程
1.隨機選出最大素數(shù) $\mathcal{P}$ 和 $\mathcal{q}$, 使得 $\mathcal{P}\not=\mathcal{q}$ e.g:素數(shù) $\mathcal{P}$ 和$\mathcal{q}$ 可能各有 1024 位卢佣。
2.計算 $n=\mathcal{P} \mathcal{q}$
3.選取一個與 $\phi(n)$互質的最小奇數(shù) 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$$
上面所看到的等式對加密與簽名是通用的媳危。為了創(chuàng)建一個簽名,簽署人把其秘鑰應用于待簽署的消息冈敛,而不是密文中待笑。為了確認簽名,將簽署人的公鑰應用在簽名中抓谴,而并非在加密的消息中暮蹂。
用模的求冪過程,來對公鑰與秘鑰的一些操作癌压。
我們設公鑰(e,n)和秘鑰(d,n)滿足 $\lg e = O(1)$, $\lg d \leq \beta$, 且 $\lg n \leq \beta$.
然后仰泻,應用公鑰需要執(zhí)行 $O(1)$ 次模乘法運算和 $O(\beta^2)$ 次位操作。 應用秘鑰需要執(zhí)行 $O(\beta)$ 次模乘法運算 $O(\beta^3)$ 次位操作滩届。
RSA安全性保證
RSA加密的安全性主要來源于對最大整數(shù)進行因式分解的困難性集侯。如果對方對公鑰中的模 n 進行分解,就可以根據(jù)公鑰推導出秘鑰帜消,主要是因為對方和公鑰創(chuàng)建者以同樣的方法使用因子 $\mathcal{P}$ 和 $\mathcal{q}$ .故如果能夠分解大整數(shù)棠枉,就可以輕易破解 RSA 加密算法。
這樣來講:對RSA加密系統(tǒng)的破解難易程度取決于分解最大整數(shù)的困難度泡挺。
在計算機發(fā)展的歷史中至今還沒有發(fā)行比分解模 n 更容易的方法來打破 RSA加密辈讶。
通過隨機選取兩個 1024 位的素數(shù)并求出它們的積,就可以創(chuàng)建出一把用現(xiàn)在技術在可行時間內破解的公鑰娄猫。也就是說在算法的發(fā)展史上沒有取得新的突破性進展的時候贱除,RSA 加密算法是一種安全方面的保證。
基于上面論述的原理媳溺,在實際的實現(xiàn)過程中 選取的位素數(shù)通常在 768到 2048 位月幌。由此就需要能夠有效的找出最大素數(shù)。
在實際的應用當中為了提高效率褂删,最長使用的是一種 秘鑰管理 模式的RSA飞醉,來實現(xiàn)快速無公鑰加密系統(tǒng)。在這樣的一個系統(tǒng)中屯阀,加密秘鑰與解密秘鑰是同一個缅帘。
e.g:
Alice 把一條長消息 M 發(fā)送給 Bob, 她從快速無公鑰加密系統(tǒng)中選取一把隨機秘鑰 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摧冀。
通過上面例子了解到:使用一種混合的方法來提高數(shù)字簽名的執(zhí)行效率。
把 RSA 與一個公開的 抗沖突散列算法 h 結合系宫。 使用該函數(shù)的目的就是找出兩條消息 M和M',有 h(M)=h(M').
h(M)的值是消息M的一個短 “指紋” 的一個概念索昂。
如果 Alice 簽署消息 M,她第一步要做的就是把函數(shù) h 作用于 M得到的指紋h(M),然后用她的秘鑰加密h(M). Alice 將 $(M,S_A(h(M)))$ 作為她簽署的 M 的版本發(fā)送給 Bob. Bob 可以通過計算 h(M),并將 $P_A$ 應用于收到的 $P_A(h(M))$ 驗證其是否等于h(M)來驗證簽名的真實性扩借。
原理:沒有人能夠同時創(chuàng)建出兩條具有相同指紋的消息椒惨,所以在計算機上不可能改變簽署的消息,又保持了簽名的合法性潮罪。
所以利用證書可以輕松地分配公鑰康谆。
e.g:
在公網(wǎng)中有一個 T,每個人都知道其 公鑰错洁。 Alice 從T得到一條簽署的證書秉宿,聲明 “Alice” 的公鑰是 $P_A$. 由于每個人都知道 $P_T$,該證書是 “自我認證”。 Alice 可以把自己的證書含在簽名信息當中屯碴,使得接受者可以立即得到 Alice 的公鑰描睦,來驗證其簽名。因為 Alice 的秘鑰是被 T 簽署的导而,所以接收者知道 Alice 的秘鑰確實是 Alice 本人的秘鑰忱叭。