/**
* RSA加密解密算法
* Class Rsa
*/
class Rsa
{ /**
* 获取pem格式的公钥
* @param $public_key 公钥文件路径或者字符串
* @return bool|mixed|string
*/
public static function public_key($public_key)
{
try{
// 先判断是否是文件
$suffix = pathinfo($public_key,PATHINFO_EXTENSION);
if(!empty($suffix) && is_file($public_key)){
$public_key = file_get_contents($public_key);
}
if(false === strpos($public_key, '-----')){
$public_key = str_replace("\n", "", $public_key);
$public_key = "-----BEGIN PUBLIC KEY-----\n" . chunk_split($public_key, 64, "\n") . "-----END PUBLIC KEY-----";
}
}catch (\Exception $e){
$public_key = '';
} return $public_key;
} /**
* 获取pem格式的私钥
* @param $private_key 私钥文件路径或者字符串
* @return bool|mixed|string
*/
public static function private_key($private_key, $key_password='')
{
try{
// 先判断是否是文件
$suffix = pathinfo($private_key,PATHINFO_EXTENSION);
if(!empty($suffix) && is_file($private_key)){
$private_key = file_get_contents($private_key);
}
if(false === strpos($private_key, '-----')){
$private_key = str_replace("\n", "", $private_key);
if(empty($key_password)){
$private_key = "-----BEGIN PRIVATE KEY-----\n" . chunk_split($private_key, 64, "\n") . "-----END PRIVATE KEY-----";
}else{
$private_key = "-----BEGIN ENCRYPTED PRIVATE KEY-----\n" . chunk_split($private_key, 64, "\n") . "-----END ENCRYPTED PRIVATE KEY-----";
}
}
}catch (\Exception $e){
$private_key = '';
} return $private_key;
} /**
* RSA公钥加密
* @param $decrypted 待加密字符串
* @param $public_key 公钥
* @return bool|string
*/
public static function public_encrypt($decrypted, $public_key)
{ try{
$public_key = self::public_key($public_key); $publicKey = openssl_pkey_get_public($public_key); //这个函数可用来判断公钥是否是可用的,可用返回资源id Resource id
if(!$publicKey) return false; $decrypted = str_split($decrypted, 117);
$encrypted = '';
foreach ($decrypted as $decrypt){
$encrypt = '';
openssl_public_encrypt($decrypt, $encrypt, $publicKey);//公钥加密
$encrypted .= $encrypt; //加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
}
$encrypted = base64_encode($encrypted);
openssl_free_key($publicKey);
unset($decrypted, $public_key, $publicKey, $decrypt, $encrypt);
}catch (\Exception $e){
$encrypted = '';
} return $encrypted;
} /**
* RSA私钥加密
* @param $decrypted 待加密字符串
* @param $private_key 私钥
* @return bool|string
*/
public static function private_encrypt($decrypted, $private_key, $key_password='')
{ try {
$private_key = self::private_key($private_key, $key_password); $privateKey = openssl_pkey_get_private($private_key, $key_password); //这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
if (!$privateKey) return false; $decrypted = str_split($decrypted, 117);
$encrypted = '';
foreach ($decrypted as $decrypt) {
$encrypt = '';
openssl_private_encrypt($decrypt, $encrypt, $privateKey);//公钥加密
$encrypted .= $encrypt; //加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的
}
$encrypted = base64_encode($encrypted);
openssl_free_key($privateKey);
unset($decrypted, $private_key, $privateKey, $decrypt, $encrypt);
}catch (\Exception $e){
$encrypted = '';
} return $encrypted;
} /**
* RSA公钥解密
* @param $encrypted 待解密密文
* @param $public_key 公钥
* @param string $key_password 证书密码
* @return bool|string
*/
public static function public_decrypt($encrypted, $public_key)
{ try{
$public_key = self::public_key($public_key); $publicKey = openssl_pkey_get_public($public_key); //这个函数可用来判断公钥是否是可用的,可用返回资源id Resource id
if(!$publicKey) return false; $encrypted = str_split(base64_decode($encrypted), 128);
$decrypted = '';
foreach ($encrypted as $encrypt){
$decrypt = '';
openssl_public_decrypt($encrypt, $decrypt, $publicKey);//私钥解密
$decrypted .= $decrypt;
}
openssl_free_key($publicKey);
unset($encrypted, $public_key, $publicKey, $encrypt, $decrypt);
}catch (\Exception $e){
$decrypted = '';
} return $decrypted;
} /**
* RSA私钥解密
* @param $encrypted 待解密密文
* @param $private_key 私钥
* @param string $key_password 证书密码
* @return bool|string
*/
public static function private_decrypt($encrypted, $private_key, $key_password='')
{
try{
$private_key = self::private_key($private_key, $key_password); $privateKey = openssl_pkey_get_private($private_key, $key_password); //这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
if(!$privateKey) return false; $encrypted = str_split(base64_decode($encrypted), 128); $decrypted = '';
foreach ($encrypted as $encrypt){
$decrypt = '';
openssl_private_decrypt($encrypt, $decrypt, $privateKey);//私钥解密
$decrypted .= $decrypt;
}
openssl_free_key($privateKey);
unset($encrypted, $private_key, $privateKey, $encrypt, $decrypt);
}catch (\Exception $e){
$decrypted = '';
} return $decrypted;
} /**
* 私钥生成签名
* @param $string 待签名字符串
* @param $private_key 私钥
* @param string $key_password 证书密码
* @return bool|string
*/
public static function sign($string, $private_key, $key_password='')
{ try{
$private_key = self::private_key($private_key, $key_password); $privateKey = openssl_pkey_get_private($private_key, $key_password); //这个函数可用来判断私钥是否是可用的,可用返回资源id Resource id
if(!$privateKey) return false; openssl_sign($string, $sign, $privateKey);
openssl_free_key($privateKey);
$sign = base64_encode($sign);//最终的签名
unset($string, $private_key, $key_password, $privateKey);
}catch (\Exception $e){
$sign = '';
} return $sign;
} /**
* 公钥校验签名
* @param $string 待签名字符串
* @param $sign 签名
* @param $public_key 公钥
* @return bool
*/
public static function verify($string, $sign, $public_key)
{ try{
$public_key = self::public_key($public_key); $publicKey = openssl_pkey_get_public($public_key); //这个函数可用来判断公钥是否是可用的,可用返回资源id Resource id
if(!$publicKey) return false; $sign = base64_decode($sign);//得到的签名
$result = openssl_verify($string, $sign, $publicKey);
openssl_free_key($publicKey);
unset($string, $sign, $public_key, $publicKey);
}catch (\Exception $e){
$result = 0;
} return $result === 1 ? true : false;
} }

RSA加密解密算法的更多相关文章

  1. 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输

    Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...

  2. jmeter接口测试-使用rsa加密解密算法

    本篇介绍jmeter 使用rsa算法进行加密参数 如果测试过程中,部分接口采用了rsa加密算法,我们的jmeter 也是可以直接拿来调用的,不需要开发配合去掉加密代码! 直接上代码 import or ...

  3. android -------- RSA加密解密算法

    RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用 RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计 ...

  4. RSA加密解密及数字签名Java实现--转

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...

  5. RSA加密解密(转)

    RSA加密解密 对于RSA产生的公钥.私钥,我们可以有两种方式可以对信息进行加密解密.私钥加密-公钥解密 和 公钥加密-私钥解密RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest) ...

  6. (转)RSA加密解密及数字签名Java实现

    转:http://my.oschina.net/jiangli0502/blog/171263?fromerr=hc4izFe2  RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rives ...

  7. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  8. Cryptopp iOS 使用 RSA加密解密和签名验证签名

    Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...

  9. 自己写的AES和RSA加密解密工具

    package com.sdyy.common.utils; import java.security.Key; import java.security.KeyFactory; import jav ...

随机推荐

  1. 石家庄地铁系统开发(java web版)(二)

    两种方法: 一,自己写数据库,自己写算法实现 二,调用已有软件的API(百度,高德)

  2. 免费高端出辕营,横空出世惊鬼神 Excel插件:ExcelPower_Helper 0.41初出茅庐

    免费高端出辕营,横空出世惊鬼神 Excel插件:ExcelPower_Helper 0.41初出茅庐        隐鹤 倾心开发 2019.4.1 1.   引言 经过前后大约零零散散的一年的开发, ...

  3. [转帖]Shell脚本中的break continue exit return

    Shell脚本中的break continue exit return 转自:http://www.cnblogs.com/guosj/p/4571239.html break结束并退出循环 cont ...

  4. LVS实现负载均衡安装配置详解

    =========实践LVS/NAT模式========== 1.实验环境 三台服务器,一台作为 director,两台作为 real server,director 有一个外网网卡(172.16.2 ...

  5. Webstorm的一些常用快捷键

    ctrl+/ 单行注释ctrl+shift+/块注释Ctrl+X 删除行Ctrl+D 复制行Ctrl+B 快速打开光标处的类或方法Ctrl+F 查找文本Ctrl+R 替换文本ctrl+shift+ + ...

  6. Vue.js 2.x笔记:表单绑定(3)

    1. 基础用法 v-model 指令:在表单 input 和 textarea 元素上创建双向数据绑定. 1.1 单行文本(Text) <div id="app"> & ...

  7. 使用react全家桶制作博客后台管理系统

    前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基于react全家桶(React.React-r ...

  8. ionic3创建选项卡

    html页面 <ion-content padding> <ion-segment [(ngModel)]="tabs"> <ion-segment- ...

  9. 「洛谷5300」「GXOI/GZOI2019」与或和【单调栈+二进制转化】

    题目链接 [洛谷传送门] 题解 按位处理. 把每一位对应的图都处理出来 然后单调栈处理一下就好了. \(and\)操作处理全\(1\). \(or\)操作处理全\(0\). 代码 #include & ...

  10. kubernetes学习第一篇-k8s安装以及HelloWorld

    安装 1. 关闭防火墙服务 # systemctl disable firewalld # systemctl stop firewalld 2. 安装etcd以及kubernetes软件 yum i ...