使用phpopenssl扩展实现非对称加密

author author     2022-08-04     745

关键词:

php的openssl扩展可对数据进行签名,也可对数据进行非对称加密。非对称加密使用私钥加密,公钥解密。

这里介绍openssl实现非对称加密

可使用linux自带的RSA密钥生成工具openssl,获取一对公私钥,也可使用php openssl扩展函数生成一对公私钥

先说第一种:

执行以下命令:

openssl genrsa -out rsa_private_key.pem 1024
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

第一条命令生成原始 RSA私钥文件 rsa_private_key.pem,第二条命令将原始 RSA私钥转换为 pkcs8格式,第三条生成RSA公钥 rsa_public_key.pem
从上面看出通过私钥能生成对应的公钥,因此我们将私钥private_key.pem用在服务器端,公钥发放给android ios 桌面程序等客户端

笔者生成的一对公私钥如下:

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+gDNj4Ag6MvL+yfrHdX4qeQFa

J1epFQXBmOsSWBKoXF5haWM6d5gtETO8FRC6RcwpEKZyy7iSyZ70m4EtGMNQvoOT

gHvIceb5GHGBqqMawTjI71P69DYBjWZoLGt/IX3YJixub8nfTG5KW720LXtT/dXn

PAN9jy21h+TfcXvDgwIDAQAB

-----END PUBLIC KEY-----


-----BEGIN RSA PRIVATE KEY-----

MIICXAIBAAKBgQC+gDNj4Ag6MvL+yfrHdX4qeQFaJ1epFQXBmOsSWBKoXF5haWM6

d5gtETO8FRC6RcwpEKZyy7iSyZ70m4EtGMNQvoOTgHvIceb5GHGBqqMawTjI71P6

9DYBjWZoLGt/IX3YJixub8nfTG5KW720LXtT/dXnPAN9jy21h+TfcXvDgwIDAQAB

AoGAEkfZJp9sCrGy8dJOF2/l8It2HsGhvt7+k2pqPHNpLvDWOcDUPdsWJlT9QvI+

jbF++v3XCzMTfjqM32pAxiQXMfEDcF26wkZtB8E+QVtV0rR9I1OP0wTtfw1tWkd5

cEgfoIrEhaADrxDtLOSDJfDKTKB72H98Lu3iV2iF6igFnQECQQDfLv6eFbH1wmn1

yGq3mR5z1f2yGdSngcgcC53qW8gl6GjjXlyzepz3o+wQ2fk1sLQ+xVGRy7UQHszl

PIDIVaaBAkEA2oL4kQW8jtB+b086ItINyw08x8jCf6Wcmw/SUytdNAGFy8csifwD

FweY9mxH0Cy/ynF3NA+2LQZO0Bz2/DLQAwJAI1lCIq+0/APK3I7duC6cUCR4hhjp

QY6grzB31oKq9LYWxsxPSm4FJoPkA9dCTWqrYbXG8ZyeFOuL8FLg4toOAQJBAIjE

iUhcStUo8rpA4KaCy1dYhb6WjgbPZeI4WPDtp3yxp0kQ9XO4ZUa43qj+xUQrfi/8

LRxM6T3tQM9KEd1xAHkCQGR8bklYgPvgT6Aep/Nq7NZq24N3NC7FY8YxZ85rKpTl

Tnm0UJ8WBNg43uztQ4MJ1IFSwVEOlUVm5VYvV+IIunM=

-----END RSA PRIVATE KEY-----


示例代码如下:

<?php
/**
 * Created by PhpStorm.
 * User: chenxiaolong
 * Date: 2016/9/10
 * Time: 16:31
 */

$private_key_path = ‘rsa_private_key.pem‘;
$public_key_path = ‘rsa_public_key.pem‘;
$private_key = file_get_contents($private_key_path);
$public_key = file_get_contents($public_key_path);
//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id,不可用返回false
$pi_key =  openssl_pkey_get_private($private_key);
//这个函数可用来判断公钥是否是可用的,同上
$pu_key = openssl_pkey_get_public($public_key);
$data = "hello";//原始数据
$encrypted = "";
$decrypted = "";

//私钥加密,也可使用openssl_public_encrypt公钥加密,然后使用openssl_private_decrypt解密,加密后数据在$encrypted
openssl_private_encrypt($data,$encrypted,$pi_key);
//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
$encrypted = base64_encode($encrypted);
//私钥加密的内容通过公钥可解密出来,公钥加密的可用私钥解密。不能混淆
openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);
echo $decrypted; // hello


//私钥加密
openssl_private_encrypt($data,$encrypted,$pi_key);
$encrypted = base64_encode($encrypted);
//公钥解密
openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);
echo $decrypted; //hello


使用PHP自己也可生成一对公私钥。代码如下:

$config = array(
    "digest_alg" => "sha512",
    "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);
// 创建公私钥
$res = openssl_pkey_new($config);
// 获得私钥 $privKey
openssl_pkey_export($res, $privKey);
// 获得公钥 $pubKey
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
$data = ‘hello‘;
// 私钥加密
openssl_private_encrypt($data, $encrypted ,$privKey);
// 公钥解密
openssl_public_decrypt($encrypted, $decrypted, $pubKey);
echo $decrypted;

两种方式没有本质区别,只是生成公私钥的方式不同。


非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。如果既想有很快的加密速度又想保证数据比对称加密更加安全,可对数据进行对称加密,对秘钥做非对称加密,因为一般秘钥的长度会小于数据的长度。


php openssl还可实现数字签名。关于openssl实现数字签名的内容请查看php.net官方网址。



参考博文:

数字签名 http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

非对称加密 http://www.cnblogs.com/jfzhu/p/4020928.html



密码学基础(对称加密和非对称加密)(代码片段)

密码学基础分类对称加密非对称加密两类加密的特点结合使用举例凯撒密码代码实现-加密代码实现-解密main函数及文件加密分类一般分为:对称加密非对称加密对称加密加密和解密使用的是同一个密钥或者,两者可以互... 查看详情

常用加密算法之非对称加密算法

...,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。非对称加密算法实现机密信 查看详情

对称加密和非对称加密

1.什么是对称加密,非对称加密对称加密是指加解密使用的是同样的密钥非对称加密是指加解密使用的密钥不同。2.对称加密的优缺点对称加密的特点是简单快速。密钥越大,加密越强,但加解密过程越慢。密钥容易被黑客拦截3.... 查看详情

go语言实现对称加密算法aesdes3des和非对称加密算法rsa(代码片段)

...称加密算法2.3.1RSA最后1.对称加密算法1.1特点加密和解密使用的是同一个密钥,数据私密性双向保证,也就是加密和解密都不能泄露密码1.2优缺点优点:加密效率 查看详情

密码学基础(对称加密和非对称加密)(代码片段)

密码学基础分类对称加密非对称加密两类加密的特点结合使用举例凯撒密码代码实现-加密代码实现-解密main函数及文件加密分类一般分为:对称加密非对称加密对称加密加密和解密使用的是同一个密钥或者,两者可以互... 查看详情

对称加密算法和非对称加密算法

对称加密对称加密,是指,加密方和解密方使用同样的秘钥来进行加密和解密。在对称加密算法中,数据发信方将明文(原始数据)和加密(密钥)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。常用的对称... 查看详情

https协议的简单理解

...别一.对称加密和非对称加密  对称加密:加密和解密使用同一密钥。  非对称加密:有公钥和私钥,一般时使用公钥进行加密,使用私钥进行解密。二.https协议的请求流程  1.客户端发送请求到达服务器,服务器返回证书... 查看详情

tls过程(dh非对称加密)

...安全套件协商加密解密参数当一个TLS会话建立好之后,会使用对称加密的密钥去通信,那么如何实现事先将对称加密的密钥传递给TLS会话的另一方呢。利用的就是非对称加密。分对称加密比对称加密慢数千倍,所以只是使用对称... 查看详情

go-加密学-非对称加密(代码片段)

...加密完成秘钥的分发httpsAlice和Bob通信,Alice给bob发送数据,使用对称加密的方式生成一个非对称的秘钥对,bob生成bob将公钥发送给alicealice生成一个用于对称加密的秘钥alice使用bob的公钥就对称加密的秘钥进行加密,并且发送给bobbob使... 查看详情

go-加密学-非对称加密(代码片段)

...加密完成秘钥的分发httpsAlice和Bob通信,Alice给bob发送数据,使用对称加密的方式生成一个非对称的秘钥对,bob生成bob将公钥发送给alicealice生成一个用于对称加密的秘钥alice使用bob的公钥就对称加密的秘钥进行加密,并且发送给bobbob使... 查看详情

https结合使用对称加密和非对称加密

...。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。对称加密通常使用的是相对较小的密钥,一般小于256bit。因为密钥越大 查看详情

非对称加密

  上一篇文章中讲到对称加密,客户端和服务端使用的都是同一个密钥key。这样存在一定安全风险,如果客户端如app被人逆向破解或反编译,那么密钥key就可能会被暴露。在这种情况我们就会想到非对称加密的方式,非对称加... 查看详情

(68)对称加密和非对称加密的区别

...区别就是加密算法的不同:对称加密算法在加密和解密时使用的是同一个秘钥,而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(简称公钥)和私有密钥(简称私钥)。加密,需要对加密和解密使用相... 查看详情

对称加密和非对称加密

对称加密:1解释  加密和解密使用的是同样的密钥2优点  简单快速,密钥越大,加密越强,但加解密过程越慢3缺点   密钥容易被拦截 非对称加密:1解释  加密和解密使用的是不同的密钥2优点  相对安全(解... 查看详情

ssl证书背后的加密技术--非对称加密和对称加密

...接。一、非对称加密非对称加密(或公钥加密)使用单独的密钥进行加密和解密。任何人都可以使用加密密钥(公钥)来加密消息。但是,解密密钥(私钥)是秘密的。这样,只有预期的接收者才... 查看详情

https内容介绍

...是因为HTTPS协议会对传输的数据进行加密,而加密过程是使用了非对称加密实现。但其实,HTTPS在内容传输的加密上使用的是对称加密,非对称加密只作用在证书验证阶段。1.1、Https实现的过程?HTTPS的整体过程分为证书验证和数... 查看详情

非对称加密

...加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(publickey)和私钥(privatekey)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行... 查看详情

对称加密与非对称加密(代码片段)

...。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中。对称加密通常使用的是相对较小的密钥,一般小于256bit。因为密钥越大,加密越强,但加密与解密的过程越慢 查看详情