该篇文章的主要目的是让读者能够迅速应用到项目中,想要了解详细的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快速应用教程】的更多相关文章

  1. Java使用RSA加密算法对内容进行加密

    什么是RSA加密算法 RSA是一种典型的非对称性加密算法,具体介绍可参考阮一峰的日志 RSA算法原理 下面是使用RSA算法对传输内容进行加密的一个简要Java案例,主要用到了三个类,大体实现如下: 对 ...

  2. JAVA的RSA加密算法工具类

    须要用到一个jar http://www.bouncycastle.org/latest_releases.html 须要注意的问题 JS用同一秘钥生成的密文用java解密出来是逆序的,即js加密12 ...

  3. RSA加密算法的java实现

    package rsa; import java.security.*;import java.security.interfaces.*;import javax.crypto.*; public ...

  4. 【Java线程池快速学习教程】

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  5. 【Java的JNI快速学习教程】

    1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时 ...

  6. JAVA的非对称加密算法RSA——加密和解密

    原文转载至:https://www.cnblogs.com/OnlyCT/p/6586856.html 第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一 ...

  7. Java 图片处理解决方案:ImageMagick 快速入门教程

    文章首发于[博客园-陈树义],点击跳转到原文Java 图片处理解决方案:ImageMagick 快速入门教程. ImageMagick介绍 ImageMagick是一个免费的创建.编辑.合成图片的软件 ...

  8. JAVA实现RSA加密,非对称加密算法

    RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.K ...

  9. Java线程池快速学习教程

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

随机推荐

  1. Java基础系列(13)- 包机制

    包机制 为了更好的组织类,Java提供了包机制,用于区别类名的命名空间 包语句的语法格式为: package pkg1[. pkg2[. pkg3...]]; 一般利用公司域名倒置作为报名 为了能够使 ...

  2. django ORM教程(转载)

    Django中ORM介绍和字段及字段参数   Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简 ...

  3. Python创建Excel表格,Word并写入数据

    from tkinter import Tk from time import sleep from tkinter.messagebox import showwarning import win3 ...

  4. Sentry 监控 - Alerts 告警

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  5. 【C++ Primer Plus】编程练习答案——第3章

    1 void ch3_1() { 2 using namespace std; 3 unsigned int factor = 12; 4 unsigned int inch, feet; 5 cou ...

  6. MyBatis 批量插入数据的 3 种方法!

    批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 ...

  7. Serverless 解惑——函数计算如何安装字体

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute):函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准 ...

  8. Java标识符和关键字的区别!java基础 java必学

    任何计算机语言都离不开标识符和关键字,那我们就来简单讲一下他们两者的区别,希望有助于大家的的理解!本篇文章干货满满,如果你觉得难懂的话可以看下高淇老师讲的Java300集的教学视频,分选集,深度剖析了 ...

  9. Windows Terminal 美化教程

    Windows Terminal 美化教程 1.安装Windows Terminal 在微软商店搜索Windows Terminal下载即可 2.安装相应的插件 使用管理员权限打开Windows Te ...

  10. 题解 Crash 的文明世界

    题目传送门 题目大意 给出一个\(n\)个点的树,和常数\(k\),对于\(\forall i\in[1,n]\),求出: \[\sum_{j=1}^{n} \text{dist}(i,j)^k \] ...