A. php 如何生成2048的私鑰和1024的公鑰長度
以下命令來生成密鑰對。
$openssl genrsa -out mykey.pem 2048
$openssl pkcs8 -topk8 -inform PEM -outform PEM -in mykey.pem \
-out private_key.pem -nocrypt
這個命令得到的公共密鑰。
$ openssl rsa -in mykey.pem -pubout -outform DER -out public_key.der
我寫了兩方法讀取私鑰和公鑰
分別。public PrivateKey getPemPrivateKey(String filename, String algorithm) throws Exception {
File f = new File(filename);
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int) f.length()];
dis.readFully(keyBytes);
dis.close();
String temp = new String(keyBytes);
String privKeyPEM = temp.replace("-----BEGIN PRIVATE KEY-----\n", "");
privKeyPEM = privKeyPEM.replace("-----END PRIVATE KEY-----", "");
//System.out.println("Private key\n"+privKeyPEM);
Base64 b64 = new Base64();
byte [] decoded = b64.decode(privKeyPEM);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded);
KeyFactory kf = KeyFactory.getInstance(algorithm);
return kf.generatePrivate(spec);
}
public PublicKey getPemPublicKey(String filename, String algorithm) throws Exception {
File f = new File(filename);
FileInputStream fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
byte[] keyBytes = new byte[(int) f.length()];
dis.readFully(keyBytes);
dis.close();
String temp = new String(keyBytes);
String publicKeyPEM = temp.replace("-----BEGIN PUBLIC KEY-----\n", "");
publicKeyPEM = privKeyPEM.replace("-----END PUBLIC KEY-----", "");
Base64 b64 = new Base64();
byte [] decoded = b64.decode(publicKeyPEM);
X509EncodedKeySpec spec =
new X509EncodedKeySpec(decoded);
KeyFactory kf = KeyFactory.getInstance(algorithm);
return kf.generatePublic(spec);
}
B. 怎樣實現對私鑰(公鑰)進行解密
要實現安全登錄,可以採用下面三種方法,一種基於非對稱加密演算法,一種基於對稱加密演算法,最後一種基於散列演算法。下面我們來分別討論這三種方法。
非對稱加密演算法中,目前最常用的是 RSA 演算法和 ECC(橢圓曲線加密)演算法。要採用非對稱加密演算法實現安全登錄的話,首先需要在客戶端向伺服器端請求登錄頁面時,伺服器生成公鑰和私鑰,然後將公鑰隨登錄頁面一起傳遞給客戶端瀏覽器,當用戶輸入完用戶名密碼點擊登錄時,登錄頁面中的 javaScript 調用非對稱加密演算法對用戶名和密碼用用公鑰進行加密。然後再提交到伺服器端,伺服器端利用私鑰進行解密,再跟資料庫中的用戶名密碼進行比較,如果一致,則登錄成功,否則登錄失敗。
看上去很簡單,但是這里有這樣幾個問題。目前 RSA 演算法中,1024-2048 位的密鑰被認為是安全的。如果密鑰長度小於這個長度,則認為可以被破解。但這樣的長度超過了程序設計語言本身所允許的數字運算范圍,需要通過模擬來實現大數運算。而在 Web 系統的客戶端,如果通過 JavaScript 來模擬大數運行的話,效率將會是很低的,因此要在客戶端採用這樣的密鑰來加密數據的話,許多瀏覽器會發出執行時間過長,停止運行的警告。然而,解密或者密鑰生成的時間相對於加密來說要更長。雖然解密和密鑰生成是在伺服器端執行的,但是如果伺服器端是 PHP、ASP 這樣的腳本語言的話,它們也將很難勝任這樣的工作。ECC 演算法的密鑰長度要求比 RSA 演算法要低一些,ECC 演算法中 160 位的密鑰長度被認為與 RSA 演算法中 1024 位的密鑰長度的安全性是等價的。雖然仍然要涉及的模擬大數運算,但 ECC 演算法的密鑰長度的運算量還算是可以接受的,但是 ECC 演算法比 RSA 演算法要復雜的多,因此實現起來也很困難。
對稱加密演算法比非對稱加密演算法要快得多,但是對稱加密演算法需要數據發送方和接受方共用一個密鑰,密鑰是不能通過不安全的網路直接傳遞的,否則密鑰和加密以後的數據如果同時監聽到的話,入侵者就可以直接利用監聽到的密鑰來對加密後的信息進行解密了。
那是不是就不能通過對稱加密演算法實現安全登錄呢?其實只要通過密鑰交換演算法就可以實現安全登錄了,常用的密鑰交換演算法是 Diffie-Hellman 密鑰交換演算法。我們可以這樣來實現密鑰的安全傳遞,首先在客戶端向伺服器端請求登錄頁面時,伺服器端生成一個大素數 p,它的本原根 g,另外生成一個隨機數 Xa,然後計算出 Ya = gXa mod p,將 p、g、Ya 連同登錄頁面一起發送給客戶端,然後客戶端也生成一個隨機數 Xb,計算 Yb = gXb mod p,然後再計算 K = YaXb mod p,現在 K 就是密鑰,接下來就可以用 K 作密鑰,用對稱加密演算法對用戶輸入進行加密了,然後將加密後的信息連同計算出來的 Yb 一同發送給伺服器端,伺服器端計算 K = YbXa mod p,這樣就可以得到跟客戶端相同的密鑰 K 了,最後用客戶端加密演算法的相應解密演算法,就可以在伺服器端將加密信息進行解密了,信息解密以後進行比較,一致則登錄成功,否則登錄失敗。需要注意的時候,這里伺服器端生成的隨機數 Xa 和 客戶端生成的隨機數 Xb 都不傳遞給對方。傳遞的數據只有 p、g、Ya、Yb 和加密後的數據。
但是如果我們不採用加密演算法而採用散列演算法對登錄密碼進行處理的話,可以避免被直接解密出原文,但是如果直接採用 MD5 或者 SHA1 來對登錄密碼進行處理後提交的話,一旦入侵者監聽到散列後的密碼,則不需要解密出原文,直接將監聽到的數據提交給伺服器,就可以實現入侵的目的了。而且,目前 MD5 演算法已被破解,SHA1 演算法則被證明從理論上可破解,就算採用離線碰撞,也可以找出與原密碼等價的密碼來。所以直接採用 MD5 或者 SHA1 來對密碼進行散列處理也是不可行的。
但是如果在散列演算法中加入了密鑰,情況就不一樣了。hmac 演算法正好作了這樣的事情,下面我們來看看如何用 hmac 演算法實現安全登錄。首先在客戶端向伺服器端請求登錄頁面時,伺服器端生成一個隨機字元串,連同登錄頁面一同發送給客戶端瀏覽器,當用戶輸入完用戶名密碼後,將密碼採用 MD5 或者 SHA1 來生成散列值作為密鑰,伺服器端發送來的隨機字元串作為消息數據,進行 hmac 運算。然後將結果提交給伺服器。之所以要對用戶輸入的密碼進行散列後再作為密鑰,而不是直接作為密鑰,是為了保證密鑰足夠長,而又不會太長。伺服器端接受到客戶端提交的數據後,將保存在伺服器端的隨機字元串和用戶密碼進行相同的運算,然後進行比較,如果結果一致,則認為登錄成功,否則登錄失敗。當然如果不用 hmac 演算法,直接將密碼和伺服器端生成的隨機數合並以後再做 MD5 或者 SHA1,應該也是可以的。
這里客戶端每次請求時伺服器端發送的隨機字元串都是不同的,因此即使入侵者監聽到了這個隨機字元串和加密後的提交的數據,它也無法再次提交相同的數據通過驗證。而且通過監聽到的數據也無法計算出密鑰,所以也就無法偽造登錄信息了。
對稱和非對稱加密演算法不僅適用於登錄驗證,還適合用於最初的密碼設置和以後密碼修改的過程中,而散列演算法僅適用於登錄驗證。但是散列演算法要比對稱和非對稱加密演算法效率高。
C. php中aes加密和rsa加密的區別
這個跟php沒有關系,單純的是兩個密碼學的演算法。如果真想搞清楚區別,你需要有密碼學的基礎知識。
我簡單說一下,這兩個都是標準的密碼學演算法,應用廣泛。AES是一個對稱加密演算法,常常用於對數據進行加密,RSA是一個非對稱(公鑰)加密演算法,常常用於對AES加密用的密鑰進行加密,或者進行數字簽名等。
至於對稱加密演算法和非對稱加密演算法的區別說起來就越來越多了。你只要知道以下事實就好:
對稱加密演算法加解密密鑰相同,而非對稱加密演算法加解密密鑰不同
對稱加密演算法相對於非對稱加密演算法而言往往加解密速度很快
非對稱加密演算法具有任何有公鑰的人都能加密數據,但是只有有私鑰的人才能解密數據的特點
D. php 支付寶介面官方給的md5簽名版本和rsa簽名版本的區別
雖然支付寶官方還未提供相關SDK,PHP確實可以實現RSA方式的簽名,這點其實很重要,由於不熟悉,在遇到困難的時候,經常會不由自主地想到是否PHP不支持RSA簽名,乾脆用MD5得了,這樣就沒有了前進的動力。其實說穿了MD5和RSA簽名,不同的只是簽名方式的區別,其他的都一樣,因此我這里主要說一下如何用RSA進行簽名和驗簽。
首先你需要准備下面的東西:
php的openssl擴展里已經封裝好了驗簽的方法openssl_verify。
如果在Windows下的php.ini需要開啟Openssl模塊: extension=php_openssl.dll
商戶私鑰:
即RSA私鑰,按照手冊,按以下方式生成:
openssl genrsa -out rsa_private_key.pem 1024
商戶公鑰:
即RSA私鑰,按照手冊,按以下方式生成:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成之後,按照手冊的說明,需要在簽約平台上傳公鑰,需要注意的是,上傳的時候需要把所有的注釋和換行都去掉。
另外手冊中還有如下命令:
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
該命令將RSA私鑰轉換成PKCS8格式,對於PHP來說,不需要。
支付寶公鑰:
根據手冊,在簽約平台獲得。
如果你直接復制下來的話,會得到一個字元串,需要進行下面的轉換;
1)把空格變成換行
2)添加註釋
比如你復制下來的公鑰是:
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB,那轉換之後為:
-----BEGIN PUBLIC KEY-----
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB
-----END PUBLIC KEY-----
把公鑰保存在文件里。
注意這個是2048位的公鑰應該是9行或者10行,不能為1行,不然PHP的openssl_pkey_get_public無法讀取,pub_key_id的結果為false,如果沒有-----BEGIN PUBLIC KEY----- 和 -----END PUBLIC KEY----- 可以自己加上,最後保存到一個rsa_public_key.pem文件中。
好了,現在已經有了所有的東西,先看簽名函數:
復制代碼
1 <?php
2 /**
3 * 簽名字元串
4 * @param $prestr 需要簽名的字元串
5 * return 簽名結果
6 */
7 function rsaSign($prestr) {
8 $public_key= file_get_contents('rsa_private_key.pem');
9 $pkeyid = openssl_get_privatekey($public_key);
10 openssl_sign($prestr, $sign, $pkeyid);
11 openssl_free_key($pkeyid);
12 $sign = base64_encode($sign);
13 return $sign;
14 }
15 ?>
復制代碼
注意點:
1.$prestr的內容和MD5一樣(參見手冊,但不包含最後的MD5密碼)
2.簽名用商戶私鑰
3.最後的簽名,需要用base64編碼
4.這個函數返回的值,就是這次請求的RSA簽名。
驗簽函數:
復制代碼
1 <?php
2 /**
3 * 驗證簽名
4 * @param $prestr 需要簽名的字元串
5 * @param $sign 簽名結果
6 * return 簽名結果
7 */
8 function rsaVerify($prestr, $sign) {
9 $sign = base64_decode($sign);
10 $public_key= file_get_contents('rsa_public_key.pem');
11 $pkeyid = openssl_get_publickey($public_key);
12 if ($pkeyid) {
13 $verify = openssl_verify($prestr, $sign, $pkeyid);
14 openssl_free_key($pkeyid);
15 }
16 if($verify == 1){
17 return true;
18 }else{
19 return false;
20 }
21 }
22 ?>
復制代碼
注意點:
1.$prestr的內容和MD5一樣(參見手冊)
2.$sign是支付寶介面返回的sign參數用base64_decode解碼之後的二進制
3.驗簽用支付寶公鑰
4.這個函數返回一個布爾值,直接告訴你,驗簽是否通過
支付寶官方提供的PHP版SDK demo中只對MD5加密方式進行了處理,但android 端和ios端 請求支付寶加密方式只能用RSA加密演算法,這時服務端PHP就無法驗證簽名了,所以需要對demo進行一些修改。
1、修改alipay_notify.class.php文件
verifyNotify 函數第46行
$isSign = $this->getSignVeryfy($_POST, $_POST["sign"]);
改成
$isSign = $this->getSignVeryfy($_POST, $_POST["sign"], $_POST["sign_type"]);
verifyReturn 函數第83行
$isSign = $this->getSignVeryfy($_GET, $_GET["sign"]);
改成
$isSign = $this->getSignVeryfy($_GET, $_GET["sign"], $_GET["sign_type"]);
getSignVeryfy 函數 116行
function getSignVeryfy($para_temp, $sign) {
改成
function getSignVeryfy($para_temp, $sign, $sign_type) {
getSignVeryfy 函數 127行
switch (strtoupper(trim($this->alipay_config['sign_type']))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
break;
default :
$isSgin = false;
}
改成
switch (strtoupper(trim($sign_type))) {
case "MD5" :
$isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
break;
case "RSA" :
$isSgin = rsaVerify($prestr, $sign);
break;
default :
$isSgin = false;
}
2、新建一個alipay_rsa.function.php文件
復制代碼
1 <?php
2 /* *
3 * RSA
4 * 詳細:RSA加密
5 * 版本:3.3
6 * 日期:2014-02-20
7 * 說明:
8 * 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
9 * 該代碼僅供學習和研究支付寶介面使用,只是提供一個參考。
10 */
11 /**
12 * 簽名字元串
13 * @param $prestr 需要簽名的字元串
14 * return 簽名結果
15 */
16 function rsaSign($prestr) {
17 $public_key= file_get_contents('rsa_private_key.pem');
18 $pkeyid = openssl_get_privatekey($public_key);
19 openssl_sign($prestr, $sign, $pkeyid);
20 openssl_free_key($pkeyid);
21 $sign = base64_encode($sign);
22 return $sign;
23 }
24 /**
25 * 驗證簽名
26 * @param $prestr 需要簽名的字元串
27 * @param $sign 簽名結果
28 * return 簽名結果
29 */
30 function rsaVerify($prestr, $sign) {
31 $sign = base64_decode($sign);
32 $public_key= file_get_contents('rsa_public_key.pem');
33 $pkeyid = openssl_get_publickey($public_key);
34 if ($pkeyid) {
35 $verify = openssl_verify($prestr, $sign, $pkeyid);
36 openssl_free_key($pkeyid);
37 }
38 if($verify == 1){
39 return true;
40 }else{
41 return false;
42 }
43 }
44 ?>
E. 誰知道公鑰私鑰加密簽名的PHP代碼怎麼寫公鑰格式為cer,私鑰格式為pfx。
你好,PHP對RSA加密沒有原生支持,需要打開openssl擴展,而且還得知道伺服器的證書格式,之類的參數,不然沒法對上簽名,PHP的RAS加密解密代碼支付寶的SDK裡面有,例子可以參考。再找關於RSA加密的資料,看完你就明白流程了,如果你要跟java的jks證書對接的話,貌似沒法實現。謝謝。
F. 用PHP如何實現數字簽名啊··跪求高人指點···
以下是資料:
php中數字簽名與校驗
1. 先用php生成一對公鑰和私鑰
$res = openssl_pkey_new();
openssl_pkey_export($res,$pri);
$d= openssl_pkey_get_details($res);
$pub = $d['key'];
var_mp($pri,$pub);
輸出依次為私鑰和公鑰的pem字串,如:
string(916) "-----BEGIN PRIVATE KEY-----
wsETi80b4ZyYlYUSsAtvS7ZG+GSLAox24TKNwWIy5cUdKfK/5QEJjZ0S8LjRSYCG
+8z
+st3fjEblEfcPcoIq5uiKx2bnO3
f9g0yt+
+UI8OhmLbw/Vyh6Ii1glwMfyq
VS2lAakj9d1hqLYZvw+eNeZBnzZNPuMJg5aj/WKUqasCQQDHiFLS7Yb1rbhfjmRt
ZL4zXuvX1hVjTNo2TeZwPniGpYa+QHcauDDep5C9q//n+D+ZtkbkECxpOVhrUHSI
+
+a2epF/YENEtjL6N2RE8Y+0oTdlwr
b4dQkRkfqCHtyrWOeRcC1Y6FyTfNj+cRBzdIcmFc21hxj6HKy2M6/XGI3rAE5L+B
mmlSmN1enhoCUqc=
-----END PRIVATE KEY-----
"
string(272) "-----BEGIN PUBLIC KEY-----
+Y4dUMLBE4vNG+Gc
+UBCY2dEvC40UmAhraPS5MEE0Ky
mPAQV1QkEEt1V0as+KJ/W5nBksizCur0MbfTZyaZOmgZiRO89+fvM00y8HVG2GjA
HGKq7GA34AUjQYMGwwIDAQAB
-----END PUBLIC KEY-----
"
2. 保存好自己的私鑰,把公鑰可以公開給別人。如果需要對某數據進行簽名,證明那數據是從你這里發出的,就需要用私鑰:
$res = openssl_pkey_get_private($pri);
if (openssl_sign('hello', $out, $res))
var_mp(base64_encode($out));
上例中 $pri 為自己的私鑰,'hello' 為待簽名的數據,如果簽名成功,最後輸出為base64編碼後的簽名,如:
j19H+C/NQEcyowezOQ+gmGi2UoPJNXyJ+/p/pp7il+xGz2aUWdOXkJFgIc/+ieokMLFm9cmtN2hGag9vq1s=
3. 別人收到你的數據 'hello' 和簽名字串,想驗證這是從你發來的數據的話,用你公開的公鑰驗證:
$sig = base64_decode($sig);
$res = openssl_pkey_get_public($pubkey);
if (openssl_verify('hello', $sig, $res) === 1)
; // 通過驗證
上例中剛開始的 $sig 為之前你base64編碼過的簽名, $pubkey 為你的公鑰
php中這種簽名使用的是RSA演算法;數字簽名可以在 單點登錄 等系統中派上用場。
G. 什麼叫公鑰
公鑰(Public Key)伍緩與私鑰(Private Key)是通過一種腔差模演算法得到的一個密鑰對(即一個公鑰和一個私鑰),公鑰是密鑰對中公開的部分,私鑰則是非公開的部分。公鑰通常用於加密會話密鑰、驗證慶碰數字簽名,或加密可以用相應的私鑰解密的數據。
H. PHP中哪種加密方式好
aes/des加密速度快,適合大量數據,des容易破解,一般用3重des,後來又出現了更快更安全的aes
rsa是公鑰加密,速度慢,只能處理少量數據,優點是公鑰即使在不安全的網路上公開,也能保證安全
常見情況是雙方用rsa協商出一個密鑰後通過aes/3des給數據加密。
bcrypt,是一個跨平台的文件加密工具。由它加密的文件可在所有支持的操作系統和處理器上進行轉移。它的口令必須是8至56個字元,並將在內部被轉化為448位的密鑰。
綜上所述用bcrypt還是好點,最好用md5安全性高,更多問題到後盾網論壇問題助專區http://bbs.hounwang.com/
I. 怎麼在PHP實現MD5withRSA-CSDN論壇
RSA 演算法
1978年就出現了這種演算法,它是第一個既能用於數據加密也能用於數字簽名的演算法。
它易於理解和操作,也很流行。演算法的名字以發明者的名字命名:Ron Rivest, Adi
Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理論上的證明。
RSA的安全性依賴於大數分解。公鑰和私鑰都是兩個大素數( 大於 100
個十進制位)的函數。據猜測,從一個密鑰和密文推斷出明文的難度等同於分解兩個
大素數的積。
密鑰對的產生。選擇兩個大素數,p 和q 。計算:
n = p * q
然後隨機選擇加密密鑰e,要求 e 和 ( p - 1 ) * ( q - 1 ) 互質。最後,利用
Euclid 演算法計算解密密鑰d, 滿足
e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )
其中n和d也要互質。數e和
n是公鑰,d是私鑰。兩個素數p和q不再需要,應該丟棄,不要讓任何人知道。
加密信息 m(二進製表示)時,首先把m分成等長數據塊 m1 ,m2,..., mi ,塊長s
,其中 2^s <= n, s 盡可能的大。對應的密文是:
ci = mi^e ( mod n ) ( a )
解密時作如下計算:
mi = ci^d ( mod n ) ( b )
RSA 可用於數字簽名,方案是用 ( a ) 式簽名, ( b )
式驗證。具體操作時考慮到安全性和 m信息量較大等因素,一般是先作 HASH 運算。
RSA 的安全性。
RSA的安全性依賴於大數分解,但是否等同於大數分解一直未能得到理論上的證明,因
為沒有證明破解
RSA就一定需要作大數分解。假設存在一種無須分解大數的演算法,那它肯定可以修改成
為大數分解演算法。目前, RSA
的一些變種演算法已被證明等價於大數分解。不管怎樣,分解n是最顯然的攻擊方法。現
在,人們已能分解140多個十進制位的大素數。因此,模數n
必須選大一些,因具體適用情況而定。
RSA的速度。
由於進行的都是大數計算,使得RSA最快的情況也比DES慢上100倍,無論是軟體還是硬
件實現。速度一直是RSA的缺陷。一般來說只用於少量數據加密。
RSA的選擇密文攻擊。
RSA在選擇密文攻擊面前很脆弱。一般攻擊者是將某一信息作一下偽裝(
Blind),讓擁有私鑰的實體簽署。然後,經過計算就可得到它所想要的信息。實際上
,攻擊利用的都是同一個弱點,即存在這樣一個事實:乘冪保留了輸入的乘法結構:
( XM )^d = X^d *M^d mod n
前面已經提到,這個固有的問題來自於公鑰密碼系統的最有用的特徵--每個人都能使
用公鑰。但從演算法上無法解決這一問題,主要措施有兩條:一條是採用好的公鑰協議
,保證工作過程中實體不對其他實體任意產生的信息解密,不對自己一無所知的信息
簽名;另一條是決不對陌生人送來的隨機文檔簽名,簽名時首先使用One-Way Hash
Function
對文檔作HASH處理,或同時使用不同的簽名演算法。在中提到了幾種不同類型的攻擊方
法。
RSA的公共模數攻擊。
若系統中共有一個模數,只是不同的人擁有不同的e和d,系統將是危險的。最普遍的
情況是同一信息用不同的公鑰加密,這些公鑰共模而且互質,那末該信息無需私鑰就
可得到恢復。設P為信息明文,兩個加密密鑰為e1和e2,公共模數是n,則:
C1 = P^e1 mod n
C2 = P^e2 mod n
密碼分析者知道n、e1、e2、C1和C2,就能得到P。
因為e1和e2互質,故用Euclidean演算法能找到r和s,滿足:
r * e1 + s * e2 = 1
假設r為負數,需再用Euclidean演算法計算C1^(-1),則
( C1^(-1) )^(-r) * C2^s = P mod n
另外,還有其它幾種利用公共模數攻擊的方法。總之,如果知道給定模數的一對e和d
,一是有利於攻擊者分解模數,一是有利於攻擊者計算出其它成對的e』和d』,而無
需分解模數。解決辦法只有一個,那就是不要共享模數n。
RSA的小指數攻擊。 有一種提高
RSA速度的建議是使公鑰e取較小的值,這樣會使加密變得易於實現,速度有所提高。
但這樣作是不安全的,對付辦法就是e和d都取較大的值。
RSA演算法是第一個能同時用於加密和數字簽名的演算法,也易於理解和操作。RSA是被研
究得最廣泛的公鑰演算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為
人們接受,普遍認為是目前最優秀的公鑰方案之一。RSA
的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難度與大數分解難
度等價。即RSA的重大缺陷是無法從理論上把握它的保密性能如何,而且密碼學界多數
人士傾向於因子分解不是NPC問題。
RSA的缺點主要有:A)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次
一密。B)分組長度太大,為保證安全性,n 至少也要 600 bits
以上,使運算代價很高,尤其是速度較慢,較對稱密碼演算法慢幾個數量級;且隨著大
數分解技術的發展,這個長度還在增加,不利於數據格式的標准化。目前,SET(
Secure Electronic Transaction
)協議中要求CA採用2048比特長的密鑰,其他實體使用1024比特的密鑰。
更多問題到問題求助專區http://bbs.hounwang.com/