$config = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
); $private_key_passwd = '123456'; //私钥密码
$expire = 365; //有效时长
$cer_path = "./test.cer"; //生成证书路径
$pfx_path = "./test.pfx"; //密钥文件路径 $dn = array(
"countryName" => "CN", //所在国家
"stateOrProvinceName" => "ANHUI", //所在省份
"localityName" => "HEFEI", //所在城市
"organizationName" => "Mr.sui", //注册人姓名
"organizationalUnitName" => "sui Team", //组织名称
"commonName" => "lucky", //公共名称
"emailAddress" => "sui@qq.com" //邮箱
); // 生成公钥私钥资源
$res = openssl_pkey_new($config); // 导出私钥 $private_key
openssl_pkey_export($res, $private_key,null,$config); // 导出公钥 $pubKey
$public_key = openssl_pkey_get_details($res);
$public_key = $public_key["key"];
//print_r($private_key); 私钥
//print_r($public_key); 公钥 //直接测试私钥 公钥
echo '-------------------公私钥加解密T---------------------'.PHP_EOL;
$data = '我是 data,哈哈哈';
// 公钥加密
openssl_public_encrypt($data, $encrypted, $public_key);
// 私钥解密
openssl_private_decrypt($encrypted, $decrypted, $private_key); echo '公钥加密:',base64_encode($encrypted).PHP_EOL;
echo '私钥解密后的数据:'. $decrypted.PHP_EOL;
echo '-------------------公私钥加解密-END---------------------'.PHP_EOL; echo '-------------------生产证书---------------------'.PHP_EOL;
//生成文件
$csr = openssl_csr_new($dn, $private_key,$config); //基于$dn生成新的 CSR (证书签名请求)
$sscert = openssl_csr_sign($csr, null, $private_key, 365,$config);//根据配置自己对证书进行签名
openssl_x509_export($sscert, $csrkey); //将公钥证书存储到一个变量 $csrkey,由 PEM 编码格式命名。
openssl_pkcs12_export($sscert, $new_private_key, $private_key, $private_key_passwd); //将私钥存储到名为的出 PKCS12 文件格式的字符串。 导出密钥$new_private_key //生成证书文件
$fp = fopen($cer_path, "w");
fwrite($fp, $csrkey);
fclose($fp);
//生成密钥文件
$fp = fopen($pfx_path, "w");
fwrite($fp, $new_private_key);
fclose($fp);
echo '-------------------生产证书END---------------------'.PHP_EOL; echo '----------------------自签名验证-START----------------------'.PHP_EOL;
// 测试私钥 秘钥
$private_key_passwd = '123456'; //私钥密码
$pfx_path = "./test.pfx"; //密钥文件路径
$priv_key = file_get_contents($pfx_path); //获取密钥文件内容
$data = "测试数据!"; //加密数据测试test
//私钥加密
openssl_pkcs12_read($priv_key, $certs, $private_key_passwd); //读取公钥、私钥
$prikeyid = $certs['pkey']; //私钥
openssl_sign($data, $signMsg, $prikeyid,OPENSSL_ALGO_SHA1); //注册生成加密信息
$signMsg = base64_encode($signMsg); //base64转码加密信息 //公钥解密
$unsignMsg = base64_decode($signMsg);//base64解码加密信息
openssl_pkcs12_read($priv_key, $certs, $private_key_passwd); //读取公钥、私钥
$pubkeyid = $certs['cert']; //公钥
$res = openssl_verify($data, $unsignMsg, $pubkeyid); //验证
echo $res?'证书测试成功!':'证书测试失败!'; //输出验证结果,1:验证成功,0:验证失败
var_dump($res);
echo '-----------------------签名验证-END------------------------',PHP_EOL;

注释:

x509,公钥证书,只有公钥。
p7,签名或加密。可以往里面塞x509,同时没有签名或加密内容。
p12,含有私钥,同时可以有公钥,有口令保护。
p7的作用就是电子信封。
X509是基本规范
P7和P12是两个实现规范,P7是数字信封,P12是带有私钥的证书规范。
x509是数字证书的规范,P7和P12是两种封装形式。比如说同样的电影,有的是avi格式,有的是mpg,大概就这个意思。

P7一般是把证书分成两个文件,一个公钥一个私钥,有PEM和DER两种编码方式。PEM比较多见,就是纯文本的,P7一般是分发公钥用,看到的就是一串可见字符串,扩展名经常是.crt,.cer,.key等。DER是二进制编码。
P12是把证书压成一个文件,.pfx 。主要是考虑分发证书,私钥是要绝对保密的,不能随便以文本方式散播。所以P7格式不适合分发。.pfx中可以加密码保护,所以相对安全些。
在实践中要中,用户证书都是放在USB Key中分发,服务器证书经常还是以文件方式分发。服务器证书和用户证书,都是X509证书,就是里面的属性有区别。

X509 是证书规范
PKCS#7 是消息语法 (常用于数字签名与加密)
PKCS#12 个人消息交换与打包语法 (如.PFX .P12)打包成带公钥与私钥

php openssl 加密解密的更多相关文章

  1. OpenSSL & 加密解密

    OpenSSL&加密解密(思维导图) 1. 网络通信概述 传输层协议 进程间通信 监听端口 SSL 裸套接字 2. 加密和解密 2.1 加密的方式 对称加密 公钥加密 单向加密 认证加密 2. ...

  2. PHP加密解密方法,使用openssl加密解密

    /** * des 加密算法 */ function do_mencrypt($input, $key) { if (!function_exists("mcrypt_module_open ...

  3. Linux下OpenSSL加密解密压缩文件(AES加密压缩文件)

    OpenSSL是一个开源的用以实现SSL协议的产品,它主要包括了三个部分:密码算法库.应用程序.SSL协议库.Openssl实现了SSL协议所需要的大多数算法.下面介绍使用Openssl进行文件的对称 ...

  4. OpenSSl 加密解密 示例(终于有编程实践了)

    OPenSSl的加密主要有三个重要的函数.看懂下面的代码就基本上知道该如何使用openssL来加密了. 不过注意,要先将libssl.so.1.0和libcrypto.so.1.0文件复制到执行的文件 ...

  5. openssl生成CA签署 及 加密解密基础

    openssl  生成私有CA 及签署证书 openssl 配置文件: /etc/pki/tls/openssl.cnf 1. 在openssl CA 服务器端生成私钥 cd /etc/pki/CA/ ...

  6. linux openssl加密文件

    openssl 支持的加密算法 -aes-128-cbc -aes-128-cfb -aes-128-cfb1 -aes-128-cfb8 -aes-128-ecb -aes-128-ofb -aes ...

  7. php使用openssl进行Rsa长数据加密(117)解密(128) 和 DES 加密解密

    PHP使用openssl进行Rsa加密,如果要加密的明文太长则会出错,解决方法:加密的时候117个字符加密一次,然后把所有的密文拼接成一个密文:解密的时候需要128个字符解密一下,然后拼接成数据. 加 ...

  8. openssl evp RSA 加密解密

    openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...

  9. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互

    (以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...

随机推荐

  1. PHP SPL标准库-迭代器

    通过某种统一的方式遍历链表或者数组中的元素的过程叫做迭代遍历,这种统一的遍历工具我们叫做迭代器. PHP中迭代器是通过Iterator 接口定义的. ArrayIterator迭代器 foreach ...

  2. C++switch结构

  3. JavaWeb学习笔记(六)jsp

    第六章.jsp 1.什么是jsp jsp:java server pages,java的服务器页面 作用:代替Servlet回传HTML页面的数据 因为Servlet程序回传HTML页面的数据很繁琐, ...

  4. 3分钟学完Python,直接从入门到精通

    作为帅气小编,我已经把python一些模块的甩在这儿了qwq,只要你拿到这些干货,包你玩转python,直接冲向"大佬"的段位,如果已经学了C或者C++或者说如果你需要你的一段关键 ...

  5. Semaphore(信号灯)

    public class SemaphoreDemo { public static void main(String[] args) { //三个停车位 Semaphore sp = new Sem ...

  6. react-native-image-picker用法

    1, 首先,安装下该插件. npm install react-native-image-picker@latest --save 2,自动安装(做了这一步 下面安装的平台设置大部分都自动添加好了) ...

  7. JUC---01阻塞队列(BlockingQueue)

    一.什么是阻塞队列 阻塞队列是一个队列,在数据结构中起的作用如上图:当队列是空的,从队列中获取元素的操作将会被阻塞:当队列是满的,从队列中添加元素的操作将会被阻塞 1.为什么需要BlockingQue ...

  8. Windows炫酷桌面钢铁侠主题 雨滴 Rainmeter

    首先附上我现在的这个桌面,喜欢的话可以直接使用,我在公众号中设置了回复,[雨滴桌面下载]可以查看下载链接. 介绍一下我们用的工具. Rainmeter 雨滴程序 喜欢的人有研究应该都知道这个程序 这里 ...

  9. Visual Studio 2017 创建Winfrom工程

    1.打开Visual Studio 2017,出现界面点击-创建新项目 2.选择-Window桌面,选择windows 窗体应用(.NET Framework) 3.完成窗体程序创建,可在左边工具栏里 ...

  10. Vmware - 安装并启动 Centos 7

    下载 Linux 安装包 http://mirrors.aliyun.com/centos/7.8.2003/isos/x86_64/ 不同版本的 Centos https://mirrors.ali ...