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");
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.