公鑰加密算法 也叫非對稱加密,它在加密和解密時使用的是不同的密鑰,具有這樣的特征:
有一對密鑰
a和b,滿足a ≠ b用密鑰
a加密的數(shù)據(jù)只能用b進行解密,a自身無法解密,反之亦然只知道其中一個密鑰,無法推導(dǎo)出另一個
-
把其中一個可以公開的叫做公鑰,另一個不能公開的叫做私鑰
WechatIMG30.png
最常見的公鑰加密算法是RSA公鑰加密算法,也是簽名中普遍使用的算法。其數(shù)學(xué)原理如下:
- 選定兩個超大的素數(shù)
p,q,并計算他們的乘積n=p*q - 計算歐拉函數(shù)
φ(n)=φ(p)*φ(q)=(p-1)*(q-1) - 隨機選定一個數(shù)
e,滿足1<e<φ(n),且與φ(n)互質(zhì) - 根據(jù)擴展歐幾里得算法計算
e對于φ(n)的乘法逆元d,e*d=1modφ(n) -
{n, e}和{n, d}分別組成這個算法的一對密鑰 - 對于給定明文
p, 若使用{n, e}作為加密密鑰,其密文計算方法為c=p^emodn
這是一個單向函數(shù),已知{c, n, e}無法計算出p - 相應(yīng)地需要使用
{n, d}進行解密,p=c*dmodn,這是上一步加密函數(shù)的逆函數(shù) - 兩組密鑰中
n是相同的,那么如果已知了e和d其中的一個,想要計算另一個,必須知道φ(n),也就是必須先將n分解質(zhì)因數(shù),得到p和q,但由于n的值非常大,這樣的計算量基本上是不可能的,也就保障了算法的安全性.
理論上 {n, e} 和 {n, d} 可以互換,任何一個都可以是公鑰或者私鑰,加密和解密的函數(shù)也可以互換。但實踐中,一般固定設(shè)置e=65537(0x10001),相當(dāng)于公開的一個約定,這樣一來{n, e}就只能作為公鑰使用。
哈希算法
也叫散列或者摘要算法,對一段任意長度的數(shù)據(jù),通過一定的映射和計算,得到一個固定長度的值,這個值就被稱為這段數(shù)據(jù)的哈希值(hash)。給定一個哈希算法,它一定具有以下特征:
- 哈希值不同的兩段數(shù)據(jù)絕對不同
- 相同的數(shù)據(jù)計算出的哈希值絕對相同
- 由于哈希值是固定長度, 也就意味著哈希值的數(shù)量是有限的。而任意數(shù)據(jù)都可以計算出一個哈希值,計算哈希的過程,相當(dāng)于無限集到有限集的映射。因此哈希值相同,對應(yīng)的原始數(shù)據(jù)不一定相同,如果不同,則稱這兩段數(shù)據(jù)存在哈希碰撞,實際應(yīng)用中認為這是小概率事件(數(shù)學(xué)意義上的”不可能事件”),優(yōu)秀的哈希算法都是碰撞率極低的。
- 哈希算法是單向算法,無法通過哈希值,計算出原始數(shù)據(jù),這一點非常重要!
常見的哈希算法有: md5, sha1, sha256等,其中sha1長度為160bits,而sha256長度為256bits,二者相比,sha256的取值范圍更大,因此碰撞和破解的概率更低,也就相對更安全。
