说明:

本文是用 Java1.8 官方的工具类进行的封装,两种加密算法的原理参考:

AES:https://blog.csdn.net/gulang03/article/details/81175854

RSA:https://blog.csdn.net/gulang03/article/details/81176133

实现类:

AESUtil:

package com.fknight.sbsmdemo.tools;import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;/*** AES 加密方法,是对称的密码算法(加密与解密的密钥一致),这里使用最大的 256 位的密钥*/
public class AESUtil {/*** 获得一个 密钥长度为 256 位的 AES 密钥,* @return 返回经 BASE64 处理之后的密钥字符串*/public static String getStrKeyAES() throws NoSuchAlgorithmException, UnsupportedEncodingException {KeyGenerator keyGen = KeyGenerator.getInstance("AES");SecureRandom secureRandom = new SecureRandom(String.valueOf(System.currentTimeMillis()).getBytes("utf-8"));keyGen.init(256, secureRandom);   // 这里可以是 128、192、256、越大越安全SecretKey secretKey = keyGen.generateKey();return Base64.getEncoder().encodeToString(secretKey.getEncoded());}/***  将使用 Base64 加密后的字符串类型的 secretKey 转为 SecretKey* @param strKey* @return SecretKey*/public static SecretKey strKey2SecretKey(String strKey){byte[] bytes = Base64.getDecoder().decode(strKey);SecretKeySpec secretKey = new SecretKeySpec(bytes, "AES");return secretKey;}/*** 加密* @param content 待加密内容* @param secretKey 加密使用的 AES 密钥* @return 加密后的密文 byte[]*/public static byte[] encryptAES(byte[] content, SecretKey secretKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);return cipher.doFinal(content);}/*** 解密* @param content 待解密内容* @param secretKey 解密使用的 AES 密钥* @return 解密后的明文 byte[]*/public static byte[] decryptAES(byte[] content, SecretKey secretKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.DECRYPT_MODE, secretKey);return cipher.doFinal(content);}
}

RSAUtil:

package com.fknight.sbsmdemo.tools;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;/*** RSA 是非对称的密码算法,密钥分公钥和私钥,公钥用来加密,私钥用于解密*/public class RSAUtil {/*** 生成密钥对:密钥对中包含公钥和私钥* @return 包含 RSA 公钥与私钥的 keyPair* @throws NoSuchAlgorithmException* @throws UnsupportedEncodingException*/public static KeyPair getKeyPair() throws NoSuchAlgorithmException, UnsupportedEncodingException {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");    // 获得RSA密钥对的生成器实例SecureRandom secureRandom = new SecureRandom(String.valueOf(System.currentTimeMillis()).getBytes("utf-8")); // 说的一个安全的随机数keyPairGenerator.initialize(2048, secureRandom);    // 这里可以是1024、2048 初始化一个密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();   // 获得密钥对return keyPair;}/*** 获取公钥 (并进行Base64编码,返回一个 Base64 编码后的字符串)* @param keyPair* @return 返回一个 Base64 编码后的公钥字符串*/public static String getPublicKey(KeyPair keyPair){PublicKey publicKey = keyPair.getPublic();byte[] bytes = publicKey.getEncoded();return Base64.getEncoder().encodeToString(bytes);}/*** 获取私钥(并进行Base64编码,返回一个 Base64 编码后的字符串)* @param keyPair* @return 返回一个 Base64 编码后的私钥字符串*/public static String getPrivateKey(KeyPair keyPair){PrivateKey privateKey = keyPair.getPrivate();byte[] bytes = privateKey.getEncoded();return Base64.getEncoder().encodeToString(bytes);}/*** 将Base64编码后的公钥转换成 PublicKey 对象* @param pubStr* @return PublicKey*/public static PublicKey string2PublicKey(String pubStr) throws NoSuchAlgorithmException, InvalidKeySpecException {byte[] bytes = Base64.getDecoder().decode(pubStr);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PublicKey publicKey = keyFactory.generatePublic(keySpec);return publicKey;}/*** 将Base64编码后的私钥转换成 PrivateKey 对象* @param priStr* @return PrivateKey*/public static PrivateKey string2Privatekey(String priStr) throws NoSuchAlgorithmException, InvalidKeySpecException {byte[] bytes = Base64.getDecoder().decode(priStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);KeyFactory keyFactory = KeyFactory.getInstance("RSA");PrivateKey privateKey = keyFactory.generatePrivate(keySpec);return privateKey;}/*** 公钥加密* @param content 待加密的内容 byte[]* @param publicKey 加密所需的公钥对象 PublicKey* @return 加密后的字节数组 byte[]*/public static byte[] publicEncrytype(byte[] content, PublicKey publicKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] bytes = cipher.doFinal(content);return bytes;}/*** 私钥解密* @param content   待解密的内容 byte[]* @param privateKey    解密需要的私钥对象 PrivateKey* @return 解密后的字节数组 byte[]*/public static byte[] privateDecrypt(byte[] content, PrivateKey privateKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] bytes = cipher.doFinal(content);return bytes;}
}

测试:

AESUtilTest

package com.fknight.sbsmdemo.tools;import javax.crypto.SecretKey;
import java.util.Base64;/*** 测试 AESUtil 对AES加密算法的封装*/
public class AESUtilTest {public static void main(String[] args){String content = "abcdefg789+-*+="; // 待加密的字符串System.out.println("明文数据为:" + content);try {// 获得经 BASE64 处理之后的 AES 密钥String strKeyAES = AESUtil.getStrKeyAES();System.out.println("经BASE64处理之后的密钥:" + strKeyAES);// 将 BASE64 处理之后的 AES 密钥转为 SecretKeySecretKey secretKey = AESUtil.strKey2SecretKey(strKeyAES);// 加密数据byte[] encryptAESbytes = AESUtil.encryptAES(content.getBytes("utf-8"), secretKey);System.out.println("加密后的数据经 BASE64 处理之后为:" + Base64.getEncoder().encodeToString(encryptAESbytes));// 解密数据String decryptAESStr = new String(AESUtil.decryptAES(encryptAESbytes, secretKey), "utf-8");System.out.println("解密后的数据为:" + decryptAESStr);if (content.equals(decryptAESStr)){System.out.println("测试通过!");}else {System.out.println("测试未通过!");}} catch (Exception e) {e.printStackTrace();}}
}

测试结果:

RSAUtilTest

package com.fknight.sbsmdemo.tools;import java.security.*;
import java.util.Base64;/*** 对 RSAUtil 进行测试*/
public class RSAUtilTest {public static void main(String[] args){String content = "abcdefg456+-=";   // 明文内容System.out.println("原始字符串是:" + content);try {// 获得密钥对KeyPair keyPair =  RSAUtil.getKeyPair();// 获得进行Base64 加密后的公钥和私钥 StringString privateKeyStr = RSAUtil.getPrivateKey(keyPair);String publicKeyStr = RSAUtil.getPublicKey(keyPair);System.out.println("Base64处理后的私钥:" + privateKeyStr + "\n"+ "Base64处理后的公钥:" + publicKeyStr);// 获得原始的公钥和私钥,并以字符串形式打印出来PrivateKey privateKey = RSAUtil.string2Privatekey(privateKeyStr);PublicKey publicKey = RSAUtil.string2PublicKey(publicKeyStr);// 公钥加密/私钥解密byte[] publicEncryBytes =  RSAUtil.publicEncrytype(content.getBytes(), publicKey);System.out.println("公钥加密后的字符串(经BASE64处理):" + Base64.getEncoder().encodeToString(publicEncryBytes));byte[] privateDecryBytes = RSAUtil.privateDecrypt(publicEncryBytes, privateKey);System.out.println("私钥解密后的原始字符串:" + new String(privateDecryBytes));String privateDecryStr = new String(privateDecryBytes, "utf-8");if (content.equals(privateDecryStr)){System.out.println("测试通过!");}else {System.out.println("测试未通过!");}} catch (Exception e) {e.printStackTrace();}}
}

测试结果:

PS:关于如何使用 JavaScript 和 Java 进行跨语言 AES 和 RSA 的实现可以参考我的另一篇博文

https://blog.csdn.net/gulang03/article/details/82230408

Java实现AES和RSA算法相关推荐

  1. angular和JAVA实现aes、rsa加密解密,前后端交互,前端加解密和后端JAVA加解密实现

    今天实现了下AES和RSA加密解密,主要的功能是对前后端交互数据进行加密解密,为什么要用到两个算法呢,首先RSA默认的话加密长度是有限的100多个byte吧大约,并且需要公钥私钥,而AES加密没有限制 ...

  2. 第十九篇:JAVA加密解密之RSA算法

    RSA算法简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首 ...

  3. 对于AES和RSA算法的结合使用以及MD5加盐注册登录时的密码加密

    RSA和AES结合使用 接上篇的RSA和AES算法加密之后,AES对称算法对数据量大的加密比较快,而RSA公私钥加密的话会影响加密效率,但是AES的加密与解密的密钥是一致的,导致密钥不能外泄,密钥在网 ...

  4. JS 与 JAVA 跨语言实现 RSA 和 AES加密算法

    简介: 开发中为了数据的安全性使用加密算法对数据进行加密是一种很常见的情况,但就一种语言来说,直接使用提供的相应的库进行少许封装是一件很容易的事.但是在一些情况下我们可能需要跨语言来实现,比如前后端分 ...

  5. Java实现Base64、DES、AES、RSA加解密以及加密方式之间的区别

    Base64 加密, 这个其实不可以算作加密方法,它可以看作是一种编码方式,它的用途只是二进制数字和字符串进行相互转化. Base64是网络上最常见的用于传输 8Bit字节码的编码方式之一,是一种基于 ...

  6. 常用的加密有哪些?在Java中如何实现?(MD5、AES、RSA)

    参考: https://blog.csdn.net/qq_41570658/article/details/107694782 https://blog.csdn.net/qq_30054961/ar ...

  7. 基于混合密码体制的端到端短信通讯系统(Java实现+AES+RSA+json)

    基于混合密码体制的端到端短信通讯系统(Java实现+AES+RSA+json) 随着移动通信技术及相关领域服务的快速发展,短信内容常常涉及用户隐私和信息安全.用户使用短信传输一些重要的私人信息,如:手 ...

  8. 前后台加解密的使用--SHA256算法 RSA算法 AES算法

    SHA256算法 sha256与md5一样是散列算法,不是加密算法,不存在解密的问题,因此是不可逆的,可以通过key+password,对密码进行加密,在后台进行比对,安全性比md5高一点,加密后生成 ...

  9. java和c 的rsa加密算法_RSA算法签名技术Java与C++统一(加密解密结果一样)

    RSA算法签名技术Java与C++统一 (加密解密结果一样) 源代码下载地址:http://www.doczj.com/doc/64f44a94a0116c175f0e484d.html/produc ...

最新文章

  1. 医疗项目中对网编的一些理解看法
  2. P4310-绝世好题【位运算,dp】
  3. AngularJS中的过滤器(filter)
  4. 3D渲染集群,听说过吗?
  5. CTS ( 19)---Android 8.1/GO GMS认证
  6. 史上最全的thymleaf标签
  7. 自定义Stack接口
  8. 【英特尔杯】Python调取萤石网络摄像头视频
  9. RL01: An Introduction to Deep Reinforcement Learning
  10. [词根词缀]milit/min/miss/mod/mon等词根由来
  11. 中国地产商寻找下一个春天
  12. 将两个字符串连接起来,不要用strcat函数
  13. ROS入门之——action
  14. 汉字编码变化_新编码员:薪资和时间花费如何根据人口变化
  15. JavaScript系列文章:变量提升和函数提升
  16. JavaScript阻塞与非阻塞
  17. 大数据时代的背景与变化
  18. 大数据培训课程之Flume拓扑结构大数据培训课程之Flume拓扑结构
  19. 【免费】微软Surface Go出厂镜像百度网盘链接
  20. repo (一) 简介

热门文章

  1. 时间序列预测方法汇总:从理论到实践(附Kaggle经典比赛方案)
  2. 无监督训练用堆叠自编码器是否落伍?ML博士对比了8个自编码器
  3. ECCV 2020 Spotlight | 图像定位上的细粒化区域相似性自监督
  4. 漫谈强化学习中的引导搜索策略
  5. 5.2 使用pytorch搭建GoogLeNet网络 笔记
  6. java实验3 2020.4.6
  7. HDU 1069 Monkey and Banana 最长上升子序列进阶(动态规划)
  8. php mpdf html 转pdf,使用 MPDF 将HTML转为PDF,然后将该PDF转为PNG图片的时候,中文报错... ...汗血宝马...
  9. 子类重写父类虚函数_C/C++编程笔记:关于C++的虚函数和多态,你真的了解吗?...
  10. 手把手带你领略双十一背后的核心技术Sentinel之服务的熔断降级