国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

加密算法之非對稱加密

dongxiawu / 2823人閱讀

摘要:算法公鑰加密算法是年由羅納德李維斯特阿迪薩莫爾和倫納德阿德曼一起提出的。是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被推薦為公鑰數據加密標準。

上篇文章介紹了對稱加密的原理,但是它的最大問題就是加密和解密的密鑰是相同的,并且不能保證密鑰能安全的送到雙方手里,即使安全的送到雙方手里,免不了內部會有"臥底"的存在

非對稱加密

既然有對稱加密,那么自然會聯想到非對稱加密。非對稱加密的核心在于加密和解密使用的是不同的密鑰,如何做到使用不同的密鑰呢?
比如我有一個只能用鑰匙打開的存錢罐,平時大家只能把零錢放到儲錢罐中,但是只有我才有取錢的鑰匙。放到儲錢罐的硬幣可以看成加密后的內容,而只有用鑰匙才能將"加密"后的硬幣取出來。
這樣我們就可以把用來加密的密鑰(公鑰)給了任何人,我們只要自己保存好解密的密鑰(私鑰)就可以安全的保護我們的數據。
非對稱算法有很多:RSA、Elgamal、背包算法、Rabin、D-H、ECC等,下面我們來簡單介紹一下RSA算法。

RSA算法

RSA公鑰加密算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,當時他們三人都在麻省理工學院工作。RSA就是他們三人姓氏開頭字母拼在一起組成的(啥時候以我名字命名一個呢)。
RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數密碼攻擊,已被ISO推薦為公鑰數據加密標準。

RSA加密&&RSA解密公式
//注意:明文為數字,實際計算過程我們可以通過ASCII碼轉換
密文 = (明文 ^ E) % N; //其中的E和N就是我們的公鑰

明文 = (密文 ^ D) % N; //其中的D和N就是我們的私鑰
計算公鑰(E)、私鑰(D)和數字(N)

公鑰和私鑰不是隨便弄幾個數字就可以的,是經過嚴格的數學公式計算出來的。

1、隨機準備兩個質數P和Q,計算乘積得到N
N = P * Q;
2、計算L
L = (P - 1) * (Q - 1); //圖解密碼技術中說需要計算乘積之后的最小公倍數,但是經過代碼測試并不準確,哪位大俠了解麻煩留言告知一下~
3、計算E(公鑰),用來給加密方使用
//E需要同時滿足下面兩個條件
1. 1 < E < L
2. E和L的最大公約數為一(歐幾里得算法,這些惡魔啊,E和L必須互質,這樣才能保證一定可以計算出私鑰D)
4、計算D(私鑰),用來給解密方使用
//D需要滿足下面公式
(E * D) % L = 1; //想要保證結果為1,E和L必須互質!!!

上面就是整個計算過程,為了保證數據的安全現實中,P和Q會選用特別大的數(1024比特或者更大)

RSA的加密和解密

上面已經提到過加密和解密的方法,我們用具體的數字實踐一下,加深理解吧。

1、求N(P*Q)
假設:P = 7、Q = 11(均為質數)
那么:N = P * Q = 7 * 11 = 77
2、求L ((P - 1) * (Q - 1))
L = (P - 1) * (Q - 1) = 6 * 10 = 60
3、求E
1 < E < 60
E和L的最大公約數為一,我們假設E=23
4、計算D ((E * D) % L = 1)
(23 * D) % 60 = 1;
D = 47;

那么我就得到了公鑰(E=23,N=77),私鑰(D=47,N=77)

加密&&解密

我們假設需要加密數字:12
公式:密文 = (明文 ^ E) % N;
12 ^ 23 % 77 = 6624737266949237011120128 % 77 = 45;
這個45就是我們加密后的密文

解密
公式:明文 = (密文 ^ D) % N;
45 ^ 47 % 77 = 502328880013965819626664594350710696732674427522624682751484215259552001953125 % 77 = 12;
得出原文:12

PHP示例

下面是我用PHP實現的加密&解密示例,供大家參考(因為指數運算的結果集會很大,我們必須使用PHP中提供的BC Math系列函數計算)

/**
 * 冒牌RSA算法
 * @author zhjx922
 */

/**
 * 判斷數字是否為質數
 * @param $num
 * @return bool
 */
function isPrimeNumber($num) {
    $k = 0;//定義次數變量
    for ($i = 1; $i <= $num; $i++) {
        if (bcmod($num, $i) == 0) {
            $k++;//如果取模等于0,次數k自加
        }
    }

    if ($k == 2) {
        return true;
    }
    return false;
}

//求最小公倍數
function minMultiple($a, $b)
{
    if($b==0)     //一定要考慮除數不能為零
    {
        return $b;
    } else {
        $m = bccomp($a, $b) == 1 ? $a : $b;
        $n = bccomp($b, $a) == 1 ? $b : $a;

        for($i=2; ; $i++)
        {
            $mul = bcmul($m, $i);
            if(bcmod($mul, $n) == 0)
            {
                return $mul;
            }
        }
    }
    return bcmul($a, $b);
}

//求最大公約數
function maxDivisor($a,$b)
{
    $n = bccomp($a, $b) == 1 ? $b : $a;
    for($i = $n; $i>1; $i--)
    {
        if(bcmod($a, $i) == 0 && bcmod($b, $i) == 0)
        {
            return $i;   //此處如果用echo $i;則輸出結果為432;故應區分echo、return的區別
        }
    }
    return 1;
}


do{
    //隨機一個質數P
    $p = mt_rand(101, 197);
} while(!isPrimeNumber($p));

do{
    //隨機一個質數Q
    $q = mt_rand(101, 197);
} while(!isPrimeNumber($q));


$n = bcmul($p, $q);

//$l = minMultiple($p - 1, $q - 1); //經測試不可用
$l = bcmul($p - 1, $q - 1);

do {
    $e = mt_rand(2, $l - 1);
}while(maxDivisor($e, $l) != 1);


$d = 1;
while(bcmod(bcmul($e,++$d), $l) != 1) {

}

echo "p:" . $p . PHP_EOL;
echo "q:" . $q . PHP_EOL;
echo "n:" . $n . PHP_EOL;
echo "l:" . $l . PHP_EOL;
echo "e:" . $e . PHP_EOL;
echo "d:" . $d . PHP_EOL;

echo "公鑰:e={$e},n={$n}" . PHP_EOL;
echo "私鑰:d={$d},n={$n}" . PHP_EOL;

//加密
function encode($e, $n, $string) {
    $enString = "";
    $len = strlen($string);
    for($i = 0; $i < $len; $i++) {
        $pow = bcpow(ord($string{$i}), $e);
        $mod = bcmod($pow, $n);
        $enString .= pack("L", $mod);
    }
    return $enString;
}


//解密
function decode($d, $n, $string) {
    $deString = "";
    $string = unpack("L*", $string);
    $len = count($string);
    for($i = 1; $i <= $len; $i++) {
        $pow = bcpow($string[$i], $d);
        $mod = bcmod($pow, $n);
        $deString .= chr($mod);
    }
    return $deString;
}


$startTime = microtime(true);

$string = "歡迎關注"假裝是個程序員"公眾號";
echo "原文:" . $string . PHP_EOL;

$encodeString = encode($e, $n, $string);
echo "密文:" . $encodeString . PHP_EOL;

$decodeString = decode($d, $n, $encodeString);
echo "解密后:" . $decodeString . PHP_EOL;


$endTime = microtime(true);

echo "Total:" . ($endTime - $startTime) . "s." . PHP_EOL;
沒有絕對安全的加密方式

沒有什么加密方式能一直保持絕對的安全,尤其常用的MD5,如果你的數據庫中密碼還是使用MD5的哈希結果不要笑話人家直接用明文存密碼的人,五十步笑百步而已。。。
最近谷歌宣布破解了SHA-1,隨著計算能力的提高,SHA-256,RSA等等也是遲早的事兒。。

歡迎關注我的公眾號,一起交流學習~

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22441.html

相關文章

  • 區塊鏈之非對稱加密算法

    摘要:二如何理解公鑰和私鑰非對稱加密算法需要兩個密鑰公開密鑰和私有密鑰。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。三非對稱加密解密原理非對稱加密算法中,常用的就是算法了,以下就以算法為例來講解非對稱加密算法的實現原理。 非對稱加密,在現在網絡應用中,有這非常廣泛的場景,更是加密貨幣的基礎。本文主要介紹非對稱加密、解密的原理和過程,以及在區塊鏈中的使用。 一、非對稱...

    mcterry 評論0 收藏0
  • 聊聊加密那點事——PHP加密最佳實踐

    摘要:所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點之一。非對稱加密算法由于對稱加密在通信加密領域的缺陷,年和提出了非對稱加密的概念。非對稱加密,其主要缺點之一就是慢,適合加密少量數據。 1. 加密的目的 加密不同于密碼,加密是一個動作或者過程,其目的就是將一段明文信息(人類或機器可以直接讀懂的信息)變為一段看上去沒有任何意義的字符,必須通過事先約定的解密規則才能將...

    lcodecorex 評論0 收藏0
  • 聊聊加密那點事——PHP加密最佳實踐

    摘要:所謂對稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點之一。非對稱加密算法由于對稱加密在通信加密領域的缺陷,年和提出了非對稱加密的概念。非對稱加密,其主要缺點之一就是慢,適合加密少量數據。 1. 加密的目的 加密不同于密碼,加密是一個動作或者過程,其目的就是將一段明文信息(人類或機器可以直接讀懂的信息)變為一段看上去沒有任何意義的字符,必須通過事先約定的解密規則才能將...

    Mr_zhang 評論0 收藏0
  • 對稱加密算法-RSA

    摘要:非對稱加密,加密與解密使用的密鑰不是同一密鑰,對中一個對外公開,稱為公鑰,另一個只有所有者知道,稱為私鑰。對稱加密算法不能實現簽名,因此簽名只能非對稱算法。正因為,這種加密是單向的,所以被稱為非對稱加密算法。 非對稱加密,加密與解密使用的密鑰不是同一密鑰,對中一個對外公開,稱為公鑰,另一個只有所有者知道,稱為私鑰。用公鑰加密的信息只有私鑰才能解開,反之,用私鑰加密的信息只有公鑰才能解開...

    gggggggbong 評論0 收藏0
  • 加密解密算法介紹

    摘要:加密解密算法介紹算法目前常見有加密算法,散列算法,編碼算法,使用位關鍵字作為流加密算法加密技術通常分為兩大類對稱式和非對稱式。對稱性加密算法有用途對稱加密算法用來對敏感數據等信息進行加密數據加密標準,速度較快,適用于加密大量數據的場合。 加密解密算法介紹 算法目前常見有: 加密算法,散列算法,Base64(編碼算法),https(SSL使用40位關鍵字作為RC4流加密算法) 加密技術通...

    ThinkSNS 評論0 收藏0

發表評論

0條評論

dongxiawu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<