欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

php非,PHP实现非对称加密

发布时间:2025/4/16 46 豆豆
生活随笔 收集整理的这篇文章主要介绍了 php非,PHP实现非对称加密 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

非对称加密

至于什么是非对称加密,这里就不说啦,大家谷歌去吧。这里说明的是,最近在做一个对外的充值加密服务,那么涉及到这个加密的处理,中间遇到几个小问题,所以记录下,方便自己下次查阅。

详细代码

/**

* 使用openssl实现非对称加密

*

* @since 2015-11-10

*/

class Rsa

{

/**

* 私钥

*

*/

private $_privKey;

/**

* 公钥

*

*/

private $_pubKey;

/**

* 保存文件地址

*/

private $_keyPath;

/**

* 指定密钥文件地址

*

*/

public function __construct($path)

{

if (empty($path) || !is_dir($path)) {

throw new Exception('请指定密钥文件地址目录');

}

$this->_keyPath = $path;

}

/**

* 创建公钥和私钥

*

*/

public function createKey()

{

$config = [

"config" => 'D:\wamp\bin\apache\apache2.4.9\conf\openssl.cnf',

"digest_alg" => "sha512",

"private_key_bits" => 4096,

"private_key_type" => OPENSSL_KEYTYPE_RSA,

];

// 生成私钥

$rsa = openssl_pkey_new($config);

openssl_pkey_export($rsa, $privKey, NULL, $config);

file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key', $privKey);

$this->_privKey = openssl_pkey_get_public($privKey);

// 生成公钥

$rsaPri = openssl_pkey_get_details($rsa);

$pubKey = $rsaPri['key'];

file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key', $pubKey);

$this->_pubKey = openssl_pkey_get_public($pubKey);

}

/**

* 设置私钥

*

*/

public function setupPrivKey()

{

if (is_resource($this->_privKey)) {

return true;

}

$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'priv.key';

$privKey = file_get_contents($file);

$this->_privKey = openssl_pkey_get_private($privKey);

return true;

}

/**

* 设置公钥

*

*/

public function setupPubKey()

{

if (is_resource($this->_pubKey)) {

return true;

}

$file = $this->_keyPath . DIRECTORY_SEPARATOR . 'pub.key';

$pubKey = file_get_contents($file);

$this->_pubKey = openssl_pkey_get_public($pubKey);

return true;

}

/**

* 用私钥加密

*

*/

public function privEncrypt($data)

{

if (!is_string($data)) {

return null;

}

$this->setupPrivKey();

$result = openssl_private_encrypt($data, $encrypted, $this->_privKey);

if ($result) {

return base64_encode($encrypted);

}

return null;

}

/**

* 私钥解密

*

*/

public function privDecrypt($encrypted)

{

if (!is_string($encrypted)) {

return null;

}

$this->setupPrivKey();

$encrypted = base64_decode($encrypted);

$result = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);

if ($result) {

return $decrypted;

}

return null;

}

/**

* 公钥加密

*

*/

public function pubEncrypt($data)

{

if (!is_string($data)) {

return null;

}

$this->setupPubKey();

$result = openssl_public_encrypt($data, $encrypted, $this->_pubKey);

if ($result) {

return base64_encode($encrypted);

}

return null;

}

/**

* 公钥解密

*

*/

public function pubDecrypt($crypted)

{

if (!is_string($crypted)) {

return null;

}

$this->setupPubKey();

$crypted = base64_decode($crypted);

$result = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);

if ($result) {

return $decrypted;

}

return null;

}

/**

* __destruct

*

*/

public function __destruct() {

@fclose($this->_privKey);

@fclose($this->_pubKey);

}

}

?>

测试

$rsa = new Rsa('ssl-key');

//私钥加密,公钥解密

echo "待加密数据:segmentfault.com\n";

$pre = $rsa->privEncrypt("segmentfault.com");

echo "加密后的密文:\n" . $pre . "\n";

$pud = $rsa->pubDecrypt($pre);

echo "解密后数据:" . $pud . "\n";

//公钥加密,私钥解密

echo "待加密数据:segmentfault.com\n";

$pue = $rsa->pubEncrypt("segmentfault.com");

echo "加密后的密文:\n" . $pue . "\n";

$prd = $rsa->privDecrypt($pue);

echo "解密后数据:" . $prd;

重要问题

这里特别要注意的是在配置中要指定openssl.cnf的文件地址,或者设置个OPENSSL_CONF全局变量就可以了。

总结

以上是生活随笔为你收集整理的php非,PHP实现非对称加密的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。