php rsa 加密、解密、签名、验签
由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用。
以下php版本是适用于对接java接口,java适用密钥再php语言使用是需要添加
-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
使用密钥:
加密公钥 public_key.cer
解密私钥 private_key.key
签名私钥 sign_key.key
验签公钥 verify.cer
<?php
class RSAUtils{
//加密公钥
function redPukey()
{
//拼接加密公钥路径
$encryptionKeyPath="D:/encryptions.cer";
$encryptionKey4Server = file_get_contents($encryptionKeyPath); $pem = chunk_split(base64_encode($encryptionKey4Server),64,"\n");//转换为pem格式的公钥
$pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n";
$publicKey = openssl_pkey_get_public($pem);
return $publicKey;
} //解密私钥
function redPikey()
{
//拼接解密私钥路径
$decryptKeyPath="D:/decrypts.key";
$decryptKey4Server = file_get_contents($decryptKeyPath); $pem = chunk_split($decryptKey4Server,64,"\n");//转换为pem格式的私钥
$pem = "-----BEGIN PRIVATE KEY-----\n".$pem."-----END PRIVATE KEY-----\n";
$privateKey = openssl_pkey_get_private($pem);
return $privateKey;
} //签名私钥
function redSignkey()
{
//拼接签名路径
$signKeyPath="D:/DEMO/sign.key";
$signKey4Server = file_get_contents($signKeyPath); $pem = chunk_split($signKey4Server,64,"\n");//转换为pem格式的私钥
$pem = "-----BEGIN PRIVATE KEY-----\n".$pem."-----END PRIVATE KEY-----\n";
$signKey = openssl_pkey_get_private($pem);
return $signKey;
} //验签公钥
function redVerifykey()
{
//拼接验签路径
$verifyKeyPath="D:/DEMO/verify.cer";
$verifyKey4Server = file_get_contents($verifyKeyPath); $pem = chunk_split(base64_encode($verifyKey4Server),64,"\n");//转换为pem格式的公钥
$pem = "-----BEGIN CERTIFICATE-----\n".$pem."-----END CERTIFICATE-----\n";
$verifyKey = openssl_pkey_get_public($pem);
return $verifyKey;
} //公钥加密
function pubkeyEncrypt($source_data, $pu_key) {
$data = "";
$dataArray = str_split($source_data, 117);
foreach ($dataArray as $value) {
$encryptedTemp = "";
openssl_public_encrypt($value,$encryptedTemp,$pu_key);//公钥加密
$data .= base64_encode($encryptedTemp);
}
return $data;
} //私钥解密
function pikeyDecrypt($eccryptData,$decryptKey) {
$decrypted = "";
$decodeStr = base64_decode($eccryptData);
$enArray = str_split($decodeStr, 256); foreach ($enArray as $va) {
openssl_private_decrypt($va,$decryptedTemp,$decryptKey);//私钥解密
$decrypted .= $decryptedTemp;
}
return $decrypted;
} }
?>
注意:
有时候用base64_encode加密后,以GET的形式传到其他页面,用base64_decode解密的时候,出现乱码.
遇到这个问题的时候,我就纳闷了,为什么有一些能正确解密,但是有一些却出现乱码呢?
后来经过检查,发现有一些中文字符,用GET形式传过来的时候,+号会被替换成空格.
为了防止出现乱码的情况,我做了一步替换,然后再解密,果然,乱码的问题,不复存在了!
比如你以GET的形式传过来一个oid变量,那么解密还原的时候,先用+号替换空格.那么输出就正常了.
如下: $oid=base64_decode(str_replace(" ","+",$_GET[oid]));
php rsa 加密、解密、签名、验签的更多相关文章
- Java RSA 加密 解密 签名 验签
原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...
- RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密
原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 C#在using System.Security.Cryptograph ...
- js rsa sign使用笔记(加密,解密,签名,验签)
你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...
- C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic
C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider DESCryptoS ...
- 支付接口中常用的加密解密以及验签rsa,md5,sha
一.常用加密类型分类 1.对称加密:采用单钥对信息进行加密和解密,即同一个秘钥既可以对信息进行加密,也可以进行解密.此类型称之为对称加密.特点速度快,常用于对大量数据信息或文件加密时使用.常用例子:D ...
- RSA加密解密与加签验签
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- Java使用RSA加密解密签名及校验
RSA加密解密类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...
- 数据安全管理:RSA加密算法,签名验签流程详解
本文源码:GitHub·点这里 || GitEE·点这里 一.RSA算法简介 1.加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用.可以在不直接传递密钥的情况下,完成加 ...
- C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出
差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8 ...
随机推荐
- hdu 4691 最长的共同前缀 后缀数组 +lcp+rmq
http://acm.hdu.edu.cn/showproblem.php? pid=4691 去年夏天,更多的学校的种族称号.当时,没有后缀数组 今天将是,事实上,自己的后缀阵列组合rmq或到,但是 ...
- 《github一天,一个算术题》:堆算法接口(堆排序、堆插入和堆垛机最大的价值,并删除)
阅览.认为.编写代码! /********************************************* * copyright@hustyangju * blog: http://blo ...
- machine learn in python 第二章2.1.1
1大约 sklearn.datasets from sklearn.datasets import load_iris import numpy as np data = load_iris() da ...
- WPF学习(3)布局
今天我们来说说WPF的布局.我们知道WinForm的布局主要是采用基于坐标的方式,当窗口内容发生变化时,里面的控件不会随之动态调整,这就造成了一个很不好的用户体验.而WPF为了避免这个缺点,采用了基于 ...
- nodejs的安装和使用
一 下载 下载地址: https://nodejs.org/download/ 二 安装 1 win7系统直接双击,就能够执行了: 2 win8须要使用管理员权限执行,否则会报错Error 2502, ...
- debian 该分区的部分安装移动硬盘后无法识别。
有一个新的团购1T移动硬盘.购买格化学式ntfs经过几次简单的子区域. 4G硬盘PE.100G高速互动,盈800许多G分为两个相等的存储盘. 到您的计算机USB接口后,, 桌面弹出自己主动4一封信. ...
- DNSserver内置笔记本
DNS于linuxserver该服务名是named,和named服务相关的软件bind. 周围环境: 系统版本号:VBOX虚拟机centos6.0. 本机内网IP 192.168.2.198. ...
- linux 终端下敲ctrl-c时,到底发生了什么?(转)
通过telnet登录到单板,然后按ctrl-c会发生什么情况,流程是怎么样的? 在分析之前,先介绍tty的相关知识.我们可以认为,所有跟输入输出相关的操作,最终都由tty来接管.举例来说,当我们敲 l ...
- Android Push Notifications using Google Cloud Messaging (GCM), PHP and MySQL
http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php- ...
- Matlab.NET混合编程技巧之——找出Matlab内置函数
原文:[原创]Matlab.NET混合编程技巧之--找出Matlab内置函数 Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯定不难.反之,有时候一个小错误,可能抓破 ...