非對稱加密&&RAS算法學習經驗

非對稱加密&&RAS算法

之前對非對稱加密有很大的誤解,可以說之前理解的非對稱加密都是錯誤的,經過一位大牛的點撥 (碾壓) 充分認識到了自己的錯誤~,現在重新對非對稱加密做一個總結;

之前錯誤的想法

非對稱加密 指的是 傳輸信息時 擁有公鑰/私鑰,公鑰加密的信息只能使用私鑰解密,私鑰加密的信息只有公鑰能解密~ 僅此而已;

但這是錯誤的,這是非對稱加密的必要條件;但不是充分必要條件;

現階段我認爲的非對稱加密

在上面介紹的繼續做補充;

非對稱加密的通信方式是單向的~
小明對小紅髮送信息如果小明要保密,小明就必須使用小紅的公鑰上鎖加密.
如果小紅對小明發信息使用了小紅自己的私鑰加密,那麼小紅髮送的信息就可以用公鑰解開,但由於公鑰是公開的,所以任何人都可以解開,因此
如果小紅想要保密的發送信息給小明,應該使用小明的公鑰加密給小紅;
雙方通信流程

不僅如此,公鑰和私鑰的關係應該有着這樣一個關係:,公鑰無法反向推測出私鑰(合理時間內);甚至哪怕你的算法源碼以及泄露出去,也無法在合理時間內反向破解私鑰;

這裏有比較成熟的加密算法: RSA、Elgamal、揹包算法、Rabin、D-H、ECC(橢圓曲線加密算法)。
其中使用最多的是 RSA 加密算法;

下面談一談我對RSA算法的理解;

RSA算法理解學習

預備知識

  • 關於求餘的幾個公式恆等式
    1. (a+b)%p=(a%p+b%p)%p(a+b)\%p=(a\%p + b\%p)\%p
    2. (ab)%p=(a%pb%p+p)%p(a-b)\%p=(a\%p - b\%p + p)\%p
    3. (ab)%p=(a%pb%p+p)%p(a*b)\%p=(a\%p * b\%p + p)\%p
  • 模逆元
    如果有正整數 n , m ,e 有以下關係恆成立
    (mn)%e1(m*n)\%e≡1
    那麼我們稱 mn 互爲關於 e的模逆元;
  • 歐拉函數 wiki百科
    小於或等於n的正整數中與n互質的數的數目φ(n)函數的作用;
    例如:
    φ(8) = 4; // 與8互質的數有:1,3,5,7
  • 歐拉-費馬定理
    對於任何非負整數 a 存在以下恆等關係
    aφ(n)%n1a^{φ(n)}\%n≡1

過程概述

  1. 隨機選取兩個質數 p ,q
  2. N = p * q
  3. r = φ(N)
  4. 隨機選取一個數字 e 滿足 e<r && e 與 r 互質
  5. 求得 e關於 r 的模逆元 d
    及存在以下關係
    (ed)%r=1 (e·d) \%r = 1
  6. 此時集合 {e,N}作爲公鑰分發公開, {d,N}作爲私鑰自己保存
  7. 加密過程:
    現加密傳輸一個小於N的非負整數 ***m***:
    n=me%Nn=m^e\%N
    得到 密文 ***n***;
  8. 解密過程:
  9. 得到密文 ***n***:
    m=nd%Nm=n^d\%N
    得到 原始信息m;
  10. 所有的數據信息都可以轉化爲Unicode 或者 ascii 碼進行傳輸,重複上述 7加密過程後發送密文即可實現加密傳輸;

數學解析

首先證明下列兩公式成立:
n=me%Nn=m^e\%N
m=nd%Nm=n^d\%N

  1. 將1代入到2得:
    m=(me%N)d%Nm=(m^e\%N)^d\%N
  2. 展開使用乘法表示:
    m=[(me%N)(me%N)(me%N)]%Nm=[(m^e\%N)*(m^e\%N)*···*(m^e\%N)]\%N
  3. 根據求餘恆等公式3得:
    m=[mememe]%N=(me)d%Nm=[m^e*m^e*···*m^e]\%N=(m^e)^d\%N
  4. 因爲 (e*d)%r = 1 && r = φ(N) 得到:(k爲係數 關係爲: (ed)%r = k 餘 1))
    m=m(kr+1)%N=(mkφ(N)+1)%N=(mmkφ(N))%N=(m(mφ(N))k)%Nm=m^{(k*r+1)}\%N=(m^{k*φ(N)+1})\%N = (m*m^{k*φ(N)})\%N= (m*(m^{φ(N)})^k)\%N
  5. 展開可得:
    m={m%N[(mφ(N)%Nmφ(N)%N...mφ(N)%N)]%N}%Nm=\{m\%N*[(m^{φ(N)}\%N*m^{φ(N)}\%N*...*m^{φ(N)}\%N)]\%N\}\%N
  6. 由歐拉-費馬定理
    mφ(N)%N1m^{φ(N)}\%N≡1
    代入後可得
    m=[m%N(11...1)%N]%N=(m%N1%N)%N=m%Nm=[m\%N*(1*1*...*1)\%N]\%N=(m\%N*1\%N)\%N=m\%N
    這裏發出一個問題:歐拉費馬定理指出當m與N互質時公式成立,但是這裏m有可能不與N互質,但是等式仍然成立~爲什麼?特殊的某個值在哪裏不成立導致了這一條件?
  7. 因爲 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 更換爲支持超大數據的類型,同時實現大數的加減乘除以及求餘即可~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章