openssl_sign() 语法+RSA公私钥加密解密,非对称加密算法详解
其实有时候觉得写博客好烦,就个函数就开篇博客。很小的意见事情而已,知道的人看来多取一举,或者说没什么必要,浪费时间,不知道的人就会很郁闷。技术就是这样的,懂的人觉得真的很简单啊,不知道的人真的好难。。。
2018-11-26 12:10更新
**一般在跟第三方接口对接数据的时候,为了保证很多都使用的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;}
咋一看KaTeX parse error: Expected 'EOF', got '#' at position 42: …函数有点不一样,捂脸.... #̲语法是这样的: **opens…data, s i g n , sign, sign,pk); 传入了 d a t a 数 据 o p e n s s l s i g n ( ) 对 data数据 openssl_sign()对 data数据opensslsign()对data进行签名,用的是静态变量 p r i v a t e k e y , 签 名 完 成 后 返 回 了 private_key,签名完成后返回了 privatekey,签名完成后返回了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"; #---------------------------------------封装成函数-------------------------------
/*** 私钥加密,传递私钥和需要加密的数据过来 written:yangxingyi Date:2018-11-26*/
function RsaEncrypt($str,$private_key){$pi_key = openssl_pkey_get_private($private_key);//这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id if(!$pi_key) return'私钥有误';openssl_private_encrypt($str,$encrypted,$pi_key);//私钥加密 $encrypted = base64_encode($encrypted);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的return $encrypted;
}
/*** 公钥解密,传递公钥和需要已加密的字符串过来 written:yangxingyi Date:2018-11-26*/
function RsaDecrypt($str,$public_key){$pu_key = openssl_pkey_get_public($public_key);//这个函数可用来判断公钥是否是可用的 if(!$pu_key) return '公钥有误';openssl_public_decrypt(base64_decode($str),$decrypted,$pu_key);//私钥加密的内容通过公钥可用解密出来 return $decrypted;
}$rs1 = RsaEncrypt('小姐姐你好啊!',$private_key);
var_dump($rs1);$rs2 = RsaDecrypt($rs1,$public_key);
var_dump($rs2);
如果你看到图片这样的输出,就没毛病了,说明你的公钥和私钥是一对的
#介绍下钥匙生成(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-----';温馨提示:开始和结束的标签都要保留的哦,不要扔掉咯!!!!!!!!!
觉得有用就搬走吧,不用联系我的!!!!
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(111):非对称加密RSA的使用(openssl生成RSA公私钥对)
Java(111):非对称加密RSA的使用(openssl生成RSA公私钥对) 1.openssl生成RSA公私钥对 [root@loaclhost ~]# openssl version OpenS ...
- java中使用openssl生成的rsa公私钥进行数据加解密_使用openssl生成RSA公钥和私钥对...
在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...
- 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年省赛题目 第一步 ...
- RSA公私钥格式分析及其在Java和Openssl之间的转换方法
文章目录 PKCS#1和PKCS#8 X.509公钥证书 ASN.1抽象语法标记 DER和PEM编码 OID对象标识符 用openssl命令生成PKCS1#格式的RSA密钥对 生成私钥 从私钥中导出公 ...
最新文章
- linux shell 脚本入门
- Ubuntu麒麟下搭建FTP服务
- LeetCode 2116. 判断一个括号字符串是否有效(栈)
- 需求获取的三阶段:需求背景、需求调研、需求分析 (2)
- 如何使用IIS重写模块将HTTP重定向到HTTPS
- python数字组合算法_python - 简单算法题 - 求三位数组合
- 【java笔记】File类(2):获取,判断,创建,删除,遍历目录方法
- 1分钟获取上千ID,暴力破解、端口扫描、拖库攻击如何防范
- 一些值得学习的Unity教程
- 国外java、IT技术网站汇总
- 618买什么运动装备、最值得入手的运动装备合集
- uni-app 报错getUserProfile:fail can only be invoked by user TAP gesture.
- Win7电池电量设置
- Android TextView带背景图片和自定义边框
- NIO与Netty编程(三)之Netty编程
- jni使用(四)-----IDEA中javah生成.h文件
- 【C4-AI大赛】2021优秀作品荟
- 【文章】我在华为打工的日子
- scope may not be empty [scope-empty]
- unity 中 c# 与 object-c 交互
热门文章
- truetype字体怎么转换成普通字体_TrueType字体作用|如何在文档嵌入 TrueType 字体中...
- 基于来信码的短信通知平台
- 顶级“黑客”能厉害到什么地步?无信号也能上网,专家:高端操作!
- 电源硬件设计----升降压变换器(负压输出)基础
- 报告老板,我们的H5页面在iOS11系统上白屏了!
- 【CuteJavaScript】GraphQL真香入门教程
- 浅谈自适应滤波器---(快速RLS算法)
- phpmyadmin 4.8.1 Remote File Inclusion Vulnerability (CVE-2018-12613)漏洞复现
- AWS助力海信集团智慧家居全球化运营
- 前端CSS样式去除body默认边距和a标签下划线去除和高亮显示问题