導航:首頁 > 編程語言 > phprsa公鑰私鑰生成

phprsa公鑰私鑰生成

發布時間:2023-02-10 14:20:23

python rsa模塊---生成公鑰和私鑰的方法

https://blog.csdn.net/six66hao/article/details/81814576
https://blog.csdn.net/whatday/article/details/97617461
https://blog.csdn.net/xiongzaiabc/article/details/88400748
https://blog.csdn.net/zhao3587717/article/details/83111082/

一.
非對稱加密演算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)
對稱加密演算法大家共用一個密鑰

數字簽名: 就是為了證明該信件是確定的人發出的,而不是黑客冒充發出的
eg:
1.鮑勃給蘇珊回信,決定採用"數字簽名"。他寫完後先用Hash函數,生成信件的摘要(digest)。

二.用RSA庫可以生成公鑰和私鑰
到時候把公鑰給前端,後端保存公鑰和私鑰

三.在用戶注冊/登入時,輸入密碼後前端會用JS對密碼進行加密傳送到後端
一般現在對於密碼的加密解密都用RSA進行

Ⅱ RSA公鑰、私鑰生成,詳細講解

RSA密鑰生成過程

openssl:是一個自由的軟體組織,專注做加密和解密的框架。
genrsa:指定了生成了演算法使用RSA
-out:後面的參數表示生成的key的輸入文件
1024:表示的是生成key的長度,單位位元組(bits)

可以拿著這個文件去數字證書頒發機構(即CA)申請一個數字證書。CA會給你一個新的文件cacert.pem,那才是你的數字證書。(要收費的)

509是一種非常通用的證書格式。
將用上面生成的密鑰privkey.pem和rsacert.csr證書請求文件生成一個數字證書rsacert.crt。這個就是公鑰

![Upload Snip20160323_6.png failed. Please try again.]

在 iOS開發中,公鑰是不能使用base64編碼的,上面的命令是將公鑰的base64編碼字元串轉換成二進制數據

在iOS使用私鑰不能直接使用,需要導出一個p12文件。下面命令就是將私鑰文件導出為p12文件。

執行完上面的這些,我們現在就得到了四個文件

需要在finder中進行搜搜,搜p.p12、reacert.der即可,為了方便查找,可將其導出到別的文件夾中。
註:p.p12 為私鑰 reacert.der 為公鑰

php 加密:AES & RSA

最近兩年一直從事與金融相關項目的開發與維護。但是,關於 PHP 加密解密的最佳實踐,網上沒有人給出一個完美的總結。恰逢最近看了《圖解密碼技術》一書,對 PHP 加解密有了更深刻的認識。

為了避免各位看枯燥的文字理論,開篇我就把總結給出:

一、對稱加密
對稱加密的特點是加解密速度快,加密後的密文強度目前還沒有硬解的可能性。但是,在未來隨著計算機性能的提升有可能會出現被破解的可能性。

對稱加密的缺點也很明顯。對稱加密的加密過程與解密過程使用的是同一把密鑰。一旦泄漏密鑰,加密就失去了任何意義。

根據《圖解密碼技術》一書的推薦,對稱加密目前推薦使用 AES。在 PHP 當中要實現 AES 加解密,是使用 openssl 擴展來實現。所以,請確保你的 PHP 已經開啟了 openssl 擴展。

可以通過如下方式檢測:

或者如下方式檢測:

AES 的加密模式屬於分組密碼模式。所謂分組密碼,是加密時把明文按照固定的長度分組,然後再進行加密。當然,細節之處很很多不同。AES 分組模式有多種:ECB、CBC、CFB、OFB、CTR 五種分組模式。目前優先推薦使用 CBC 模式。

如果使用 CBC 模式,那麼在加密的時候,就需要一個前置的加密向量 IV。當初博主在使用 AES 來加密的時候,就很奇怪一個對稱加密為何要這個向量。因為,在博主寒冰的潛意識里,對稱加密只需要一個密鑰就 Ok 了。沒想到 AES 加密還有多種模式,而這個 CBC 模式恰恰就需要一個這樣的向量值。關於這個向量大家可以在網上查閱相關的資料。這個東西非常重要,也非常好理解。

關於 PHP AES 加解密會用到的相關方法:

AES 支持三種強度:128、192、256。128 位的強度最低,但是,加密解密速度較快。256 位強度最高,但是,加密解密速度最低。所以,大家根據自己系統的重要程度選擇使用對應強度。通常普通的金融項目使用 192 位完整夠用了。頂級的就用 256 位。其他的就用 128 位吧。

二、非對稱加密
非對稱加密是指公鑰加密私鑰解密,私鑰加密公鑰解密的演算法。非對稱加密的演算法有很多。《圖解密碼技術》一書推薦使用 RSA 演算法。它使用起來也非常簡單。

要使用 RSA 演算法。首先,我們必須生成一對公鑰私鑰。其實生成公鑰私鑰很簡單。

在 Linux 系統,直接使用如下命令生成:

此命令會生 ~/.ssh/ 目錄下生成兩個文件:

id_rsa 是私鑰, is_rsa.pub 是公鑰。

關於 PHP RSA 加解密會用到的相關方法:

以上就是關於在 PHP 項目開發中,我們使用的加密解密演算法的一個總結。博主寒冰在總結過程中難免會有不足之處,還請大家指正!謝謝!

Ⅳ RSA的公鑰、私鑰

RSA的公鑰、私鑰

採用單鑰 密碼系統 的加密方法,同一個 密鑰 可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單 密鑰加密 。

與對稱加密 演算法 不同, 非對稱加密演算法 需要兩個 密鑰 : 公開密鑰 (publickey)和私有密鑰(privatekey)。 公開密鑰 與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的 密鑰 ,所以這種演算法叫作 非對稱加密演算法 。

一、舉個例子

1、發消息

   用對方的公鑰給對方發消息

2、發公告

  發公告的時候,用自己的私鑰形成簽名!

二、加密和簽名

RSA的公鑰、私鑰是互相對應的,RSA會生成兩個密鑰,你可以把任何一個用於公鑰,然後另一個就是你必須保護好的私鑰了。

RSA的公鑰、私鑰都可以加密,也都可以解密。

其中:

用公鑰加密需要私鑰解密,稱為「加密」。由於私鑰是不公開的,確保了內容的保密,沒有私鑰無法獲得內容;

用私鑰加密需要公鑰解密,稱為「簽名」。由於公鑰是公開的,任何人都可以解密內容,但只能用發布者的公鑰解密,驗證了內容是該發布者發出的。

所以:

如果用於加密解密,那就是用公鑰加密私鑰解密(僅你可讀但別人不可讀,任何人都可寫)

如果用於證書驗證,那就是用私鑰加密公鑰解密(僅你可寫但別人不可寫,任何人都可讀)

三、認證過程

標簽:  HTTP

Ⅳ 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);
}

Ⅵ PHP中使用openssl可以生成公鑰卻無法生成私鑰,是怎麼回事

常用命令如下:--生成RSA私鑰(傳統格式的)openssl genrsa -out rsa_private_key.pem 1024--將傳統格式的私鑰轉換成PKCS#8格式的openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt--生成RSA公鑰openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

Ⅶ php rsa/no/padding加密怎麼實現

java和PHP RSA加密實現互通
1:通過openssl 生成公鑰和密鑰文件(Linux)
(1) 生產私鑰文件命令
openssl genrsa -out rsa_private_key.pem 1024
(2) 通過私鑰文件生成公鑰命令
openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout

(3) 將傳統格式的私鑰轉換成 PKCS#8 格式的的密鑰文件
openssl pkcs8 -topk8 -in rsa_private_key.pem -outpkcs8_rsa_private_key.pem -nocrypt

Ⅷ php 怎麼生成rsa加密的公鑰和私鑰

附上出處鏈接:http://bbs.csdn.net/topics/370014844

四,用PHP生成密鑰

PEAR::Crypt_RSA的Crypt_RSA_KeyPair類可以生成密鑰。調用步驟如下:

require_once('Crypt/RSA.php');
$math_obj = &Crypt_RSA_MathLoader::loadWrapper();
$key_pair = new Crypt_RSA_KeyPair($key_lenth);
if (!$key_pair->isError()){
$public_key = $key_pair->getPublicKey();
$private_key = $key_pair->getPrivateKey();
$e =$math_obj->hexstr($math_obj->bin2int($public_key->getExponent()));
$d =$math_obj->hexstr($math_obj->bin2int($private_key->getExponent()));
$n =$math_obj->hexstr($math_obj->bin2int($public_key->getMolus()));
}

hexstr()是自己添加的函數,用來把十進制字元串轉換為十六進制。對Crypt_RSA_Math_GMP很簡單,只需:

function hexstr($num){
return gmp_strval($num,16);
}

對Crypt_RSA_Math_BCMath略麻煩些:

function hexstr($num){
$result = '';
do{
$result = sprintf('%02x',intval(bcmod($num,256))).$result;
$num = bcdiv($num, 256);
}while(bccomp($num, 0));
return ltrim($result,'0');
}

五,用php生成密鑰(二)

為了提高加密速度,一般選一個較小的e。比較常用的是3、17、257、65537幾個素數。

generate()生成密鑰的演算法是依次計算p,q,n,e,d。因此做了如下改動,以便可以自己選e值:

原來的:
function Crypt_RSA_KeyPair($key_len, $wrapper_name = 'default', $error_handler = '')
改後增加一個參數e:
function Crypt_RSA_KeyPair($key_len, $e = null, $wrapper_name = 'default', $error_handler = '')
這個函數調用generate()。效應地:
function generate($key_len = null)
也增加一個參數e:
function generate($key_len = null, $e = null)

把CRYPT_RSA-1.0.0的KeyPair.php中屬於generate()的245~271行改動順序,由e確定p和q:

if($e != null&&$this->_math_obj->cmpAbs($e,2)>0)
$e = $this->_math_obj->nextPrime($this->_math_obj->dec($e));//取個素數
else
{
while(true)
{
$e = $this->_math_obj->getRand($q_len, $this->_random_generator);
if ($this->_math_obj->cmpAbs($e,2)<=0)
continue;
$e = $this->_math_obj->nextPrime($this->_math_obj->dec($e));
break;
}
}
do{
$p = $this->_math_obj->getRand($p_len, $this->_random_generator, true);
$p = $this->_math_obj->nextPrime($p);
do{
do{
$q = $this->_math_obj->getRand($q_len, $this->_random_generator, true);
$tmp_len = $this->_math_obj->bitLen($this->_math_obj->mul($p, $q));
if ($tmp_len < $key_len)
$q_len++;
elseif ($tmp_len > $key_len)
$q_len--;
} while ($tmp_len != $key_len);
$q = $this->_math_obj->nextPrime($q);
$tmp = $this->_math_obj->mul($p, $q);
} while ($this->_math_obj->bitLen($tmp) != $key_len);
// $n - is shared molus
$n = $this->_math_obj->mul($p, $q);
// generate public ($e) and private ($d) keys
$pq = $this->_math_obj->mul($this->_math_obj->dec($p), $this->_math_obj->dec($q));
if($this->_math_obj->isZero($this->_math_obj->dec($this->_math_obj->gcd($e, $pq))))
break;
}while(true);

(網易的服務真體貼啊,連pre標記裡面的東西都給改。還改不好)這樣,如果要生成e為3的1024位密鑰,可以如下調用:

$key_pair = new Crypt_RSA_KeyPair(1024,3);

六,干什麼用

加密比較重要的數據。比如注冊時用戶輸入的密碼。
登錄時把密碼hmac一下就可以防止重放攻擊(replay attack)了。對注冊不存在這種攻擊,但有密碼泄露的危險。上傳密碼hash那點安全性根本不算什麼。這個可以用RSA加密解決。
不過,對中間人攻擊還是沒辦法。

另外一個

http://www.mingup.cn/php/2011/0121/101568.html

Ⅸ RSA公鑰和私鑰的生成以及PKCS#1與PKCE#8格式的轉換

首先需要電腦安裝openssl,這個搜一下安裝就行了。
然後運行命令行輸入命令:

回車,可以看到命令行執行的文件夾多了一個rsa_private_key.pem私鑰文件

然後執行生成公鑰命令:

回車,可以看到命令行執行的文件夾多了一個rsa_public_key.pem公鑰文件

PKCS#1格式私鑰轉換成PKCS#8格式私鑰(一般JAVA用的都是PKCS#8格式私鑰)

回車,可以看到命令行列印出了PKCS#8格式的私鑰,右鍵復制就行了。

用記事本開打密鑰文件看看
以-----BEGIN RSA PRIVATE KEY-----開頭
以-----END RSA PRIVATE KEY-----結束
的就是PKCS#1格式

以-----BEGIN PRIVATE KEY-----開頭
以-----END PRIVATE KEY-----結束
的就是PKCS#8格式

最後附上pyhton和java語言實現RSA和AES加密的文章:
python實現RSA與AES混合加密
java實現RSA與AES混合加密
python,java跨語言RSA+AES混合加密解密以及踩過的那些坑

閱讀全文

與phprsa公鑰私鑰生成相關的資料

熱點內容
電腦伺服器地址ip地址 瀏覽:823
對矩陣壓縮是為了 瀏覽:910
setfacl命令 瀏覽:172
linux子系統中斷 瀏覽:342
linux查看進程ps 瀏覽:224
知識庫系統php 瀏覽:623
小波變換壓縮圖像python 瀏覽:151
阿里巴巴程序員怎麼月入百萬 瀏覽:173
如何使用國外伺服器 瀏覽:188
燃燈者pdf 瀏覽:468
編譯器用數學嗎 瀏覽:7
圖形化apk反編譯工具 瀏覽:48
考勤表加密怎麼辦 瀏覽:735
arj壓縮與解壓批處理怎麼寫 瀏覽:658
php和大數據哪個好 瀏覽:930
未來最值得投資的加密貨幣 瀏覽:526
ascii碼是編譯的時候用嗎 瀏覽:781
壓縮機感應包可以通用嗎 瀏覽:413
方舟伺服器怎麼發布到搜索列表 瀏覽:271
xml防反編譯 瀏覽:242