php openssl_sign() 语法+RSA公私钥加密解密,非对称加密算法详解
其实有时候觉得写博客好烦,就个函数就开篇博客。很小的意见事情而已,知道的人看来多取一举,或者说没什么必要,浪费时间,不知道的人就会很郁闷。技术就是这样的,懂的人觉得真的很简单啊,不知道的人真的好难。。。
一般在跟第三方接口对接数据的时候,为了保证很多都使用的RSA签名,没性趣了解的同学只需要知道原理的同学,主需要知道“RSA非对称加/解密算法中最流行最牛逼的然后知道怎么使用它就足够了”
重点内容
如果下面的链接没有被翔的话可以直接飞机过去,关于RSA加密算法的原理有兴趣的同学可以搜索“阮一峰”的博客
RSA加密算法原理一
RSA加密算法原理二
private static function sign($data){
$pk = self::$private_key;
openssl_sign($data, $sign, $pk);
$sign = base64_encode($sign);
return $sign;
}
咋一看$sign哪里来的???,微臣不知道啊,跟一般的php函数有点不一样,捂脸….
语法是这样的:
openssl_sign(“您要签名的数据”,”签名后返回来的数据”,”签名的钥匙/可以是公钥签名也可以是私钥签名,一般是私钥加密,公钥解密”)
函数解析:
sign() 函数里面的openssl_sign(data,data,sign,pk);传入了pk);传入了data数据 openssl_sign()对data进行签名,用的是静态变量data进行签名,用的是静态变量private_key,签名完成后返回了$sign 作为签名结果,然后再base64_encode() 进行二进制编码,然后返回编码过后的签名
<?php
$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA346nvWRmWhmdpHSsai6aUfDg9SehCUsDmBNji8OXmiQJmkBO
ssN/cu3Ifap7P6sgENzZbh/SYB/+i3JeBGlQetFt+kjJQnr1lDUQlSWBBq6OyxGT
LYDw3NyFsV1BN/NdQ06HzT1k/J0AZChyLMpMR8HUWZE6stbnocdY9aDXXAILyRa6
tJ6WUwepfMUFZfQAxWkpNLVXzY+QTf95ACblqVRoqRbVNNL4AOT1FYmQyIrD9gUI
wMQaUJ+2fGJtT9m1rbLpj87BddKKw5T7TOwqwDJrEgrHQ5m3YmphAEIrM6ZreV2C
FlT4RI8kvFfivqo/TvuTO4rMITzCwvxK6+dzuwIDAQABAoIBAQCRaFVcT6hvJEgw
Bp96dRN1BqsbagpJZBxTVxEhgDfkT1pblUZa6ePE2jrU2gVOVT0HGs7l3RbV5RmI
k/vo/KMXL49MAvm9HwMKwjUl/X3d3b4NAUJsj3ia/2iKA7D+9nEL7VFRQoSj9m6h
ttkEnxRcfAtlspuuZS/GP0ZyhYpuUcMoyCXEGknvp+xCrbWPSwjZR4qrd/c5XP2H
aRn+3ZaKiZOnVR765zN+DOOBvD+AuHT0bHxg9dceir5U+cTWNQ9mopR4+lsjcxIF
BjzOFsx6nxz53Si0Lz+nKVtnUKRRTYbiXnVra3MuSVheu1MYLXDY/fGQIv0o1U8G
2s2if7NRAoGBAPBhczAwi5slugweFBvn5QC/tumvn49+A9r4eugcglDrXPbBhbcT
gzGwTogS8rT8BosowY6d4QI7sajdRtG0+Lga/plILIjif8ksJPGTnkRVFmilJN25
QSmdcU8iX60AJCpz4t6wk2rLeFfyXh+Pdi7j6/ipn9XgoW+cbODSIm7TAoGBAO4V
XEmcsNHVuX/g/QaBYEjo/kXqbnZ28/1sNAEwFZ8mI4NEah8e80lLiNyjXcGN/6UC
2UgTukkghwpKRDBNqmuOHb85Ps3Kl2WwAs2vHwdyUxbO9+z0nXBVZrE7nRUoatxy
T2fEzqWu3zVVbVdHcE5VSr5SHHbTtGYiH4P3A2Z5AoGAUBHF0rl45zcL39ltDVaT
G0rA3NpZJeztz9SQ7BwC9H1RvAf+SFtBih2WKxFUsyB39Yaf4qeIObw0k3ERk+za
JEkpoVk/LGF1+0avD6ECSPSmwDiyLQD2Saxd/+QNRo0TfuiXG2Jp2FrqPTFIVO7u
iPP2uB+YVB+85naOddzJB20CgYEAodpBoAV2q1/5OHcybB693zMN0Wf66mwZmLnb
bMdMm6Ho2I9E+Z0n1TcVdrFUxoWLOpmCLx7CMH59b0BntNLHvVCi5mG7UVmdrNKI
RV384SoWVFYlc6Aj+78DDg+xzTVp2C2Zz7iap0YHlhFaQNBfB9Gx+0qE8T8gz6H4
/NSLKjkCgYBHjrlArjQufEwC2Evz+aMpB6Ie//P7OKXVTHQZUkv5bWKCBgYbukb1
ErpDGUZqjRY0uJ3NUspcdIAYFu7vqHk7/epT1Ev6qGb6v9tkM7iudtS7LBtsfSjx
Z8G0msgfQDur9pyEVb9L3Im5K5TrzUiDZt0s1eok6WrwpiLOjNMoEw==
-----END RSA PRIVATE KEY-----';
$public_key = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA346nvWRmWhmdpHSsai6a
UfDg9SehCUsDmBNji8OXmiQJmkBOssN/cu3Ifap7P6sgENzZbh/SYB/+i3JeBGlQ
etFt+kjJQnr1lDUQlSWBBq6OyxGTLYDw3NyFsV1BN/NdQ06HzT1k/J0AZChyLMpM
R8HUWZE6stbnocdY9aDXXAILyRa6tJ6WUwepfMUFZfQAxWkpNLVXzY+QTf95ACbl
qVRoqRbVNNL4AOT1FYmQyIrD9gUIwMQaUJ+2fGJtT9m1rbLpj87BddKKw5T7TOwq
wDJrEgrHQ5m3YmphAEIrM6ZreV2CFlT4RI8kvFfivqo/TvuTO4rMITzCwvxK6+dz
uwIDAQAB
-----END PUBLIC KEY-----';
//echo $private_key;
$pi_key = openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
$pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的
echo $pi_key;echo "<hr>";
echo $pu_key;echo "<hr>";
$data = "<h3>你忙吧,我吃柠檬!</h3>";//原始数据
$encrypted = "";
$decrypted = "";
echo "---------------------------------------","私钥加密,用公钥解密:","---------------------------------------";
echo "source data:",$data,"\n";
echo "<hr>";
echo "加密内容:";
openssl_private_encrypt($data,$encrypted,$pi_key);//私钥加密
$encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
echo $encrypted,"\n";
echo "<hr>";
echo "解密开始:";
openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来
echo $decrypted,"\n";
echo "---------------------------------------","公钥加密,用私钥解密:","---------------------------------------"."<br>";
openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密
$encrypted = base64_encode($encrypted);
echo '加密内容:',$encrypted;
echo "<hr>";
echo "解密内容:";
openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密
echo $decrypted,"\n";
如果你看到图片这样的输出,就没毛病了,说明你的公钥和私钥是一对的
介绍下钥匙生成(win下):openssl钥匙生成工具点击下载
下载文件后解压,我这里放在D:\openssl目录下
打开cmd控制台 ,就是cmd进入黑窗口啦,哈哈哈…
执行命令下面命令
d:
cd openssl/bin
先生成私钥,参数1024/2048可选择rsa_private_key.pem 这个是生成的文件名,可以自定义,建议不要有中文
执行:openssl genrsa -out rsa_private_key.pem 2048
#再根据私钥生成公钥文件
执行:openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
然后就躺着一对密匙了:
然后编译器可以打开它,不推荐记事本打开
定义变量
$PRIVATE_KEY = '-----BEGIN RSA PRIVATE KEY-----
************************
************************
************************
-----END RSA PRIVATE KEY-----';
温馨提示:开始和结束的标签都要保留的哦,不要扔掉咯!!!!!!!!!
---------------------
<?phpclass Md5RSA{/*** 利用约定数据和私钥生成数字签名* @param $data 待签数据* @return String 返回签名*/public function sign($data=''){if (empty($data)){return False;}$private_key = file_get_contents(dirname(__FILE__).'/rsa_private_key.pem');if (empty($private_key)){echo "Private Key error!";return False;}$pkeyid = openssl_get_privatekey($private_key);if (empty($pkeyid)){echo "private key resource identifier False!";return False;}$verify = openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);openssl_free_key($pkeyid);return $signature;}/*** 利用公钥和数字签名以及约定数据验证合法性* @param $data 待验证数据* @param $signature 数字签名* @return -1:error验证错误 1:correct验证成功 0:incorrect验证失败*/public function isValid($data='', $signature=''){if (empty($data) || empty($signature)){return False;}$public_key = file_get_contents(dirname(__FILE__).'/rsa_public_key.pem');if (empty($public_key)){echo "Public Key error!";return False;}$pkeyid = openssl_get_publickey($public_key);if (empty($pkeyid)){echo "public key resource identifier False!";return False;}$ret = openssl_verify($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);switch ($ret){case -1:echo "error";break;default:echo $ret==1 ? "correct" : "incorrect";//0:incorrectbreak;}return $ret;}}
原文:https://blog.csdn.net/qq_27517377/article/details/79047021
https://www.cnblogs.com/kennyhr/p/3746100.html
php openssl_sign() 语法+RSA公私钥加密解密,非对称加密算法详解相关推荐
- openssl_sign() 语法+RSA公私钥加密解密,非对称加密算法详解
其实有时候觉得写博客好烦,就个函数就开篇博客.很小的意见事情而已,知道的人看来多取一举,或者说没什么必要,浪费时间,不知道的人就会很郁闷.技术就是这样的,懂的人觉得真的很简单啊,不知道的人真的好难.. ...
- RSA公私钥加解密方式-工具类
直接上代码 import java.io.ByteArrayOutputStream; import java.math.BigInteger; import java.security.*; i ...
- PKCS1 PKCS8 公私钥 加密解密过程
公钥:一样 私钥:不一样(PKCS8是PKCS1通过一定的保护措施转化而来,也就是说PKCS1是裸奔的,PKCS8是穿衣服的) 加密解密过程:一样(padding方式跟格式无关,只需要保证加密的pad ...
- python des解密_python实现DES加密解密方法实例详解
本文实例讲述了python实现DES加密解密方法.分享给大家供大家参考.具体分析如下: 实现功能:加密中文等字符串 密钥与明文可以不等长 这里只贴代码,加密过程可以自己百度,此处python代码没有优 ...
- RSA公私钥加密加签顺序
RSA是一种非对称加密的机制,是一对密钥对(公钥和私钥). 一.加密: 1.公钥加密,私钥解密.可以多人持有公钥进行数据加密,仅一人持有私钥进行数据解密: 2.可以确保数据传输的安全性. 二.加签: ...
- java中使用openssl生成的rsa公私钥进行数据加解密_使用openssl生成RSA公钥和私钥对...
在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...
- Java(111):非对称加密RSA的使用(openssl生成RSA公私钥对)
Java(111):非对称加密RSA的使用(openssl生成RSA公私钥对) 1.openssl生成RSA公私钥对 [root@loaclhost ~]# openssl version OpenS ...
- RSA公私钥格式分析及其在Java和Openssl之间的转换方法
文章目录 PKCS#1和PKCS#8 X.509公钥证书 ASN.1抽象语法标记 DER和PEM编码 OID对象标识符 用openssl命令生成PKCS1#格式的RSA密钥对 生成私钥 从私钥中导出公 ...
- Python crypto模块实现RSA和AES加密解密
Python crypto模块实现RSA和AES加密解密 Python的crypto是用于RSA加密解密,AES加密解密的. 一.RSA和AES简介 RSA加密算法是一种非对称加密算法.RSA 是19 ...
- RSA算法与加密解密
RSA算法与加密解密 什么是RSA算法(RSA algorithm) 什么是非对称加密算法 RSA加密解密原理 算法攻击和蓝桥杯2018年省赛题目 RSA的小指数攻击 蓝桥杯2018年省赛题目 第一步 ...
最新文章
- Android 学习之pull解析Xml
- Interview:算法岗位面试—10.16下午—上海某公司算法岗位(偏图像算法,国内顶端医疗行业)技术面试之一点技术都没问
- kettle中使用javascript步骤和fireToDB函数实现自己定义数据库查询
- C#中线程的使用[Thread in C#]
- CentOS 7 安装 Greenplum6 (附 dotNET Core 示例)
- 大脑体操:三桶分水问题
- python 3.5.2页面_笔者操作win10系统搭建Python 3.5.2开发环境的详细方案
- 夯实Java基础(十八)——泛型
- 05 库的简单操作
- rpm 安装 mysql5.6.28_Linux(Ubuntu)下Mysql5.6.28安装配置方法图文教程
- 【技术综述】基于3DMM的三维人脸重建技术总结
- 软件开发需要学习什么?
- 你真的理解了MVC, MVP, MVVM吗?
- linux系统宝塔安装nodejs,基于debian宝塔面板安装nodebb – 一款基于Node.js的论坛程序...
- 如何通过海外住宅代理预防Facebook账号出现关联的情况
- Skype for Business Web 应用
- 一文让你知道测试职业到底有哪些发展方向
- 修改centos终端提示符背景色
- 电子邮件管理系统 android,IM800电子邮件管理系统
- 课时13 Linux下获取帮助
热门文章
- C# 让应用程序只运行一个实例
- memcached整理の基本使用
- 招投标相关法律及条例
- Mac OS X Snow Leopard 10.6下载及安装
- 2008 DHCP中继器代理服务
- linux c 库依赖
- 一个自动动态播放图片的类(downmoon)新增图片效果
- 服务器自带raid功能吗,服务器的 RAID 功能介绍
- java messagelistener_MessageListenerAdapter
- KVM 介绍(3):I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtualizaiton Para-virtualization]