1、生成公钥和私钥

要应用RSA算法,必须先生成公钥和私钥,公钥和私钥的生成可以借助openssl工具。
也可以用在线生成公私钥。(网站:http://web.chacuo.net/netrsakeypair) 密钥位数:1024位,密钥格式:PKCS#1 示例生成如下: 公钥的内容:
 -----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgFeb3f1f9lwrLrqoNpmODMZe7
eO2t1yzfpY32QacYA/NISqkV6Y38MmLMqxMdLfEnoSOHyMrwHYQJMTElfTJrPUu4
6KBsgo3p6xcxEUPJNABNGU05YB7d5Hff/oFL9dDZ+tcsOgUY61UDTG15+C6KUYET
uqkpR4bN5afMZNmGbQIDAQAB
-----END PUBLIC KEY-----
私钥的内容:
 -----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCgFeb3f1f9lwrLrqoNpmODMZe7eO2t1yzfpY32QacYA/NISqkV
6Y38MmLMqxMdLfEnoSOHyMrwHYQJMTElfTJrPUu46KBsgo3p6xcxEUPJNABNGU05
YB7d5Hff/oFL9dDZ+tcsOgUY61UDTG15+C6KUYETuqkpR4bN5afMZNmGbQIDAQAB
AoGALTsjACj93ovPpA8cwzCRC192xKR9W1HhvusS+lJAePucwH8/2Q4dbPV7juKD
SwpRCeZwmIv2MvPT+5jnjvUZylkwMbLHwlb5UcB7cYr/vtZvPz2O2ZNU3jiw7Z9U
Ue/27c3EnIHeIb5PBf9SwTlq1iA79nf5Qb50ontDemf2pY0CQQCse7KkHwOEXk4i
ZnjVCB8J3ir7XBP7VFG/pRuGsr5y99hhEyUd+yznIQgPiDjC3uoIP1gsBbs5LqOV
Sx5ltLHfAkEA7Zlxxa5lPHWGqXFb1fbtq5Ou/228f/qmuMqpXf8BlUAzQ8SFjC3t
jwnL83zMWxgjaqSrXmuNeICay+5/eA7JMwJAbjIBKZWe25yccqHhJMkxe05zS2/C
XFm8eKH1ehMMVcs+dJaUqhjk0S1rRvESwn1EK8y8ejOXL6s6W5FIdFYDJQJAbJ4h
LMW08haoIP35ha8Ep9MzxQFdkwP7A69iDd5t0tUummRUyOiWGTXZTs5Wfa5jQnVV
Ai0Y12WzXlcBXtkjkQJASXjgltdFr/q7gFbZiG6C2/eDz0Ce79dLPShi95uzjYOX
emgrKYbLCyqZXJgWoS9Y/k0kAyZTGHJ9O00JRDH87Q==
-----END RSA PRIVATE KEY-----
常规:公钥和私钥生成好了之后,私钥自己保存,将公钥交给第三方即可。

2、php的RSA加密解密

在做加密解密之前,首先要确保php已经开启了openssl拓展,可以通过phpinfo()函数进行查看。
通常情况下,有以下两种情形:
①通过公钥加密,通过私钥解密;
②通过私钥加密,通过公钥解密;
示例解释:支付宝的业务场景属于第二种情形.
业务方 向 支付宝 发送支付请求,将sign参数通过自己的私钥加密过后发送到支付宝的接口; (业务方签名sign 属于第二种情形:加密.)
支付宝 向 业务方 发送支付回调结果,将sign参数通过自己的私钥加密过后发送到业务方的notify接口;(解密支付宝回调sign验签 属于第二种情形:解密 可俗称验签.)
注:支付宝使用的加密函数是openssl_sign,之后的校验可以使用openssl_verify函数进行校验。
//公私钥加密示例代码:
     $content = '待加密的字符串,自己替换';
//示例直接取私钥内容,自己替换
//注意:priKey是一串连续字符,如果存在空格需要去除
$priKey = 'MIICWwIBAAKBgQCgFeb3f1f9lwrLrqoNpmODMZe7eO2t1yzfpY32QacYA/NISqkV';
$priKey .='6Y38MmLMqxMdLfEnoSOHyMrwHYQJMTElfTJrPUu46KBsgo3p6xcxEUPJNABNGU05';
$priKey .='YB7d5Hff/oFL9dDZ+tcsOgUY61UDTG15+C6KUYETuqkpR4bN5afMZNmGbQIDAQAB';
$priKey .='AoGALTsjACj93ovPpA8cwzCRC192xKR9W1HhvusS+lJAePucwH8/2Q4dbPV7juKD';
$priKey .='SwpRCeZwmIv2MvPT+5jnjvUZylkwMbLHwlb5UcB7cYr/vtZvPz2O2ZNU3jiw7Z9U';
$priKey .='Ue/27c3EnIHeIb5PBf9SwTlq1iA79nf5Qb50ontDemf2pY0CQQCse7KkHwOEXk4i';
$priKey .='ZnjVCB8J3ir7XBP7VFG/pRuGsr5y99hhEyUd+yznIQgPiDjC3uoIP1gsBbs5LqOV';
$priKey .='Sx5ltLHfAkEA7Zlxxa5lPHWGqXFb1fbtq5Ou/228f/qmuMqpXf8BlUAzQ8SFjC3t';
$priKey .='jwnL83zMWxgjaqSrXmuNeICay+5/eA7JMwJAbjIBKZWe25yccqHhJMkxe05zS2/C';
$priKey .='XFm8eKH1ehMMVcs+dJaUqhjk0S1rRvESwn1EK8y8ejOXL6s6W5FIdFYDJQJAbJ4h';
$priKey .='LMW08haoIP35ha8Ep9MzxQFdkwP7A69iDd5t0tUummRUyOiWGTXZTs5Wfa5jQnVV';
$priKey .='Ai0Y12WzXlcBXtkjkQJASXjgltdFr/q7gFbZiG6C2/eDz0Ce79dLPShi95uzjYOX';
$priKey .='emgrKYbLCyqZXJgWoS9Y/k0kAyZTGHJ9O00JRDH87Q=='; echo createSign($content,$priKey); /**
* 创建RSA加密签名
* @param string $content
* @param string $priKey
* @return mixed
*/
function createSign($content, $priKey){
//转换成PrivateKey格式
$priKey = convertPrivateKey($priKey);
//获取私钥内容
$openssl_private_key = openssl_get_privatekey($priKey);
//对数据进行PKCS1签名 签名还有MD5,SHA,RMD根据自己实例代码修改
//openssl_sign($content, $signature, $openssl_private_key, OPENSSL_ALGO_MD5);
@openssl_private_encrypt($content, $signature, $openssl_private_key, OPENSSL_PKCS1_PADDING);
//释放资源
@openssl_free_key($openssl_private_key);
//对签名进行Base64编码,变为可读的字符串
$sign = base64_encode($signature);
if (empty($sign)) {
return false;
}
return $sign;
} /**
* 转换PrivateKey
* @param string $priKey
* @return string
*/
function convertPrivateKey($priKey) {
//判断是否传入私钥内容
$private_key_string = !empty($priKey) ? $priKey : '';
//64位换行私钥内容
$private_key_string = chunk_split($private_key_string, 64, "\r\n");
//私钥头部
$private_key_header = "-----BEGIN RSA PRIVATE KEY-----\r\n";
//私钥尾部
$private_key_footer = "-----END RSA PRIVATE KEY-----";
//完整私钥拼接
$private_key_string = $private_key_header.$private_key_string.$private_key_footer;
return $private_key_string;
}
获取sign签名如下: "TFFHwGlMYgANXiwC+aAu122+K3R0n+Ig5ZfpmqNLEYjeS/EwMSUaYA4V5+aXAklRcSPDyJoERZ2+4sUQP1UGWqcwiKuoiHiZ8Ps1ljrBfQpATHrljyLdrj3yZSa2cOqQArBtCxFB9DGDZsbrsbOl7H/zfl3quKDKoiCwQedaykU="

//公私钥解密示例代码:
       $sign = "TFFHwGlMYgANXiwC+aAu122+K3R0n+Ig5ZfpmqNLEYjeS/EwMSUaYA4V5+aXAklRcSPDyJoERZ2+4sUQP1UGWqcwiKuoiHiZ8Ps1ljrBfQpATHrljyLdrj3yZSa2cOqQArBtCxFB9DGDZsbrsbOl7H/zfl3quKDKoiCwQedaykU=";
//示例直接取公钥内容,自己替换
//注意:publickey,如果存在空格需要去除
$publickey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgFeb3f1f9lwrLrqoNpmODMZe7';
$publickey .= 'eO2t1yzfpY32QacYA/NISqkV6Y38MmLMqxMdLfEnoSOHyMrwHYQJMTElfTJrPUu4';
$publickey .='6KBsgo3p6xcxEUPJNABNGU05YB7d5Hff/oFL9dDZ+tcsOgUY61UDTG15+C6KUYET';
$publickey .='uqkpR4bN5afMZNmGbQIDAQAB';
echo checkSign($sign,$publickey); /**
* RSA解密(验签)
* @param string $sign
* @param string $publickey
* @return 0 or 1
*/
function checkSign($sign, $publickey){
//转换成PublicKey格式
$publickey = convertPublicKey($publickey);
//获取公钥钥内容
$openssl_public_key = @openssl_get_publickey($publickey);
//对数据进行解密
//$result = @openssl_verify($content,base64_decode($sign), $openssl_public_key,OPENSSL_ALGO_MD5);
$result = openssl_public_decrypt(base64_decode($sign), $decrypted, $openssl_public_key,OPENSSL_PKCS1_PADDING);
//释放资源
@openssl_free_key($openssl_public_key);
return $result;
} /**
* 转换PublicKey
* @param string $publicKey
* @return string
*/
function convertPublicKey($publicKey) {
//判断是否传入公钥内容
$public_key_string = !empty($publicKey) ? $publicKey : '';
//64位换行公钥钥内容
$public_key_string = chunk_split($public_key_string, 64, "\r\n");
//公钥头部
$public_key_header = "-----BEGIN PUBLIC KEY-----\r\n";
//公钥尾部
$public_key_footer = "-----END PUBLIC KEY-----";
//完整公钥拼接
$public_key_string = $public_key_header.$public_key_string.$public_key_footer;
return $public_key_string;
}
验证返回值是: 1验签成功  0验签失败
												

PHP RSA公私钥的理解和示例说明的更多相关文章

  1. Openssl生成RSA公私钥以及将公钥转换成C#支持的格式

    Openssl生成RSA公私钥以及将公钥转换成C#支持的格式 1.RSA算法介绍 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密.RSA ...

  2. java生成RSA公私钥字符串,简单易懂

    java生成RSA公私钥字符串,简单易懂   解决方法: 1.下载bcprov-jdk16-140.jar包,参考:http://www.yayihouse.com/yayishuwu/chapter ...

  3. RSA 公私钥 互换问题

    关于 RSA,我的理解是: 按定义的话,公私钥是可以互换的 问题是常见的实现里面,保存“私钥”的那个数据结构或者文件,里面除了私钥所必需的那一对数之外,还有额外的信息(足以算出公钥来),所以绝对不能把 ...

  4. RSA公私钥获取模数和质数

    实际项目中,发现前端在生成公钥对象的时候并不是使用这种方式,而是通过对应的模数跟质数来构造公钥对象的,这样的话,需要进一步将生成的公钥取出对应的模数和质数.openssl.java api都可以将质数 ...

  5. Java中使用OpenSSL生成的RSA公私钥

    RSA是什么:RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的 ...

  6. openssl生成rsa公私钥

    1.生成私钥pem,  执行命令openssl genrsa -out rsa_private_key.pem 1024 2.生成公钥,执行命令openssl rsa -in rsa_private_ ...

  7. OpenSSL生成RSA公私钥(java)

    生成私钥:genrsa -out rsa_private_key.pem 1024 生成公钥:rsa -in rsa_private_key.pem -out rsa_public_key.pem - ...

  8. Python rsa公私钥生成 rsa公钥加解密(分段加解密)-私钥加签验签实战

    一般现在的SAAS服务提供现在的sdk或api对接服务都涉及到一个身份验证和数据加密的问题.一般现在普遍的做法就是配置使用非对称加密的方式来解决这个问题,你持有SAAS公司的公钥,SAAS公司持有你的 ...

  9. NetCore 生成RSA公私钥对,公钥加密私钥解密,私钥加密公钥解密

    using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using ...

随机推荐

  1. Spring Boot 之 Redis

    一.pom.xml引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  2. 数据映射-LSM Tree和SSTable

    Coming from http://blog.sina.com.cn/s/blog_693f08470101njc7.html 今天来聊聊lsm tree,它的全称是log structured m ...

  3. python之cmd模块

    md模块可以用来做交互式shell cmd模块是python中包含的一个公共模块,用于交互式shell和其他命令解释器等的基类,我们可以基于cmd模块自定义我们的子类,实现我们自己的交互式shell ...

  4. linux驱动模型——platform(1)

    一.驱动模型包含什么? 1.1. 类class 1.1.2. 它能够自动创建/dev下的设备节点,不需要mknod /dev/xxx c x x创建.当然class还有其另外的作用,且自动创建设备节点 ...

  5. luogu 3426题解 (KMP)

    题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段作为模版. 然后将模版重复喷涂到相应的位置后就得到了他想要的字符序列.一个字符可以被喷涂很多次,但是一个位置 ...

  6. 3.Golang的包导入

    1.golang的源码文件可以随意命名,但是属于同一个包的源文件必须声明 package base 2.golang的包引入规则 import ( "fmt" #系统包直接写名字 ...

  7. Mysql 数据库存储的原理??

    储存过程是一个可编程的函数,它在数据库中创建并保存.它可以有 SQL 语句和一些特殊的控制结 构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的.数据库中的 ...

  8. 加密模块hashlib

    #coding=utf-8 import ConfigParser #配置文件模块 import hashlib #用于加密的模块 m = hashlib.md5() m.update(b'hello ...

  9. Git:将本地项目连接到远程(github、gitee、gitlab)仓库流程

    当进行协同开发或者为了代码安全备份需要,一般都会将本地代码和远程仓库相连接. 备注:Github.Gitee.Gitlab是三个常用的远程git仓库,操作流程基本一致. 提前环境要求: 1.node. ...

  10. centos下通过conda安装pytorch

    一.安装anaconda anaconda安装简单,只要确定自己的系统即可,具体安装请参考这里 二.确定自己的系统版本 我的是centos cat /etc/redhat-release 查看linu ...