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 ...
随机推荐
- Spring项目定时任务
最近某协会网站有个需求:显示当天访问量,很明显需要做俩步:一个是访问请求量的显示,一个需要每天00点恢复访问次数为0 所以需要做个定时任务:每天00点更新: 注解用法Spring配置: 1.在spri ...
- Vue—组件传值及vuex的使用
一.父子组件之间的传值 1.父组件向子组件传值: 子组件在props中创建一个属性,用以接收父组件传来的值 父组件中注册子组件 在子组件标签中添加子组件props中创建的属性 把需要传给子组件的值赋给 ...
- React react-fastclick-alt 移动端点击
1. Install npm install --save-dev react-fastclick-alt 2. 用法 将元素或者component放在 <FastClick>...&l ...
- Lazy 延迟加载
问题:最近遇到一个项目遇到一个问题(很久的项目,现阶段主要维护),程序初始化的时候比较慢,最后查原因的时候发现是因为一个类的构造方法里面有些逻辑, 解决办法:希望在使用的时候再进行加载,最后想到了延迟 ...
- 【HTML】行内-块级-行块级
行内元素 相邻元素可以在一行显示直到一行排不下才进行换行. 不可设置宽高,宽度随内容变化. padding和margin的设置中,水平方向(padding-left...)有效果,垂直方向无效果. 块 ...
- js回调地域 和 用promise解决方法
回调地狱: function3({cb3()}){ function2({cb2(cb3)}){ //cb2触发了cb3,并传值 function1({cb1(cb2)}){ //cb1触发了cb2, ...
- C语言博客作业04--数组
1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 关于数组,数组是最基本的构造类型,它是一组相同类型数据的有序组合.数组中的元素在内存中连续存放,每个元素 ...
- Leetcode 5
HashTable Easy 1. 136. Single Number 0与0异或是0,1与1异或也是0,那么我们会得到0 class Solution { public: int singleNu ...
- GraphQL
GraphQL 官方描述: GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时. GraphQL 对你的 API 中的数据提供了一套易于理解的完整描述,使得客户端能够准确地 ...
- python之路day10-命名空间和作用域、函数嵌套,作用域链、闭包
楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print ...