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 ...
随机推荐
- MR-join连接1......
MR-join连接
- mysql5.6.x 字符集修改
1 安装好mysql5.6.x 之后,修改字符集配置为utf8才能支持中文,因为默认为latin1 查看mysql字符集命令: SHOW VARIABLES LIKE 'char%' 2 修改配置文件 ...
- FJUTOJ-周赛2016-12-16
注:fjutoj基本每周都有一次周赛,欢迎大家都来参加! 网址:http://59.77.139.92/index.jsp A题:来源 POJ 2773 题意:给两个数m和k,问第k 个和m 互素的数 ...
- List、Map、Set之间的联系与区别:
一.数组和集合的区别: 1.数组的大小是固定的,并且同一个数组只能是相同的数据类型 2.集合的大小是不固定的,在不知道会有多少数据的情况下可使用集合. 二.集合的三种类型:list(列表).set(集 ...
- Vue.js 2.x笔记:表单绑定(3)
1. 基础用法 v-model 指令:在表单 input 和 textarea 元素上创建双向数据绑定. 1.1 单行文本(Text) <div id="app"> & ...
- python学习日记(OOP数据封装)
class Student(object): def __init__(self,name,score): self.name = name self.score = score li = Stude ...
- 关于Vue修改默认的build文件存放的dist路径
原文地址:http://www.cnblogs.com/JimmyBright/p/7681086.html Vue默认build路径是项目的dist目录下,有时候我们可能希望build之后的文件自动 ...
- luogu4166 最大土地面积 (旋转卡壳)
首先这样的点一定在凸包上 然后旋转卡壳就可以 具体来说,枚举对角线的一个端点,另一个端点在凸包上转,剩下两个点就是一个叉积最大一个最小,而这两个点也是跟着转的 所以是$O(N^2)$ #include ...
- SDOI2019游记
Day0 一大早就起床,结果忙活了整整一上午. 12:20从gryz出发,路上发现把耳机和笔忘另一个背包里了(都怪老爸非得让我换背包),15:30差不多就到山师了. 山师也是蛮漂亮的,花开得挺好.到处 ...
- mysql的服务器构成
什么是实例 这里的实例不是类产生的实例对象,而是Linux系统下的一种机制 1.MySQL的后台进程+线程+预分配的内存结构. 2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内 ...