该篇文章的主要目的是让读者能够迅速应用到项目中,想要了解详细的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. Shell系列(21)- 字符截取命令printf

    作用 printf是标准格式输出命令,控制输出格式,不会自动加入换行符.awk会用到该条命令 命令 printf '输出类型输出格式' 输出内容 #''双引号不能少,输出类型和输出格式之间没有空格 输 ...

  2. python刷题第二周

    1: 第3章-5 字符转换 (15 分) 本题要求提取一个字符串中的所有数字字符('0'--'9'),将其转换为一个整数输出. 输入格式: 输入在一行中给出一个不超过80个字符且以回车结束的字符串. ...

  3. 集群环境下的Session管理

    1. 集群环境下的管理HTTPSSession所遇到的问题 一台服务器对应这个一个session对象,无法在另外一个服务器互通 解决方法: 1. Session 的 Replication(复制)将当 ...

  4. [转载20131024]Nginx服务器漏洞的利用和修复方法

    本文主要分为两大部分,第一部分介绍了Nginx的一些常见安全漏洞的形成原因.利用方法,并给出了相应的解决办法;第二部分介绍了Nginx安全加固时需要关注的主要内容. Nginx(发音同engine x ...

  5. 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 百篇博客分析OpenHarmony源码 | v49.04

    百篇博客系列篇.本篇为: v49.xx 鸿蒙内核源码分析(信号消费篇) | 谁让CPU连续四次换栈运行 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...

  6. P7408-[JOI 2021 Final]ダンジョン 3【贪心,树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P7408 题目大意 一个有\(n+1\)层的地牢,从\(i\)到\(i+1\)层要\(A_i\)点能量,第\(i\) ...

  7. CF444C-DZY Loves Colors【线段树,set】

    正题 题目链接:https://www.luogu.com.cn/problem/CF444C 题目大意 \(n\)个物品第\(i\)个颜色为\(i\),权值为\(0\).要求支持\(m\)次操作 给 ...

  8. es相关监控指标梳理

    ###################ElasticSearch监控指标梳理########################### #author:lugh1 # #date:2021-09-26 # ...

  9. LR Socket接收超时TPS上不去解决方法

    在一次做项目中,由于Socket协议接收的报文会有不定长度,基本每次都会有变化,在data.ws 接收buf1有固定长度,这是在接收的实时报文会有长度不一致的问题.这时LR默认会去与接收的报文的长度及 ...

  10. asp.net core使用identity+jwt保护你的webapi(一)——identity基础配置

    前言 用户模块几乎是每个系统必备的基础功能,如果每次开发一个新项目时都要做个用户模块,确实非常无聊.好在asp.net core给我们提供了Identity,使用起来也是比较方便,如果对用户这块需求不 ...