非對稱加密&&RAS算法
之前對非對稱加密有很大的誤解,可以說之前理解的非對稱加密都是錯誤的,經過一位大牛的點撥 (碾壓) 充分認識到了自己的錯誤~,現在重新對非對稱加密做一個總結;
之前錯誤的想法
非對稱加密 指的是 傳輸信息時 擁有公鑰/私鑰,公鑰加密的信息只能使用私鑰解密,私鑰加密的信息只有公鑰能解密~ 僅此而已;
但這是錯誤的,這是非對稱加密的必要條件;但不是充分必要條件;
現階段我認爲的非對稱加密
在上面介紹的繼續做補充;
非對稱加密的通信方式是單向的~
小明對小紅髮送信息如果小明要保密,小明就必須使用小紅的公鑰上鎖加密.
如果小紅對小明發信息使用了小紅自己的私鑰加密,那麼小紅髮送的信息就可以用公鑰解開,但由於公鑰是公開的,所以任何人都可以解開,因此
如果小紅想要保密的發送信息給小明,應該使用小明的公鑰加密給小紅;
不僅如此,公鑰和私鑰的關係應該有着這樣一個關係:,公鑰無法反向推測出私鑰(合理時間內);甚至哪怕你的算法源碼以及泄露出去,也無法在合理時間內反向破解私鑰;
這裏有比較成熟的加密算法: RSA、Elgamal、揹包算法、Rabin、D-H、ECC(橢圓曲線加密算法)。
其中使用最多的是 RSA 加密算法;
下面談一談我對RSA算法的理解;
RSA算法理解學習
預備知識
- 關於求餘的幾個公式恆等式
- 模逆元
如果有正整數n
,m
,e
有以下關係恆成立
那麼我們稱m
與n
互爲關於e
的模逆元; - 歐拉函數 wiki百科
小於或等於n的正整數中與n互質的數的數目φ(n)函數的作用;
例如:
φ(8) = 4; // 與8互質的數有:1,3,5,7 - 歐拉-費馬定理
對於任何非負整數 a 存在以下恆等關係
過程概述
- 隨機選取兩個質數
p
,q
- 令
N
=p * q
- 令
r
= φ(N) - 隨機選取一個數字
e
滿足 e<r && e 與 r 互質 - 求得 e關於 r 的模逆元
d
及存在以下關係
- 此時集合
{e,N}
作爲公鑰分發公開,{d,N}
作爲私鑰自己保存 - 加密過程:
現加密傳輸一個小於N的非負整數 ***m
***:
得到 密文 ***n
***; - 解密過程:
- 得到密文 ***
n
***:
得到 原始信息m; - 所有的數據信息都可以轉化爲Unicode 或者 ascii 碼進行傳輸,重複上述 7加密過程後發送密文即可實現加密傳輸;
數學解析
首先證明下列兩公式成立:
- 將1代入到2得:
- 展開使用乘法表示:
- 根據求餘恆等公式3得:
- 因爲 (e*d)%r = 1 && r = φ(N) 得到:(k爲係數 關係爲: (ed)%r = k 餘 1))
- 展開可得:
- 由歐拉-費馬定理
代入後可得
這裏發出一個問題:歐拉費馬定理指出當m與N互質時公式成立,但是這裏m有可能不與N互質,但是等式仍然成立~爲什麼?特殊的某個值在哪裏不成立導致了這一條件? - 因爲 m < N
m≡m%N得證;
代碼求解
//獲取公鑰 私鑰 (即上文中互爲模逆元的 e && d)
bool getKey(unsigned int * pb,unsigned int* pv,unsigned int modNum)
{
*pb = modNum;
while(judgeRelativelyPrime(*pb,modNum) == false)
{
*pb = getRandPrimeNum(modNum); //在1~modNum中隨機返回一個質數
if(*pb == -1u) return false;
}
int k = 0;
for(;(k*modNum+1)%e !=0;k++)
{
}
if ((k*modNum + 1) % e == 0)
*pv = (k*modNum + 1) / e;
retrun true;
}
//加密
unsigned int encryption(unsigned int bigNum,unsigned int pb,unsigned int byt)
{
return ((unsigned int)pow(byt,pb)) % bigNum;
}
//解密
unsigned int decryption(unsigned int bigNum,unsigned int pv,unsigned int ecp)
{
return ((unsigned int)pow(byt,pv)) % bigNum;
}
注意事項!
這裏的函數只能作爲示例,因爲現有的RSA算法都是基於大數質數的計算進行加密保護,正是由於此,哪怕知道公鑰和算法源碼別人也無法咋合理的時間內破解祕鑰~
因此需要將 unsigned int 更換爲支持超大數據的類型,同時實現大數的加減乘除以及求餘即可~