java实现rsa加密算法【5min快速应用教程】
该篇文章的主要目的是让读者能够迅速应用到项目中,想要了解详细的rsa加密算法的,可以百度找到更多原理、深度分析的文章。
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密,公钥解密,私钥加密。举个例子,比如你要跟第三方支付公司进行接口调用,对方要求使用rsa加密。那么首先他们会提供一个公钥给你,你同时需要提供己方的私钥。这样对方发送的用对方的私钥加密的密文给你,你用对方的公钥可以解密。同样你用自己的私钥加密,对方接收到报文后,可以用你方提供的公钥解密。这样的接口调用就会安全很多。
那么如何生成公钥私钥呢?如果你有一台linux服务器,可以通过以下命令来生成:
1.openssl genrsa -out RSA_PRI.key 1024
2.openssl pkcs8 -topk8 -inform PEM -in RSA_PRI.key -outform PEM -nocrypt
3.openssl rsa -in RSA_PRI.key -pubout -out RSA_PUB.key
如果linux服务器没有安装openssl,则从网上搜索下安装教程,安装好,首先执行第一条命令:openssl genrsa -out RSA_PRI.key 1024,会看到在当前目录下生成文件RSA_PRI.key,这个就是私钥。把私钥转为pkcs8格式,生成私钥后转pkcs8格式,需要执行第二条命令:openssl pkcs8 -topk8 -inform PEM -in RSA_PRI.key -outform PEM -nocrypt,这时你会看到屏幕上出现新的私钥字符串。然后先不管新的私钥字符串,紧接着生成公钥,执行第三条命令:openssl rsa -in RSA_PRI.key -pubout -out RSA_PUB.key,这时会看到当前目录下生成的公钥文件RSA_PUB.key。这个时候把执行完第二条命令后在屏幕上打出的新的私钥代替RSA_PRI.key文件中的私钥串。这时你已经有自己的公钥私钥了,联调接口前把公钥发给对方。
接下来就是如果用己方的私钥加密报文发送,以及接收到密文后如何用对方公钥解密。以下附上java代码。
/**
* RSA私钥加签
* @param priKeyByte 经过base64处理后的私钥
* @param sourceMessage明文内容
* @return 十六进制的密文
*/
public static String sign(byte[] priKeyByte, String sourceMessage) {
try {
PKCS8EncodedKeySpec pkcs8 = new PKCS8EncodedKeySpec(Base64.decodeBase64(priKeyByte));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey priKey = keyFactory.generatePrivate(pkcs8);
// 用私钥对信息生成数字签名
Signature signet = Signature.getInstance("SHA256withRSA");
signet.initSign(priKey);
signet.update(sourceMessage.getBytes("UTF-8"));
return byte2hex(signet.sign());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 字节转为十六进制字符
* @param 十六进制字符
* @return 字节
*/
public static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; b != null && n < b.length; n++) {
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs;
}
/**
* 公钥验签
* @param pubKeyByte 经过base64处理后的公钥
* @param sourceMessage 明文内容
* @param passStr 对方签名串
* @return
*/
public static boolean verify(byte[] pubKeyByte, String sourceMessage, String passStr) {
try {
X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(pubKeyByte));
// RSA非对称加密算法
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
// 公钥
PublicKey pubKey = keyFactory.generatePublic(bobPubKeySpec);
// 对方签名串转为字节
byte[] signed = hex2byte(passStr.getBytes("UTF-8"));
Signature signatureChecker = Signature.getInstance("SHA256withRSA");
signatureChecker.initVerify(pubKey);
signatureChecker.update(sourceMessage.getBytes("UTF-8"));
// 验证签名是否正常
return signatureChecker.verify(signed);
} catch (Throwable e) {
return false;
}
}
/**
* 十六进制字符转为字节
* @param 十六进制字符
* @return 字节
*/
public static byte[] hex2byte(byte[] b) {
if ((b.length % 2) != 0)
throw new IllegalArgumentException();
byte[] b2 = new byte[b.length / 2];
for (int n = 0; n < b.length; n += 2) {
String item = new String(b, n, 2);
b2[n / 2] = (byte) Integer.parseInt(item, 16);
}
return b2;
}
java实现rsa加密算法【5min快速应用教程】的更多相关文章
- Java使用RSA加密算法对内容进行加密
什么是RSA加密算法 RSA是一种典型的非对称性加密算法,具体介绍可参考阮一峰的日志 RSA算法原理 下面是使用RSA算法对传输内容进行加密的一个简要Java案例,主要用到了三个类,大体实现如下: 对 ...
- JAVA的RSA加密算法工具类
须要用到一个jar http://www.bouncycastle.org/latest_releases.html 须要注意的问题 JS用同一秘钥生成的密文用java解密出来是逆序的,即js加密12 ...
- RSA加密算法的java实现
package rsa; import java.security.*;import java.security.interfaces.*;import javax.crypto.*; public ...
- 【Java线程池快速学习教程】
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
- 【Java的JNI快速学习教程】
1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时 ...
- JAVA的非对称加密算法RSA——加密和解密
原文转载至:https://www.cnblogs.com/OnlyCT/p/6586856.html 第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一 ...
- Java 图片处理解决方案:ImageMagick 快速入门教程
文章首发于[博客园-陈树义],点击跳转到原文Java 图片处理解决方案:ImageMagick 快速入门教程. ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件 ...
- JAVA实现RSA加密,非对称加密算法
RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.K ...
- Java线程池快速学习教程
1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
随机推荐
- ACID的实现原理
引言 ACID是事务的特点也是必须的要求,只有保证ACID事务的执行才不会出错,分别是原子性.一致性.隔离性和持久性.我们知道典型的MySQL事务是这样执行的: start transaction 开 ...
- 十、Abp vNext 基础篇丨权限
介绍 本章节来把接口的权限加一下 权限配置和使用 官方地址:https://docs.abp.io/en/abp/latest/Authorization 下面这种代码可能我们日常开发都写过,ASP. ...
- PHP中的数组分页实现(非数据库)
在日常开发的业务环境中,我们一般都会使用 MySQL 语句来实现分页的功能.但是,往往也有些数据并不多,或者只是获取 PHP 中定义的一些数组数据时需要分页的功能.这时,我们其实不需要每次都去查询数据 ...
- vue报错 Uncaught TypeError: Cannot read property of null
有可能是点击a标签,但是a标签有click事件,未阻止默认事件导致报错,开始都看不出来是什么错误
- php保留2位小数方法
$num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 echo round($num,2); //10.46 //第二种:利用sprintf格式化字符串 $format_ ...
- Jmeter系列(29)- 性能指标(2) | 并发数
并发数 概念 同时承载正常使用系统功能的用户数量:系统能够同时处理请求的数目. 通过问题详解 问题:网站的并发数,究竟指的同时提交请求的用户数目,还是用户同时提交的请求的数目? 答案:根据这句描述&q ...
- 关于python如何构造测试数据
参考资料:https://www.cnblogs.com/miaoxiaochao/p/13234589.html 一.Faker模块是什么? 一个Python第三方模块,主要用来创建伪数据 无需再手 ...
- 疏忽Bug
仅供自己留存备份 错误: vector不是模板 解决: 头文件未包含 头文件: #include <vector> using namespace std; 错误: 多字节字符 ...
- 鸿蒙内核源码分析(根文件系统) | 先挂到`/`上的文件系统 | 百篇博客分析OpenHarmony源码 | v66.01
百篇博客系列篇.本篇为: v66.xx 鸿蒙内核源码分析(根文件系统) | 先挂到/上的文件系统 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...
- Codeforces Round #747 (Div. 2)
比赛地址 A(水题) 题目链接 题目: 给出指定\(n\),求解出一段区间\([l,r]\)使得\(\sum\limits_{i=l}^ri=n\) 解析: 从点0,1两点作为起点分别向左右延伸长度, ...