PHP之 通过ecc,sm2加密证书实现 sm2国密 加密

SM2

为非对称加密,基于 ECC。该算法已公开。由于该算法基于 ECC,故其签名速度与秘钥生成速度都快于 RSA。ECC 256 位(SM2 采用的就是 ECC 256 位的一种)安全强度比 RSA 2048 位高,但运算速度快于 RSA。

openssl_pkey_get_public

--- 从证书中解析公钥 , php使用这个函数可以获取 rsa的公钥,sm2证书的一直获取不到,切换php版本,有的可以解析,有的不可以

使用openssl 获取证书 公钥一直报错

php中openssl_public_encrypt进行sm2加密,报错openssl_public_encrypt(): key typ
php中用openssl_pkey_get_public获取不到ecc算法的公钥

php想要进行sm2加密的话,需要使用扩展 例如 GmSSL openssl-ext-sm2

git 地址

https://github.com/GmSSL/GmSSL-PHP

https://github.com/guanzhi/GmSSL/tree/GmSSL-v2

https://gitee.com/state-secret-series/openssl-ext-sm2

参考

https://blog.csdn.net/markximo/article/details/128124885

https://blog.csdn.net/weixin_37644303/article/details/140121305

https://gitcode.csdn.net/65acad86b8e5f01e1e452089.html

https://blog.csdn.net/yifan_lion/article/details/106353657

https://blog.csdn.net/weixin_34392511/article/details/116122485

证书格式

PEM

DER格式是ASN.1数据的二进制编码,计算机处理方便,但不利于人类处理,比如不方便直接在邮件正文中粘贴发送。PEM是DER格式的BASE64编码。除此之外,PEM在DER的BASE64前后各增加了一行,用来标识数据内容。示例如下:

复制代码
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMYfnvWtC8Id5bPKae5yXSxQTt
+Zpul6AnnZWfI2TtIarvjHBFUtXRo96y7hoL4VWOPKGCsRqMFDkrbeUjRrx8iL91
4/srnyf6sh9c8Zk04xEOpK1ypvBz+Ks4uZObtjnnitf0NBGdjMKxveTq+VE7BWUI
yQjtQ8mbDOsiLLvh7wIDAQAB
-----END PUBLIC KEY-----

X.509

X.509是一项描述公钥证书结构的标准,广泛使用在HTTPS协议中,定义在RFC 3280

X.509使用ASN.1来描述公钥证书的结构,通常编码为DER格式,也可以进一步BASE64编码为可打印的PEM格式。

将crt转换为cer格式

复制代码
openssl x509 -in /usr/local/openssl/ssl/CA/SecondCA.crt -out /usr/local/openssl/ssl/CA/SecondCA.cer

证书编码的转换

复制代码
openssl x509 -in cert.crt -outform der -out cert.der               ##PEM转为DER 
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem   ##DER转为PEM 

查看证书方法

复制代码
openssl x509 -in /usr/local/openssl/ssl/CA/SecondCA.crt -noout -text

1.3 pem和der

参考:PEM 与 DER 格式详解

PEM 与 DER是用于存储、传输密钥和证书的标准格式,两者紧密关联,可以互相转换。

ASN.1 ------(序列化)------ DER ------(Base64编码)------ PEM

对 ASN.1 序列化后,就会生成一个二进制串,这个就是 DER 格式。

将二进制进行 Base64 编码,再加上 PEM 格式特有的头尾两行,就生成了 PEM 格式。

PEM 和 DER 的主要区别在于它们的编码方式

复制代码
DER: 二进制格式,ASN.1结构的直接编码,更紧凑。后缀通常为 .der 和 .cer。
PEM: 使用 Base64 编码,可读性更好,但文件大小更大。后缀通常为.pem、.cer、.crt、.key

1.3.1 PEM 转 DER

复制代码
先将 PEM 文件里面首尾的 ----BEGIN xxx---- 和 ----END xxx----两行去掉
再将内容合并为一行(去掉换行符\r\n)
接着将内容进行 Base64 解码得到原始二进制数据。

通过 openssl 命令转换如下:

openssl rsa -in rsa_private.pem -outform DER -out rsa_private.der

1.3.2 DER 转 PEM

复制代码
先将 DER 二进制内容进行 Base64 编码
再按每行 64 个字节进行切分
最后在切分后的内容前后加上 ----BEGIN xxx----和 ----END xxx----

通过 openssl 命令转换如下:

openssl rsa -inform DER -in rsa_private.der -outform PEM -out rsa_private2.pem

4.数字证书

4.1 查看证书序列号

复制代码
openssl x509 -in xx.cer -noout -serial

4.2 获取证书中的公钥(PKCS8)

复制代码
openssl x509 -in xx.cer -pubkey  -noout > xx.pem
相关推荐
dog2504 小时前
网络长尾延时的重尾本质
开发语言·网络·php
其实防守也摸鱼8 小时前
无线网络安全--10 规避WLAN验证之挫败MAC地址限制
网络·智能路由器·php·教程·虚拟机·wlan·无线网络安全
浩风祭月10 小时前
我用 AI 辅助重构了遗留项目的认证模块:从明文存储到 OAuth 2.0 的安全升级
后端·php·ai编程
宋拾壹10 小时前
fastadmin列表中查看列表,并且添加增加相应的数据
javascript·php·fastadmin
weixin_4462608511 小时前
LLM智能体在社交模拟中的决策行为分析:有限状态与LLM-based策略对比研究
开发语言·php
唐青枫13 小时前
Php Doctrine ORM 实战详解:从实体映射到查询、关联与事务
php·symfony
一直奔跑在路上14 小时前
深入浅出RDMA:原理、应用与实战指南
开发语言·php
右耳朵猫AI15 小时前
PHP周刊2026W23 | Composer 2.10、Symfony 8.1、Twig 3.27.1、PHP 8.5、Laravel AI SDK
php·composer·symfony
2401_834636991 天前
Nginx 从入门到实战:静态 / 动态站点、PHP 部署与反向代理全解析
运维·nginx·php
绵绵细雨中的乡音1 天前
监控显示一切正常,可用户根本打不开网站——Blackbox Exporter帮我找到了真相(1)
开发语言·php