RSA加密解密算法
/**
* 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加密解密算法的更多相关文章
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- jmeter接口测试-使用rsa加密解密算法
本篇介绍jmeter 使用rsa算法进行加密参数 如果测试过程中,部分接口采用了rsa加密算法,我们的jmeter 也是可以直接拿来调用的,不需要开发配合去掉加密代码! 直接上代码 import or ...
- android -------- RSA加密解密算法
RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用 RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计 ...
- RSA加密解密及数字签名Java实现--转
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...
- RSA加密解密(转)
RSA加密解密 对于RSA产生的公钥.私钥,我们可以有两种方式可以对信息进行加密解密.私钥加密-公钥解密 和 公钥加密-私钥解密RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest) ...
- (转)RSA加密解密及数字签名Java实现
转:http://my.oschina.net/jiangli0502/blog/171263?fromerr=hc4izFe2 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rives ...
- iOS使用Security.framework进行RSA 加密解密签名和验证签名
iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...
- Cryptopp iOS 使用 RSA加密解密和签名验证签名
Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...
- 自己写的AES和RSA加密解密工具
package com.sdyy.common.utils; import java.security.Key; import java.security.KeyFactory; import jav ...
随机推荐
- Python之路【第十七篇】:Django【进阶篇 】(转自银角大王博客)
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- Laravel-任务调度
简介Cron 是 UNIX.SOLARIS.LINUX 下的一个十分有用的工具,通过 Cron 脚本能使计划任务定期地在系统后台自动运行.这种计划任务在 UNIX.SOLARIS.LINUX下术语为 ...
- python调试之pdb
一.PDB调试命令 pdb调试命令 完整命令 简写命令 描述 args a 列出当前函数的参数 break b <行号> 在某一行设置断点 break b <文件名>:< ...
- (简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
就在我们使用Pc接通安卓手机的时候,如果手机没有开启usb开发者调试模式,Pc则无办法成功检测到我们的手机,在一些情况下,我们使用的一些功能较强的app好比之前我们使用的一个app引号精灵,老版本就需 ...
- mysql的btree和hash的区别
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...
- 图像风格迁移(Pytorch)
图像风格迁移 最后要生成的图片是怎样的是难以想象的,所以朴素的监督学习方法可能不会生效, Content Loss 根据输入图片和输出图片的像素差别可以比较损失 \(l_{content} = \fr ...
- 【LOJ#3095】[SNOI2019]字符串(后缀数组)
[LOJ#3095][SNOI2019]字符串(后缀数组) 题面 LOJ 题解 首先画图看看如何比较两个串的大小,发现这个东西等价于求两个相邻的后缀的\(LCP\). 一个做法是求出\(SA\),然后 ...
- VUE项目中使用mint-ui框架总结
针对PC端,element-ui可谓是首选了,UI体验效果很好. element-ui 框架官网:http://element.eleme.io/#/zh-CN/component/installat ...
- 3754. 【NOI2014】魔法森林(LCT)
Problem 给定一个\(n\)个结点,\(m\)条边的的无向图,每条边有两个权值\(ai,bi\). 现在从\(1\)出发,要到达\(n\),每次只能沿着\(ai\le A\)且\(bi\le B ...
- 编写高质量的Python代码系列(四)之元类及属性
元类(metaclass)及动态属性(dynamic attribute)都是很强大的Python特性,然后他们也可能导致及其古怪.及其突然的行为.本节讲解这些机制的常见用法,以确保各位程序员写出来的 ...