php 怎麼產生rsa加密的公開金鑰和私密金鑰
來源:互聯網
上載者:User
php 如何產生rsa加密的公開金鑰和私密金鑰
網上看了哈似乎可以用openssl
但是 似乎都讀取的檔案
也沒看懂 php到底怎麼來調用他???不知道哪位大哥能指點一二?給哥樣本而代碼
或者地址!
現在我的系統可能要求的是用 資料庫
得把公開金鑰 和私密金鑰 放到資料庫
這個怎麼辦?
------解決方案--------------------
我也只知道有這麼個演算法 ,沒用上。 存了些資料給你參考參考
rsa非對稱式加密
http://i.laoer.com/php-rsa.html
http://www.zeali.net/entry/8
http://pear.php.net/package/Math_BigInteger/download
dh非對稱式加密
http://pear.php.net/package/Crypt_DiffieHellman/download
使用
http://blog.csdn.net/ihefe/archive/2011/01/11/6128386.aspx
------解決方案--------------------
以下內容來自互連網
[url]http://su200909.blog.163.com/blog/static/127808604200910202646745/[/url]
RSA方法,簡單地說,是產生一組數字n、e和d。用n和e加密明文(明文要求小於n),用n和d解密密文。
尋找一組n、e、d很容易,但當n足夠大時,由n和e求出d很難。這是RSA的安全性所在。
https不需說了。這裡說的是,如何在non-https環境使用JavaScript和PHP實現RSA加密/解密:在瀏覽器使用JavaScript加密資訊,在伺服器用PHP解密資訊。
一,用JavaScript加密
有關RSA,比較好的JavaScript見[url]http://ohdave.com/rsa/[/url](該頁面還有密鑰產生程式下載)。用法也簡單:
1,設定參數
setMaxDigits(d);
函數的參數d跟n的位元有關。關係是
d=n的十六進位位元/2+3
比如n是十六進位16位(對應二進位125~128位),d就設成19。
2,設定密鑰
key=new RSAKeyPair(e,d,n);
參數e、d、n是十六進位表示。加密只需要e和n,d給空串。如:
key=new RSAKeyPair('3d','','a090f4fdaba1c60975fb3b9ea6937a27');
3,加密
ct=encryptedString(key,pt+'\x01');
這個函數把明文pt加密為密文ct(十六進位字串)。對長資訊,則分段加密(但PEAR::Crypt_RSA不認可,下文將解決這個問題)。
'\x01'這個位元組,是PEAR::Crypt_RSA要求的結尾符。保證PEAR::Crypt_RSA可以成功解密的一組明文長度(位元組)為:
n的十六進位位元/2-3
對2的密鑰,一次可以加密13個位元組(14個也可能成功,看密鑰和明文的情況)。
二,用PHP解密
PEAR::Crypt_RSA的安裝很簡單,這裡不說了。
1,開啟數學庫
require_once('Crypt/RSA.php');//一般是這個路徑
$math_obj = &Crypt_RSA_MathLoader::loadWrapper();
PHP 的數學庫有GMP、BigInt、BCMath。如果不給loadWrapper指定參數,他會按照這個順序選擇已經載入的數學庫(分別對應 Crypt_RSA_Math_GMP類、Crypt_RSA_Math_BigInt類和Crypt_RSA_Math_BCMath類)。 BCMath是php的預設配置,但比起GMP,實在是慢多了。不瞭解BigInt,不好說。
2,載入密鑰
$dd = $math_obj->int2bin('0x'.$d);
$nn = $math_obj->int2bin('0x'.$n);
$pk = new Crypt_RSA_Key($nn, $dd, 'private');
$rsa_obj = new Crypt_RSA;
$rsa_obj->setParams(array('dec_key' => $pk));
3,解密
$pt = $rsa_obj->decryptBinary($math_obj->int2bin('0x'.$ct));
PEAR::Crypt_RSA可以使用十六進位密鑰,也可以解密十六進位密文。但對Crypt_RSA_Math_BCMath類必須修改一下int2bin的代碼,使他能夠把十六進位數字轉換為內部格式。
當然,如果是十進位密鑰/密文,'0x'首碼就不用加了。
對Crypt_RSA_Math_BCMath::int2bin()的改動是在函數的開頭加上:
$p=substr($num,0,2);
if($p=='0x'||$p=='0X'){
$len=strlen($num);
$result = 0;
$factor = 1;
for($i=$len-1;$i>=2;$i--){
$result=bcadd($result,bcmul(hexdec($num[$i]),$factor));
$factor=bcmul($factor,16);
}
$num=$result;
}
三,解決JavaScript加密功能浪費問題
JavaScript的encryptedString()函數對長資訊分段加密,密文用空格分割各個段落。而Crypt_RSA類的decryptBinary()函數不能適應這一點。為了利用充分JavaScript的加密功能,只能給Crypt_RSA類增加一個函數:
function decryptString($s, $key = null)
{
$result = ‘’;
if($key==null)
$key = $this->_dec_key;
$exp = $this->_math_obj->bin2int($key->getExponent());
$modulus = $this->_math_obj->bin2int($key->getModulus());
$chunk_len = $key->getKeyLength() - 1;
$block_len = (int) ceil($chunk_len / 8);
$radix=10;
if(substr($s,0,2)=='0x'){
$radix=16;
$s=substr($s,2);
}
$blocks = explode(" ",$s);
for($i = 0; $i < count($blocks); ++$i){
$enc_data=$blocks[$i];
if ($radix == 16)
$enc_data='0x'.$enc_data;
$enc_data=$this->_math_obj->int2bin($enc_data);
$data_len = strlen($enc_data);
$curr_pos = 0;
$bit_pos = 0;
$plain_data = $this->_math_obj->bin2int("\0");