PHP開發介面使用RSA進行加密解密方法

2021-09-08 13:43:13 字數 4179 閱讀 7741

網路安全問題很重要,尤其是保證資料安全,遇到很多在寫介面的程式設計師直接都是明文資料傳輸,在我看來這是很不專業的。本人提倡經過介面的資料都要進行加密解密之後進行使用。

簡單介紹rsa:

rsa加密演算法是最常用的非對稱加密演算法,cfca在證書服務中離不了它。但是有不少新手對它不太了解。下面僅作簡要介紹。rsa是第乙個比較完善的公開金鑰演算法,它既能用於加密,也能用於數字簽名。rsa以它的三個發明者ron rivest, adi shamir, leonard adleman的名字首字母命名,這個演算法經受住了多年深入的密碼分析,雖然密碼分析者既不能證明也不能否定rsa的安全性,但這恰恰說明該演算法有一定的可信性,目前它已經成為最流行的公開金鑰演算法。rsa的安全基於大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進位制數或更大)的函式。從乙個公鑰和密文恢復出明文的難度,等價於分解兩個大素數之積(這是公認的數學難題)。 

下面為具體類、例項:

<?php

/*** rsa演算法類

* 簽名及密文編碼:base64字串/十六進製制字串/二進位制字串流

* 填充方式: pkcs1padding(加解密)/nopadding(解密)

** notice:only accepts a single block. block size is equal to the rsa key size!

* 如金鑰長度為1024 bit,則加密時資料需小於128位元組,加上pkcs1padding本身的11位元組資訊,所以明文需小於117位元組

** @author: zhihua_wei

* @version: 1.0.0

* @date: 2017/06/30

*/class

rsa

if ($private_key_file

) }

//私有方法/**

* 自定義錯誤處理

*/private

function _error($msg

)

/*** 檢測填充型別

* 加密只支援pkcs1_padding

* 解密支援pkcs1_padding和no_padding

** @param int 填充模式

* @param string 加密en/解密de

* @return bool

*/private

function _checkpadding($padding, $type

)

} else

}return

$ret

; }

private

function _encode($data, $code

)

return

$data

; }

private

function _decode($data, $code

)

return

$data

; }

private

function _getpublickey($file

)

}private

function _getprivatekey($file

)

}private

function _readfile($file

) is not exists");

} else

return

$ret

; }

private

function _hex2bin($hex = false

)

/*** 生成簽名

** @param string 簽名材料

* @param string 簽名編碼(base64/hex/bin)

* @return 簽名值

*/public

function sign($data, $code = 'base64')

return

$ret

; }

/*** 驗證簽名

** @param string 簽名材料

* @param string 簽名值

* @param string 簽名編碼(base64/hex/bin)

* @return bool

*/public

function verify($data, $sign, $code = 'base64')

}return

$ret

; }

/*** 加密

** @param string 明文

* @param string 密文編碼(base64/hex/bin)

* @param int 填充方式(貌似php有bug,所以目前僅支援openssl_pkcs1_padding)

* @return string 密文

*/public

function encrypt($data, $code = 'base64', $padding =openssl_pkcs1_padding)

return

$ret

; }

/*** 解密

** @param string 密文

* @param string 密文編碼(base64/hex/bin)

* @param int 填充方式(openssl_pkcs1_padding / openssl_no_padding)

* @param bool 是否翻轉明文(when passing microsoft cryptoapi-generated rsa cyphertext, revert the bytes in the block)

* @return string 明文

*/public

function decrypt($data, $code = 'base64', $padding = openssl_pkcs1_padding, $rev = false

)

}return

$ret

; }

}

此為具體的rsa類。

<?php  

/**

* author: wei zhihua

* date: 2017/6/30 0030

* time: 上午 10:15 */

header('content-type:text/html;charset=utf-8;');

include "rsa.php";

echo '';

$pubfile = 'd:\www\test\rsa_public_key.pem';

$prifile = 'd:\www\test\rsa_private_key.pem';

$rsa = new rsa($pubfile, $prifile

);

$rst = array

( 'ret' => 200,

'code' => 1,

'data' => array(1, 2, 3, 4, 5, 6),

'msg' => "success",);

$ex = json_encode($rst

);

//加密

$ret_e = $rsa->encrypt($ex

);

//解密

$ret_d = $rsa->decrypt($ret_e

);

echo

$ret_e

; echo '';

echo

$ret_d

;

echo '';

$a = 'test';

//簽名

$x = $rsa->sign($a

);

//驗證

$y = $rsa->verify($a, $x

);

var_dump($x, $y

);

exit;

使用方法。

python使用快速乘方求冪進行RSA加解密

rsa演算法原理 1978年美國麻省理工學院的三名密碼學者r.l.rivest,a.shamir和l.adleman提出了一種基於大合數因子分解困難性的公開金鑰密碼,簡稱為rsa密碼。rsa密碼被譽為是一種風格幽雅的公開金鑰密碼。既可用於加密,又可用於數字簽名,安全 易懂,它已成為目前應用最廣泛的公...

使用RSA對資料進行加簽且驗籤

加簽驗籤是為了驗證接收到的資料的真實性問題,但此次我的應用場景是這樣的 因為要從乙個系統傳送http請求到另乙個系統的網域名稱上去獲取相應的資料,但是被請求的這個網域名稱是外網網域名稱 任何人都能通過請求這個網域名稱位址來獲取資料 所以簡單的使用簽名來做一下校驗,驗籤不通過的請求則不允許獲取資料。下...

Postman報文進行加密之RSA公鑰加密

rsa公鑰加密和私鑰加密整個結構是一致的,postman報文進行加密之rsa bate64 中私鑰做的簽名,這裡rsa公鑰是進行加密。rsa 使用公鑰對 aes密碼進行加密 functionpubencrypt pubencrypt key aeskey console info pulencryp...