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()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...
随机推荐
- JavaScript对象的两类属性(数据属性与访问器属性)
对JavaScript来说,属性并非只是简单的名称和值,JavaScript用一组特征(attribute)来描述属性 (property). 第一类属性数据属性具有四个特征. value:就是属性的 ...
- 事项同步事项编码(mt_code)长度超过数据库限制的varchar(32)线上问题
改下长度限制重新同步下,可以恢复正常!
- 有哪些浏览器还支持flash?
Flash是大名鼎鼎的全家桶公司Adobe设计的一款网页动画软件,早期的动态网页基本都是基于Flash开发的.但是后来不断爆出关于Flash的安全漏洞和运行效率问题,虽然Adobe公司一直在尝试解决, ...
- Java类加载器概述
Java类加载器概述 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的. 系统提供的类加载器 引导类加载器 它用来加载 Java 的核心库,是用原生 ...
- windows中抓包命令,以及保存为多个文件的方法
本文主要介绍windows中抓包命令,以及保存为多个文件的方法 说一说保存为多个文件存储数据包这个问题的由来,一般如果长时间抓包,有可能需要等上几个小时,因为这个时候抓包的内容都是存放在内存中的,几个 ...
- .NET Reflector软件破解
转自:https://blog.csdn.net/zxy13826134783/article/details/89057871 软件和注册机下载地址: 链接:https://pan.baidu.co ...
- NOIP2012提高组初赛NB题
本题中,我们约定布尔表达式只能包含 p, q, r 三个布尔变量,以及"与"(∧)."或"(∨)."非"(¬)三种布尔运算.如果无论 p, ...
- 题解 Children Trips
题目传送门 Description 给出一个大小为 \(n\) 的边权全为 \(1,2\) 的带权树,有 \(q\) 此查询,每次给出 \(u,v,p\) ,问 \(u\to v\) 每次可以最多走边 ...
- PTA数据结构 习题2.1 简单计算器 (20分)
习题2.1 简单计算器 (20分) 模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式: 输入在一行中给出一个四则运算 ...
- 返回值优化 RVO
<深度探索C++对象模型>-- 2.3 返回值的初始化 & 在编译器层面做优化