其实有时候觉得写博客好烦,就个函数就开篇博客。很小的意见事情而已,知道的人看来多取一举,或者说没什么必要,浪费时间,不知道的人就会很郁闷。技术就是这样的,懂的人觉得真的很简单啊,不知道的人真的好难。。。

一般在跟第三方接口对接数据的时候,为了保证很多都使用的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公私钥加密解密,非对称加密算法详解相关推荐

  1. openssl_sign() 语法+RSA公私钥加密解密,非对称加密算法详解

    其实有时候觉得写博客好烦,就个函数就开篇博客.很小的意见事情而已,知道的人看来多取一举,或者说没什么必要,浪费时间,不知道的人就会很郁闷.技术就是这样的,懂的人觉得真的很简单啊,不知道的人真的好难.. ...

  2. RSA公私钥加解密方式-工具类

    直接上代码 ​ import java.io.ByteArrayOutputStream; import java.math.BigInteger; import java.security.*; i ...

  3. PKCS1 PKCS8 公私钥 加密解密过程

    公钥:一样 私钥:不一样(PKCS8是PKCS1通过一定的保护措施转化而来,也就是说PKCS1是裸奔的,PKCS8是穿衣服的) 加密解密过程:一样(padding方式跟格式无关,只需要保证加密的pad ...

  4. python des解密_python实现DES加密解密方法实例详解

    本文实例讲述了python实现DES加密解密方法.分享给大家供大家参考.具体分析如下: 实现功能:加密中文等字符串 密钥与明文可以不等长 这里只贴代码,加密过程可以自己百度,此处python代码没有优 ...

  5. RSA公私钥加密加签顺序

    RSA是一种非对称加密的机制,是一对密钥对(公钥和私钥). 一.加密: 1.公钥加密,私钥解密.可以多人持有公钥进行数据加密,仅一人持有私钥进行数据解密: 2.可以确保数据传输的安全性. 二.加签: ...

  6. java中使用openssl生成的rsa公私钥进行数据加解密_使用openssl生成RSA公钥和私钥对...

    在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...

  7. Java(111):非对称加密RSA的使用(openssl生成RSA公私钥对)

    Java(111):非对称加密RSA的使用(openssl生成RSA公私钥对) 1.openssl生成RSA公私钥对 [root@loaclhost ~]# openssl version OpenS ...

  8. RSA公私钥格式分析及其在Java和Openssl之间的转换方法

    文章目录 PKCS#1和PKCS#8 X.509公钥证书 ASN.1抽象语法标记 DER和PEM编码 OID对象标识符 用openssl命令生成PKCS1#格式的RSA密钥对 生成私钥 从私钥中导出公 ...

  9. Python crypto模块实现RSA和AES加密解密

    Python crypto模块实现RSA和AES加密解密 Python的crypto是用于RSA加密解密,AES加密解密的. 一.RSA和AES简介 RSA加密算法是一种非对称加密算法.RSA 是19 ...

  10. RSA算法与加密解密

    RSA算法与加密解密 什么是RSA算法(RSA algorithm) 什么是非对称加密算法 RSA加密解密原理 算法攻击和蓝桥杯2018年省赛题目 RSA的小指数攻击 蓝桥杯2018年省赛题目 第一步 ...

最新文章

  1. Android 学习之pull解析Xml
  2. Interview:算法岗位面试—10.16下午—上海某公司算法岗位(偏图像算法,国内顶端医疗行业)技术面试之一点技术都没问
  3. kettle中使用javascript步骤和fireToDB函数实现自己定义数据库查询
  4. C#中线程的使用[Thread in C#]
  5. CentOS 7 安装 Greenplum6 (附 dotNET Core 示例)
  6. 大脑体操:三桶分水问题
  7. python 3.5.2页面_笔者操作win10系统搭建Python 3.5.2开发环境的详细方案
  8. 夯实Java基础(十八)——泛型
  9. 05 库的简单操作
  10. rpm 安装 mysql5.6.28_Linux(Ubuntu)下Mysql5.6.28安装配置方法图文教程
  11. 【技术综述】基于3DMM的三维人脸重建技术总结
  12. 软件开发需要学习什么?
  13. 你真的理解了MVC, MVP, MVVM吗?
  14. linux系统宝塔安装nodejs,基于debian宝塔面板安装nodebb – 一款基于Node.js的论坛程序...
  15. 如何通过海外住宅代理预防Facebook账号出现关联的情况
  16. Skype for Business Web 应用
  17. 一文让你知道测试职业到底有哪些发展方向
  18. 修改centos终端提示符背景色
  19. 电子邮件管理系统 android,IM800电子邮件管理系统
  20. 课时13 Linux下获取帮助

热门文章

  1. C# 让应用程序只运行一个实例
  2. memcached整理の基本使用
  3. 招投标相关法律及条例
  4. Mac OS X Snow Leopard 10.6下载及安装
  5. 2008 DHCP中继器代理服务
  6. linux c 库依赖
  7. 一个自动动态播放图片的类(downmoon)新增图片效果
  8. 服务器自带raid功能吗,服务器的 RAID 功能介绍
  9. java messagelistener_MessageListenerAdapter
  10. KVM 介绍(3):I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtualizaiton Para-virtualization]