文章目录

  • 前言
  • 一、第一步使用generatorKeyPair产生公私钥
  • 二、取出公私钥字符串
  • 三、加解密算法
  • 四、测试(附全码)

前言

由于在银行方面工作对数据安全性要求比较高,需要对前后端通信的数据进行加密,因此编写一个简易的RSA加密算法工具类,可以提高前后端传送数据时的安全性。再次罗列下来,希望自己能有一个更好的理解以及帮助到有需要的小伙伴!有问题的小伙伴可以底部留言,我抽空都会帮忙解答一下,一起加油,共同进步!

一、第一步使用generatorKeyPair产生公私钥

首先创建generatorKeyPair对象(传入要加密的算法)并初始化(传入加密位数),使用其产生keyPair,接着从其其中取出公私钥,最后放到map中进行打包返回。

 /*** 通过KeyPairGenerator产生公私钥* @return* @throws NoSuchAlgorithmException*/public static Map<String ,Object> generetorKeyPair() throws NoSuchAlgorithmException {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGenerator.initialize(INITIALIZE_LENGTH);KeyPair keyPair = keyPairGenerator.generateKeyPair();RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();HashMap<String, Object> map = new HashMap<>();map.put("RSAPublicKey",rsaPublicKey);map.put("RSAPrivateKey",rsaPrivateKey);return map;}

二、取出公私钥字符串

手动创建两个方法,分别对公私钥进行base64加密字符串(此处采用 java.util.Base64或者commons.codec下的Base64都是可以的),有效提高公私钥的安全性。


/*** 拿到RSA公钥字符串* @param map* @return*/public static String getRSAPublicKey(Map<String ,Object> map) {Key rsaPublicKey = (Key) map.get(PUBLIC_KEY);return Base64.getEncoder().encodeToString(rsaPublicKey.getEncoded());}/***拿到RSA私钥字符串* @param map* @return*/public static String getRSAPriateKey(Map<String ,Object> map) {Key rsaPrivateKey = (Key) map.get(PRIVATE_KEY);return Base64.getEncoder().encodeToString(rsaPrivateKey.getEncoded());}

三、加解密算法

通过Cipher加解密类实现RSA的加密解密,加密和解密的过程类似,是一个可逆的过程。加密公钥采用的是X509EncodedKeySpec 产生一个实例作为参数传入KeyFactory中产生一个公钥。后面直接把公钥以及数据作为参数传入Cipher中即可实现加密。这里如果需要加密的数据长度较小可以采用一次加密。否则可以采用分段加密,代码中有详细解释,这里不多做阐述。解密的过程类似,但采用PKCS8EncodedKeySpec 产生实例,并把其传入KeyFactory中产生私钥,下面解密与加密类似可以一次性解密就直接解密,否则就分段解密。

/*** 使用公钥进行加密* @param data* @param publicKey* @return* @throws Exception*/public static byte[] encryptByPublic( byte[] data,String publicKey ) throws Exception {byte[] decode = Base64.getDecoder().decode(publicKey);X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(decode);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PublicKey publicK = keyFactory.generatePublic(x509EncodedKeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE,publicK);//如果加密明文长度小于规定的最大长度,如下直接加密就好,否则需要分段加密//cipher.doFinal(data);//以下为分段加密int length = data.length;int i=0;int offset=0;byte[] cache = null;ByteArrayOutputStream baos = new ByteArrayOutputStream();while (length-offset>0) {if (length-offset>MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(data, offset, MAX_ENCRYPT_BLOCK);}else {cache = cipher.doFinal(data,offset,length-offset);}baos.write(cache,0,cache.length);i++;offset = i * MAX_ENCRYPT_BLOCK;}byte[] encryptData = baos.toByteArray();baos.close();return encryptData;}/*** 使用私钥进行解密* @param data* @param privateKey* @return* @throws Exception*/public static byte[] decryptByPrivateKey( byte[] data,String privateKey ) throws Exception {byte[] decode = Base64.getDecoder().decode(privateKey);PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(decode);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PrivateKey publicK = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE,publicK);//如果解密明文长度小于规定的最大长度,如下直接解密就好,否则需要分段解密//cipher.doFinal(data);//以下为分段解密int length = data.length;int i=0;int offset=0;byte[] cache = null;ByteArrayOutputStream baos = new ByteArrayOutputStream();while (length-offset>0) {if (length-offset>MAX_DECRYPT_BLOCK) {cache = cipher.doFinal(data, offset, MAX_DECRYPT_BLOCK);}else {cache = cipher.doFinal(data,offset,length-offset);}baos.write(cache,0,cache.length);i++;offset = i * MAX_DECRYPT_BLOCK;}byte[] decryptData = baos.toByteArray();baos.close();return decryptData;}

该处使用的url网络请求的数据。


四、测试(附全码)

下面我们简单测试一下,随便传句话,试下效果。各位小伙伴们,如下所示:

package com.trs.util;import jdk.nashorn.internal.runtime.RewriteException;
import org.omg.CORBA.PUBLIC_MEMBER;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;/*** Demo class*一个简易版本的RSA加密算法的实现* @author crazy-water* @date 10/21/2021 6:43 PM*/
public class RSAUtil {//加密算法public static final  String KEY_ALGORITHM = "RSA";//RSA公钥public static final   String PUBLIC_KEY = "RSAPublicKey";//RSA私钥public static final String PRIVATE_KEY = "RSAPrivateKey";//1024位最大加密长度public static final int MAX_ENCRYPT_BLOCK = 117;//1024位最大解密长度public static final int MAX_DECRYPT_BLOCK = 128;//加密位数public static final int INITIALIZE_LENGTH = 1024;/*** 通过KeyPairGenerator产生公私钥* @return* @throws NoSuchAlgorithmException*/public static Map<String ,Object> generetorKeyPair() throws NoSuchAlgorithmException {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGenerator.initialize(INITIALIZE_LENGTH);KeyPair keyPair = keyPairGenerator.generateKeyPair();RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();HashMap<String, Object> map = new HashMap<>();map.put("RSAPublicKey",rsaPublicKey);map.put("RSAPrivateKey",rsaPrivateKey);return map;}/*** 拿到RSA公钥字符串* @param map* @return*/public static String getRSAPublicKey(Map<String ,Object> map) {Key rsaPublicKey = (Key) map.get(PUBLIC_KEY);return Base64.getEncoder().encodeToString(rsaPublicKey.getEncoded());}/***拿到RSA私钥字符串* @param map* @return*/public static String getRSAPriateKey(Map<String ,Object> map) {Key rsaPrivateKey = (Key) map.get(PRIVATE_KEY);return Base64.getEncoder().encodeToString(rsaPrivateKey.getEncoded());}/*** 使用公钥进行加密* @param data* @param publicKey* @return* @throws Exception*/public static byte[] encryptByPublic( byte[] data,String publicKey ) throws Exception {byte[] decode = Base64.getDecoder().decode(publicKey);X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(decode);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PublicKey publicK = keyFactory.generatePublic(x509EncodedKeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE,publicK);//如果加密明文长度小于规定的最大长度,如下直接加密就好,否则需要分段加密//cipher.doFinal(data);//以下为分段加密int length = data.length;int i=0;int offset=0;byte[] cache = null;ByteArrayOutputStream baos = new ByteArrayOutputStream();while (length-offset>0) {if (length-offset>MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(data, offset, MAX_ENCRYPT_BLOCK);}else {cache = cipher.doFinal(data,offset,length-offset);}baos.write(cache,0,cache.length);i++;offset = i * MAX_ENCRYPT_BLOCK;}byte[] encryptData = baos.toByteArray();baos.close();return encryptData;}/*** 使用私钥进行解密* @param data* @param privateKey* @return* @throws Exception*/public static byte[] decryptByPrivateKey( byte[] data,String privateKey ) throws Exception {byte[] decode = Base64.getDecoder().decode(privateKey);PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(decode);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);PrivateKey publicK = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE,publicK);//如果解密明文长度小于规定的最大长度,如下直接解密就好,否则需要分段解密//cipher.doFinal(data);//以下为分段解密int length = data.length;int i=0;int offset=0;byte[] cache = null;ByteArrayOutputStream baos = new ByteArrayOutputStream();while (length-offset>0) {if (length-offset>MAX_DECRYPT_BLOCK) {cache = cipher.doFinal(data, offset, MAX_DECRYPT_BLOCK);}else {cache = cipher.doFinal(data,offset,length-offset);}baos.write(cache,0,cache.length);i++;offset = i * MAX_DECRYPT_BLOCK;}byte[] decryptData = baos.toByteArray();baos.close();return decryptData;}/*** 主函数测试* @param args* @throws Exception*/public static void main(String[] args) throws Exception {Map<String, Object> map = generetorKeyPair();String rsaPublicKey = getRSAPublicKey(map);String rsaPriateKey = getRSAPriateKey(map);String  oldData = "各位小伙伴,新的一天继续加油哦";System.out.println("加密前的数据-----------"+oldData);byte[] encryptData = encryptByPublic(oldData.getBytes(), rsaPublicKey);byte[] decryptData = decryptByPrivateKey(encryptData, rsaPriateKey);System.out.println("解密后的数据-----------"+new String(decryptData));}}

测试结果图,如图所见,结果正确无误。小伙伴们,星光不负赶路人,抓紧搞起来吧。

RSA加密算法的实现相关推荐

  1. RSA加密算法破解及原理

    " RSA加密算法是一种非对称加密算法,目前被广泛应用.本文介绍RSA算法的基本原理和破解方法." RSA在互联网上被广泛应用,典型的如各个网站的证书. 很多应用数据的加密也是使用 ...

  2. [转帖]在SQL SERVER中实现RSA加密算法

    /*本次修改增加了unicode的支持,但是加密后依然显示为16进制数据,因为进行RSA加密后所得到的unicode编码是无法显示的,所以密文依然采用16进制数据显示. 需要特别注意:如果要对中文进行 ...

  3. rsa加密算法java实例,java实现的RSA加密算法详解

    本文实例讲述了java实现的RSA加密算法.分享给大家供大家参考,具体如下: 一.什么是非对称加密 1.加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加密 2.密钥分为:公钥,私钥 公钥:可 ...

  4. 用实例给新手讲解RSA加密算法

    用实例给新手讲解RSA加密算法 2009年06月24日14:04 来源: 我有话说 查看评论(2) 好文我顶(3) 图为 RSA公开密钥算法的发明人,从左到右Ron Rivest, Adi Shami ...

  5. RSA加密算法原理和java简单实现

    数学 RSA加密算法中,用到素数.互质数.指数运算.模运算等几个数学知识. 素数 素数又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数. 互质数 百度百科:公因数只有 ...

  6. RSA加密算法——密码学笔记(四)

    一.数学知识 1. 质数 质数,又称素数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数. 2. 互质数 百度百科上的解释是:公因数只有1的两个数,叫做互质数. 维基百科上的 ...

  7. 密码学:RSA加密算法详解

    概述 本文旨在说明RSA加密算法的原理及实现,而其相关的数学部分的证明则不是本文内容. 版权说明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Q-WHai 发表日期: ...

  8. RSA加密算法原理及RES签名算法简介(转载)

    第一部分:RSA算法原理与加密解密 一.RSA加密过程简述 A和B进行加密通信时,B首先要生成一对密钥.一个是公钥,给A,B自己持有私钥.A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密 ...

  9. rsa加密c语言源码库,RSA加密算法源代码C语言实现.doc-资源下载在线文库www.lddoc.cn...

    RSA加密算法_源代码__C语言实现.doc RSA 算法 1978 年就出现了这种算法,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名Ro ...

  10. RSA加密算法的简单案例

    RSA加密算法是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击. Java培训 关于RSA加密算法有哪些应用呢 ? 以下举一个数据库身份验证的案例. 在使用数据集进行身份认证 ...

最新文章

  1. 从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式(三)
  2. 【opencv】21.图像处理为什么要归一化
  3. C语言程序练习- L1-040 最佳情侣身高差 (10分)
  4. 2019牛客暑期多校训练营(第三场)J - LRU management (模拟+list+unorder_map)
  5. html body 边框,html – 如何在表的tbody / thead部分创建边框?
  6. 轻松搭建Google ADK开发环境
  7. 万丰科技机器人排名_2020年全国机器人企业数量大排名(省份榜|9月)
  8. Mouse Jiggler – 自动移动光标,防止电脑启动屏保、进入休眠[Windows]
  9. Linux内核Makefile文件
  10. Java SE 8新特性
  11. getssdtserviceid_[下载]发个获得SSDT函数名和索引号的代码
  12. 2018第九届蓝桥杯省赛真题JAVA语言 C组真题题解答案(全)
  13. Word文档最后一页总是删除不掉怎么办?
  14. 如何设置word的有效期
  15. 爬虫之抽屉新热榜点赞基本示例
  16. Outlook无法打开 .ost文件损坏,卸载重装也恢复不了
  17. RGBA 编码为 YUV420SP【NEON】
  18. 数值计算方法第三章—线性方程组的数值解法知识点总结
  19. 国脚冯潇霆被广州恒大下放预备队
  20. 群晖二合一 常见问题

热门文章

  1. 荣耀10X值得入手吗?今天来聊一聊
  2. blender指定物体旋转原点
  3. 【面试】深拷贝与浅拷贝的实现原理
  4. “应用程序无法正常启动0xc0150002” 问题分析步骤及解决方案
  5. cat /proc/meminfo 详解
  6. 数据也会说谎:常见的数据造假三种形态!
  7. python程序分析经济数据造假_Python 造假数据,用Faker就够了
  8. 记录BA510手机被静电击穿屏幕
  9. NGUI控件说明(中文) UIKeyBinding
  10. windows10 上听歌,歌词放到不碍事的地方