该篇文章的主要目的是让读者能够迅速应用到项目中,想要了解详细的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. JavaScript对象的两类属性(数据属性与访问器属性)

    对JavaScript来说,属性并非只是简单的名称和值,JavaScript用一组特征(attribute)来描述属性 (property). 第一类属性数据属性具有四个特征. value:就是属性的 ...

  2. 事项同步事项编码(mt_code)长度超过数据库限制的varchar(32)线上问题

    改下长度限制重新同步下,可以恢复正常!

  3. 有哪些浏览器还支持flash?

    Flash是大名鼎鼎的全家桶公司Adobe设计的一款网页动画软件,早期的动态网页基本都是基于Flash开发的.但是后来不断爆出关于Flash的安全漏洞和运行效率问题,虽然Adobe公司一直在尝试解决, ...

  4. Java类加载器概述

    Java类加载器概述 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的. 系统提供的类加载器 引导类加载器 它用来加载 Java 的核心库,是用原生 ...

  5. windows中抓包命令,以及保存为多个文件的方法

    本文主要介绍windows中抓包命令,以及保存为多个文件的方法 说一说保存为多个文件存储数据包这个问题的由来,一般如果长时间抓包,有可能需要等上几个小时,因为这个时候抓包的内容都是存放在内存中的,几个 ...

  6. .NET Reflector软件破解

    转自:https://blog.csdn.net/zxy13826134783/article/details/89057871 软件和注册机下载地址: 链接:https://pan.baidu.co ...

  7. NOIP2012提高组初赛NB题

    本题中,我们约定布尔表达式只能包含 p, q, r 三个布尔变量,以及"与"(∧)."或"(∨)."非"(¬)三种布尔运算.如果无论 p, ...

  8. 题解 Children Trips

    题目传送门 Description 给出一个大小为 \(n\) 的边权全为 \(1,2\) 的带权树,有 \(q\) 此查询,每次给出 \(u,v,p\) ,问 \(u\to v\) 每次可以最多走边 ...

  9. PTA数据结构 习题2.1 简单计算器 (20分)

    习题2.1 简单计算器 (20分) 模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式: 输入在一行中给出一个四则运算 ...

  10. 返回值优化 RVO

    <深度探索C++对象模型>-- 2.3 返回值的初始化 & 在编译器层面做优化