php生成秘鑰和公鑰,php支付寶公鑰

本文目錄一覽:

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

附上出處鏈接:

四,用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-getModulus()));

}

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 modulus

$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加密解決。

不過,對中間人攻擊還是沒辦法。

另外一個

用PHP如何實現數字簽名啊··跪求高人指點···

以下是資料:

php中數字簽名與校驗

1. 先用php生成一對公鑰和私鑰

$res = openssl_pkey_new();

openssl_pkey_export($res,$pri);

$d= openssl_pkey_get_details($res);

$pub = $d[‘key’];

var_dump($pri,$pub);

輸出依次為私鑰和公鑰的pem字串,如:

string(916) “—–BEGIN PRIVATE KEY—–

MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKs124okAnX5jh1Q

wsETi80b4ZyYlYUSsAtvS7ZG+GSLAox24TKNwWIy5cUdKfK/5QEJjZ0S8LjRSYCG

to9LkwQTQrKY8BBXVCQQS3VXRqz4on9bmcGSyLMK6vQxt9NnJpk6aBmJE7z35+8z

TTLwdUbYaMAcYqrsYDfgBSNBgwbDAgMBAAECgYBvolJfpFMmcW3El6AlHIWPW5qj

7KmxdxnqmssXMvdLN4iV5f24ZM2vJdjDydxMN+st3fjEblEfcPcoIq5uiKx2bnO3

f9g0yt+qUoXdz4LK6jV1NfuAZDcnBm7CXfE7BDREgyiRg4ZXIvp4L0Y2zBMdFTmg

LKkXb2M1P3pK53UbwQJBANupqPXFQjdHvAa3voT+UI8OhmLbw/Vyh6Ii1glwMfyq

VS2lAakj9d1hqLYZvw+eNeZBnzZNPuMJg5aj/WKUqasCQQDHiFLS7Yb1rbhfjmRt

ZL4zXuvX1hVjTNo2TeZwPniGpYa+QHcauDDep5C9q//n+D+ZtkbkECxpOVhrUHSI

KO9JAkEApl3lHd98uymVevEHVurWUMMLfSw9SlSn7WC9AwD6mwbW5G8oxtX5jOY+

RU1Sq52D7RSeZR40FvhJtXoWmudFaQJAc8E+a2epF/YENEtjL6N2RE8Y+0oTdlwr

a72dphhXy6VTmiPD9RhOIZ2MdrzF5Uk7fG0mi0Bmw1SlWvx93lABIQJBALXPeoNa

b4dQkRkfqCHtyrWOeRcC1Y6FyTfNj+cRBzdIcmFc21hxj6HKy2M6/XGI3rAE5L+B

mmlSmN1enhoCUqc=

—–END PRIVATE KEY—–

string(272) “—–BEGIN PUBLIC KEY—–

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrNduKJAJ1+Y4dUMLBE4vNG+Gc

mJWFErALb0u2RvhkiwKMduEyjcFiMuXFHSnyv+UBCY2dEvC40UmAhraPS5MEE0Ky

mPAQV1QkEEt1V0as+KJ/W5nBksizCur0MbfTZyaZOmgZiRO89+fvM00y8HVG2GjA

HGKq7GA34AUjQYMGwwIDAQAB

—–END PUBLIC KEY—–

2. 保存好自己的私鑰,把公鑰可以公開給別人。如果需要對某數據進行簽名,證明那數據是從你這裡發出的,就需要用私鑰:

$res = openssl_pkey_get_private($pri);

if (openssl_sign(‘hello’, $out, $res))

var_dump(base64_encode($out));

上例中 $pri 為自己的私鑰,’hello’ 為待簽名的數據,如果簽名成功,最後輸出為base64編碼後的簽名,如:

j19H+C/NQEcyowezOQ+gmGi2UoPJNXyJ+KwpkEzJ5u4qaRD3cY4qhfFfIosypypwJTJ4LjRYOIPNQMQm6ICj2nMdGfn/p/pp7il+xGz2aUWdOXkJFgIc/PGC95C9sLH04Tc6QSuV5IMd9rjBjyv+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演算法;數字簽名可以在 單點登錄 等系統中派上用場。

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 rsa怎麼生成公鑰和私鑰

1、加米解米的第一步是生成公鑰、私鑰對,私鑰加米的內容能通過公鑰解米(反過來亦可以)下載開源RSA米鑰生成工具openssl(通常Linux系統都自帶該程序),解壓縮至獨立的文件夾,進入其中的bin目錄,執行以下命令: 複製代碼 代碼如下: openssl …

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 項目開發中,我們使用的加密解密演算法的一個總結。博主寒冰在總結過程中難免會有不足之處,還請大家指正!謝謝!

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

原創文章,作者:WMACK,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/317818.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WMACK的頭像WMACK
上一篇 2025-01-11 16:27
下一篇 2025-01-11 16:28

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Java微信支付寶分賬指南

    本文將詳細介紹如何使用Java代碼實現微信和支付寶分賬功能,以及實現自定義分賬規則和查詢分賬結果。 一、微信支付分賬 微信支付分賬是指商戶將訂單的資金分給多個分賬接收方。常用於分潤…

    編程 2025-04-28
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台伺服器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24
  • PHP數組去重詳解

    一、array_unique函數 array_unique是php中常用的數組去重函數,它基於值來判斷元素是否重複,具體使用方法如下: $array = array(‘a’, ‘b…

    編程 2025-04-24
  • PHP導出Excel文件

    一、PHP導出Excel文件列寬調整 當我們使用PHP導出Excel文件時,有時需要調整單元格的列寬。可以使用PHPExcel類庫中的setWidth方法來設置單元格的列寬。下面是…

    編程 2025-04-24

發表回復

登錄後才能評論