php rsa加密实例,php实现RSA加密类实例,phprsa加密实例_PHP教程
php实现RSA加密类实例,phprsa加密实例
本文实例讲述了php实现RSA加密类。分享给大家供大家参考。具体分析如下:
通过openssl实现的签名、验签、非对称加解密,需要配合x.509证书(如crt和pem)文件使用。
由于各种原因,该类并不十分完善,欢迎各种测试!
_getPublicKey($public_key_file);
}
if ($private_key_file){
$this->_getPrivateKey($private_key_file);
}
}
/**
* 生成签名
*
* @param string 签名材料
* @param string 签名编码(base64/hex/bin)
* @return 签名值
*/
public function sign($data, $code = 'base64'){
$ret = false;
if (openssl_sign($data, $ret, $this->priKey)){
$ret = $this->_encode($ret, $code);
}
return $ret;
}
/**
* 验证签名
*
* @param string 签名材料
* @param string 签名值
* @param string 签名编码(base64/hex/bin)
* @return bool
*/
public function verify($data, $sign, $code = 'base64'){
$ret = false;
$sign = $this->_decode($sign, $code);
if ($sign !== false) {
switch (openssl_verify($data, $sign, $this->pubKey)){
case 1: $ret = true; break;
case 0:
case -1:
default: $ret = false;
}
}
return $ret;
}
/**
* 加密
*
* @param string 明文
* @param string 密文编码(base64/hex/bin)
* @param int 填充方式(貌似php有bug,所以目前仅支持OPENSSL_PKCS1_PADDING)
* @return string 密文
*/
public function encrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING){
$ret = false;
if (!$this->_checkPadding($padding, 'en')) $this->_error('padding error');
if (openssl_public_encrypt($data, $result, $this->pubKey, $padding)){
$ret = $this->_encode($result, $code);
}
return $ret;
}
/**
* 解密
*
* @param string 密文
* @param string 密文编码(base64/hex/bin)
* @param int 填充方式(OPENSSL_PKCS1_PADDING / OPENSSL_NO_PADDING)
* @param bool 是否翻转明文(When passing Microsoft CryptoAPI-generated RSA cyphertext, revert the bytes in the block)
* @return string 明文
*/
public function decrypt($data, $code = 'base64', $padding = OPENSSL_PKCS1_PADDING, $rev = false){
$ret = false;
$data = $this->_decode($data, $code);
if (!$this->_checkPadding($padding, 'de')) $this->_error('padding error');
if ($data !== false){
if (openssl_private_decrypt($data, $result, $this->priKey, $padding)){
$ret = $rev ? rtrim(strrev($result), "") : ''.$result;
}
}
return $ret;
}
// 私有方法
/**
* 检测填充类型
* 加密只支持PKCS1_PADDING
* 解密支持PKCS1_PADDING和NO_PADDING
*
* @param int 填充模式
* @param string 加密en/解密de
* @return bool
*/
private function _checkPadding($padding, $type){
if ($type == 'en'){
switch ($padding){
case OPENSSL_PKCS1_PADDING:
$ret = true;
break;
default:
$ret = false;
}
} else {
switch ($padding){
case OPENSSL_PKCS1_PADDING:
case OPENSSL_NO_PADDING:
$ret = true;
break;
default:
$ret = false;
}
}
return $ret;
}
private function _encode($data, $code){
switch (strtolower($code)){
case 'base64':
$data = base64_encode(''.$data);
break;
case 'hex':
$data = bin2hex($data);
break;
case 'bin':
default:
}
return $data;
}
private function _decode($data, $code){
switch (strtolower($code)){
case 'base64':
$data = base64_decode($data);
break;
case 'hex':
$data = $this->_hex2bin($data);
break;
case 'bin':
default:
}
return $data;
}
private function _getPublicKey($file){
$key_content = $this->_readFile($file);
if ($key_content){
$this->pubKey = openssl_get_publickey($key_content);
}
}
private function _getPrivateKey($file){
$key_content = $this->_readFile($file);
if ($key_content){
$this->priKey = openssl_get_privatekey($key_content);
}
}
private function _readFile($file){
$ret = false;
if (!file_exists($file)){
$this->_error("The file {$file} is not exists");
} else {
$ret = file_get_contents($file);
}
return $ret;
}
private function _hex2bin($hex = false){
$ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false;
return $ret;
}
}
测试demo:
$a = isset($_GET['a']) ? $_GET['a'] : '测试123';
//
$pubfile = 'E:sslcertpwd.crt';
$prifile = 'E:sslcertpwd.pem';
$m = new RSA($pubfile, $prifile);
$x = $m->sign($a);
$y = $m->verify($a, $x);
var_dump($x, $y);
$x = $m->encrypt($a);
$y = $m->decrypt($x);
var_dump($x, $y);
希望本文所述对大家的php程序设计有所帮助。
www.bkjia.comtrueTechArticlephp实现RSA加密类实例,phprsa加密实例 本文实例讲述了php实现RSA加密类。分享给大家供大家参考。具体分析如下: 通过openssl实现的签名、验...
php rsa加密实例,php实现RSA加密类实例,phprsa加密实例_PHP教程相关推荐
- 继承Thread类实现多线程简单实例
继承Thread类实现多线程简单实例 文章目录 继承Thread类实现多线程简单实例 一.多线程的意义 二.多线程的创建 三.代码 一.多线程的意义 1.为什么要使用多线程 (a)提高用户体验或者避免 ...
- python实现rsa加密源代码_python实现RSA加密(解密)算法
RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. 今天只有短的RSA钥匙才可能被强力方式解破.到2008年为止,世界上还没有任何可靠 ...
- 基于java的rsa加密程序_RSA rsa加密程序,rsa java源码和 rsa的jsp Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...
文件名称: RSA下载 收藏√ [ 5 4 3 2 1 ] 开发工具: Java 文件大小: 169 KB 上传时间: 2014-04-23 下载次数: 0 提 供 者: 姚双奇 详细说明: ...
- rsa/ecb/pkcs1padding php,PHPJAVA RSA/ECB/PKCS1Padding 加密解密
PHP代码: $privateKeyFilePath = '-----BEGIN RSA PRIVATE KEY----- MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwgg ...
- Unity SKFramework框架(二十五)、RSA算法加密、签名工具 RSA Crypto
目录 简介 函数 1.pem公钥内容转xml 2.pem私钥内容转xml 3.使用公钥对数据进行加密 4.使用私匙对待签名内容进行签名 示例 简介 在调用Java后端接口,需要使用后端提供的pem私钥 ...
- ios rsa加密 java解密_iOS RSA加密与解密 签名与验签(附Java端处理)
本篇文章将涉及以下几个操作: 1.iOS端使用RSA公钥加密,iOS端使用RSA私钥解密. 2.iOS端使用RSA私钥加签,iOS端使用RSA公钥验签. 3.iOS端使用RSA公钥加密,Java端使用 ...
- 合宙Air105|CRYPTO|加密与解密|算法|RSA|HASH函数| BASE64|MD5|SHA1|SHA256|CRC|官方demo|学习(4):CRYPTO(加密与解密)
基础资料 基于Air105开发板:Air105 - LuatOS 文档 上手:开发上手 - LuatOS 文档 探讨重点 对官方CRYPTO(加密与解密) 功能的复现,进行相关内容的学习及探讨. 实现 ...
- c语言 rsa算法 分段,python3 实现RSA算法分段加密解密
参考博客地址: https://blog.csdn.net/qq_33414271/article/details/78424951 https://www.cnblogs.com/piperck/p ...
- PHP rsa私钥pkcs8加密,Openssl rsa私钥的PKCS#1和PKCS#8格式以及加密和转化
这里主要介绍: 私钥的PKCS#1格式,及PKCS#8格式 格式PKCS#1和PKCS#8之间的互相转化 私钥的加密,解密 PKCS#1 -> PKCS#8 生成PKCS#1私钥 $ opens ...
最新文章
- 点云配准(一 两两配准)
- 如何零门槛搭建实时音视频通信平台
- java元婴期(23)----java进阶(mybatis(2)---mapper代理mybatis核心配置文件输入输出映射)
- pytorch nn.Linear(对输入数据做线性变换:y=Ax+b)(全连接层?)
- 用java求直角三角形的面积_JAVA 已知三角形的三个边判断 是否为直角三角形,如果是求面积!...
- 第十六期:AWS 瘫痪:DNS 被 DDoS 攻击了 15 个小时
- Java8 Stream详解~筛选:filter
- UIImageView 与 UIImage 区别
- Optimization Algorithms
- Linux 中进程的管理
- pyqt怎么button怎么链接_微信视频号怎么添加链接?添加微信公众号链接教程
- 锁相环的输入、输出——以PSCAD的PLL元件为例
- 【软件工具】之 TotalCommander
- Java中的IO整理
- 谷歌浏览器离线安装crx插件方法
- [Rootkit] dll 隐藏 - VAD
- 笔试强训48天——day29
- 【Auto.js脚本】淘宝618集喵币列车活动 自动浏览任务
- 计算机lg符号,网上总出现LG的符号,是什么意思
- 爱普生Me330 打印机改装连供系统计划