文章目录

  • 前言
  • 一、第一步使用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. 罗格斯大学电气与计算机工程专业怎么样,美国电子工程排名 - 电子计算机工程的研究生教育,特别是偏向电路设计方向,请问是美国罗格斯大学新布朗斯维克校区好还是清华...
  2. 交换机配置软件_交换机常见故障分类与排除方法
  3. IntelliJ IDEA for Mac 修改项目模块的名称
  4. MS_DOS头部 IMAGE_DOS_HEADER
  5. DHCP服务器--红色箭头
  6. 消息中间件的核心思想
  7. 正确中断java线程
  8. oracle的.aud文件,Oracle 11g 在audit_file_dest目录下产生大量的aud文件
  9. tina中信号带宽_如何理解选择示波器带宽的5倍法则 ?
  10. 【机器学习系列】变分推断第二讲:基于Mean Field的变分推断解法
  11. 精简版WIN XP安装日文输入法
  12. Rider+EmmyLua lua代码高亮设置
  13. 一文读懂单点登录系统对企业的价值
  14. 怎样让计算机加快速度,六大招教你把旧电脑恢复如新,速度提升N倍!-怎么让电脑速度变快...
  15. 58同城亿级流量架构演进
  16. 如何判断车距:车距判断技巧图解
  17. Facebook中国程序员之死:年仅38岁就跳楼轻生
  18. Arduino IDE+_Attiny13/85实践(六)Attiny13A EEPROM内存读与写
  19. 陆奇博士200616直播PPT内容
  20. 最全Android安全检测漏洞解决方案

热门文章

  1. 面试官:什么是深拷贝和浅拷贝?
  2. 计算机中用到哪些数学知识点,小学一至六年级数学知识点归纳(大全).doc
  3. torch.Tensor和torch.tensor
  4. python 列表内容去重
  5. JSP页面中最常使用的脚本元素
  6. 具体数学--(无限数列和)
  7. 每月共读一本书 | 第一期选书结果公布~
  8. 深入浅出解析用户画像
  9. 2020年数据术语的故事
  10. APP自动化测试工具框架思维导图