摘要:算法公鑰加密算法是年由羅納德李維斯特阿迪薩莫爾和倫納德阿德曼一起提出的。是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。
非對(duì)稱(chēng)加密上篇文章介紹了對(duì)稱(chēng)加密的原理,但是它的最大問(wèn)題就是加密和解密的密鑰是相同的,并且不能保證密鑰能安全的送到雙方手里,即使安全的送到雙方手里,免不了內(nèi)部會(huì)有"臥底"的存在
既然有對(duì)稱(chēng)加密,那么自然會(huì)聯(lián)想到非對(duì)稱(chēng)加密。非對(duì)稱(chēng)加密的核心在于加密和解密使用的是不同的密鑰,如何做到使用不同的密鑰呢?
比如我有一個(gè)只能用鑰匙打開(kāi)的存錢(qián)罐,平時(shí)大家只能把零錢(qián)放到儲(chǔ)錢(qián)罐中,但是只有我才有取錢(qián)的鑰匙。放到儲(chǔ)錢(qián)罐的硬幣可以看成加密后的內(nèi)容,而只有用鑰匙才能將"加密"后的硬幣取出來(lái)。
這樣我們就可以把用來(lái)加密的密鑰(公鑰)給了任何人,我們只要自己保存好解密的密鑰(私鑰)就可以安全的保護(hù)我們的數(shù)據(jù)。
非對(duì)稱(chēng)算法有很多:RSA、Elgamal、背包算法、Rabin、D-H、ECC等,下面我們來(lái)簡(jiǎn)單介紹一下RSA算法。
RSA公鑰加密算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,當(dāng)時(shí)他們?nèi)硕荚诼槭±砉W(xué)院工作。RSA就是他們?nèi)诵帐祥_(kāi)頭字母拼在一起組成的(啥時(shí)候以我名字命名一個(gè)呢)。
RSA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。
//注意:明文為數(shù)字,實(shí)際計(jì)算過(guò)程我們可以通過(guò)ASCII碼轉(zhuǎn)換 密文 = (明文 ^ E) % N; //其中的E和N就是我們的公鑰 明文 = (密文 ^ D) % N; //其中的D和N就是我們的私鑰計(jì)算公鑰(E)、私鑰(D)和數(shù)字(N)
公鑰和私鑰不是隨便弄幾個(gè)數(shù)字就可以的,是經(jīng)過(guò)嚴(yán)格的數(shù)學(xué)公式計(jì)算出來(lái)的。
1、隨機(jī)準(zhǔn)備兩個(gè)質(zhì)數(shù)P和Q,計(jì)算乘積得到NN = P * Q;2、計(jì)算L
L = (P - 1) * (Q - 1); //圖解密碼技術(shù)中說(shuō)需要計(jì)算乘積之后的最小公倍數(shù),但是經(jīng)過(guò)代碼測(cè)試并不準(zhǔn)確,哪位大俠了解麻煩留言告知一下~3、計(jì)算E(公鑰),用來(lái)給加密方使用
//E需要同時(shí)滿足下面兩個(gè)條件 1. 1 < E < L 2. E和L的最大公約數(shù)為一(歐幾里得算法,這些惡魔啊,E和L必須互質(zhì),這樣才能保證一定可以計(jì)算出私鑰D)4、計(jì)算D(私鑰),用來(lái)給解密方使用
//D需要滿足下面公式 (E * D) % L = 1; //想要保證結(jié)果為1,E和L必須互質(zhì)!!!
上面就是整個(gè)計(jì)算過(guò)程,為了保證數(shù)據(jù)的安全現(xiàn)實(shí)中,P和Q會(huì)選用特別大的數(shù)(1024比特或者更大)
RSA的加密和解密上面已經(jīng)提到過(guò)加密和解密的方法,我們用具體的數(shù)字實(shí)踐一下,加深理解吧。
1、求N(P*Q)假設(shè):P = 7、Q = 11(均為質(zhì)數(shù)) 那么:N = P * Q = 7 * 11 = 772、求L ((P - 1) * (Q - 1))
L = (P - 1) * (Q - 1) = 6 * 10 = 603、求E
1 < E < 60 E和L的最大公約數(shù)為一,我們假設(shè)E=234、計(jì)算D ((E * D) % L = 1)
(23 * D) % 60 = 1; D = 47;
那么我就得到了公鑰(E=23,N=77),私鑰(D=47,N=77)
加密&&解密我們假設(shè)需要加密數(shù)字:12
公式:密文 = (明文 ^ E) % N;
12 ^ 23 % 77 = 6624737266949237011120128 % 77 = 45;
這個(gè)45就是我們加密后的密文
解密
公式:明文 = (密文 ^ D) % N;
45 ^ 47 % 77 = 502328880013965819626664594350710696732674427522624682751484215259552001953125 % 77 = 12;
得出原文:12
下面是我用PHP實(shí)現(xiàn)的加密&解密示例,供大家參考(因?yàn)橹笖?shù)運(yùn)算的結(jié)果集會(huì)很大,我們必須使用PHP中提供的BC Math系列函數(shù)計(jì)算)
/** * 冒牌RSA算法 * @author zhjx922 */ /** * 判斷數(shù)字是否為質(zhì)數(shù) * @param $num * @return bool */ function isPrimeNumber($num) { $k = 0;//定義次數(shù)變量 for ($i = 1; $i <= $num; $i++) { if (bcmod($num, $i) == 0) { $k++;//如果取模等于0,次數(shù)k自加 } } if ($k == 2) { return true; } return false; } //求最小公倍數(shù) function minMultiple($a, $b) { if($b==0) //一定要考慮除數(shù)不能為零 { 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); } //求最大公約數(shù) 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;則輸出結(jié)果為432;故應(yīng)區(qū)分echo、return的區(qū)別 } } return 1; } do{ //隨機(jī)一個(gè)質(zhì)數(shù)P $p = mt_rand(101, 197); } while(!isPrimeNumber($p)); do{ //隨機(jī)一個(gè)質(zhì)數(shù)Q $q = mt_rand(101, 197); } while(!isPrimeNumber($q)); $n = bcmul($p, $q); //$l = minMultiple($p - 1, $q - 1); //經(jīng)測(cè)試不可用 $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 = "歡迎關(guān)注"假裝是個(gè)程序員"公眾號(hào)"; 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;沒(méi)有絕對(duì)安全的加密方式
沒(méi)有什么加密方式能一直保持絕對(duì)的安全,尤其常用的MD5,如果你的數(shù)據(jù)庫(kù)中密碼還是使用MD5的哈希結(jié)果不要笑話人家直接用明文存密碼的人,五十步笑百步而已。。。
最近谷歌宣布破解了SHA-1,隨著計(jì)算能力的提高,SHA-256,RSA等等也是遲早的事兒。。
歡迎關(guān)注我的公眾號(hào),一起交流學(xué)習(xí)~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/22441.html
摘要:二如何理解公鑰和私鑰非對(duì)稱(chēng)加密算法需要兩個(gè)密鑰公開(kāi)密鑰和私有密鑰。因?yàn)榧用芎徒饷苁褂玫氖莾蓚€(gè)不同的密鑰,所以這種算法叫作非對(duì)稱(chēng)加密算法。三非對(duì)稱(chēng)加密解密原理非對(duì)稱(chēng)加密算法中,常用的就是算法了,以下就以算法為例來(lái)講解非對(duì)稱(chēng)加密算法的實(shí)現(xiàn)原理。 非對(duì)稱(chēng)加密,在現(xiàn)在網(wǎng)絡(luò)應(yīng)用中,有這非常廣泛的場(chǎng)景,更是加密貨幣的基礎(chǔ)。本文主要介紹非對(duì)稱(chēng)加密、解密的原理和過(guò)程,以及在區(qū)塊鏈中的使用。 一、非對(duì)稱(chēng)...
摘要:所謂對(duì)稱(chēng)加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點(diǎn)之一。非對(duì)稱(chēng)加密算法由于對(duì)稱(chēng)加密在通信加密領(lǐng)域的缺陷,年和提出了非對(duì)稱(chēng)加密的概念。非對(duì)稱(chēng)加密,其主要缺點(diǎn)之一就是慢,適合加密少量數(shù)據(jù)。 1. 加密的目的 加密不同于密碼,加密是一個(gè)動(dòng)作或者過(guò)程,其目的就是將一段明文信息(人類(lèi)或機(jī)器可以直接讀懂的信息)變?yōu)橐欢慰瓷先](méi)有任何意義的字符,必須通過(guò)事先約定的解密規(guī)則才能將...
摘要:所謂對(duì)稱(chēng)加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點(diǎn)之一。非對(duì)稱(chēng)加密算法由于對(duì)稱(chēng)加密在通信加密領(lǐng)域的缺陷,年和提出了非對(duì)稱(chēng)加密的概念。非對(duì)稱(chēng)加密,其主要缺點(diǎn)之一就是慢,適合加密少量數(shù)據(jù)。 1. 加密的目的 加密不同于密碼,加密是一個(gè)動(dòng)作或者過(guò)程,其目的就是將一段明文信息(人類(lèi)或機(jī)器可以直接讀懂的信息)變?yōu)橐欢慰瓷先](méi)有任何意義的字符,必須通過(guò)事先約定的解密規(guī)則才能將...
摘要:非對(duì)稱(chēng)加密,加密與解密使用的密鑰不是同一密鑰,對(duì)中一個(gè)對(duì)外公開(kāi),稱(chēng)為公鑰,另一個(gè)只有所有者知道,稱(chēng)為私鑰。對(duì)稱(chēng)加密算法不能實(shí)現(xiàn)簽名,因此簽名只能非對(duì)稱(chēng)算法。正因?yàn)?,這種加密是單向的,所以被稱(chēng)為非對(duì)稱(chēng)加密算法。 非對(duì)稱(chēng)加密,加密與解密使用的密鑰不是同一密鑰,對(duì)中一個(gè)對(duì)外公開(kāi),稱(chēng)為公鑰,另一個(gè)只有所有者知道,稱(chēng)為私鑰。用公鑰加密的信息只有私鑰才能解開(kāi),反之,用私鑰加密的信息只有公鑰才能解開(kāi)...
摘要:加密解密算法介紹算法目前常見(jiàn)有加密算法,散列算法,編碼算法,使用位關(guān)鍵字作為流加密算法加密技術(shù)通常分為兩大類(lèi)對(duì)稱(chēng)式和非對(duì)稱(chēng)式。對(duì)稱(chēng)性加密算法有用途對(duì)稱(chēng)加密算法用來(lái)對(duì)敏感數(shù)據(jù)等信息進(jìn)行加密數(shù)據(jù)加密標(biāo)準(zhǔn),速度較快,適用于加密大量數(shù)據(jù)的場(chǎng)合。 加密解密算法介紹 算法目前常見(jiàn)有: 加密算法,散列算法,Base64(編碼算法),https(SSL使用40位關(guān)鍵字作為RC4流加密算法) 加密技術(shù)通...
閱讀 1089·2023-04-25 14:20
閱讀 1926·2021-11-24 10:20
閱讀 3857·2021-11-11 16:55
閱讀 3039·2021-10-14 09:42
閱讀 3541·2019-08-30 15:56
閱讀 1307·2019-08-30 15:55
閱讀 1138·2019-08-30 15:44
閱讀 844·2019-08-29 11:28