目录

  • 1、概述
  • 2、对称加密、解密实现

1、概述

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)私有密钥(privatekey),公开密钥和私有密钥是一对,如果用公开密钥加密需要私有密钥解密,反之用私有密钥加密需要公开密钥解密,因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

特点:

  • 加密和解密使用不同的密钥。
  • 如果使用私钥加密, 只能使用公钥解密。
  • 如果使用公钥加密, 只能使用私钥解密。
  • 安全级别高,处理数据的速度较慢。

注意:
理论上私钥是可以推导出公钥的,公钥无法推导出私钥。

私钥中获取公钥测试地址:http://tool.chacuo.net/cryptgetpubkey

2、对称加密、解密实现

将非对称加密的两种方式进行封装处理,达到一套代码实现两种加密方式,代码可以直进行使用。

public class AsymmetricTest {private final static String RSA = "RSA";public static void main(String[] args) {// 加密密文String input = "key=85CD019515D14B91AD942787532314FF&startTime=1629431243245&endTime=1660967243244";// 生成密钥对文件,在实际开发中,根据实际需求生成文件位置String pubPath = "C:\\Users\\Desktop\\publicKey.pub";String priPath = "C:\\Users\\Desktop\\privateKey.pri";// 生成公钥和私钥文件,并且打印公钥的字符串和私钥字符串generateKeyPair(pubPath, priPath);System.out.println("\n==============================================\n");// 从文件中加载密钥PublicKey publicKey = loadPublicKeyFromFile(pubPath);PrivateKey privateKey = loadPrivateKeyFromFile(priPath);// 公钥加密,私钥解密String encrypted = encryptByAsymmetric(input, publicKey);System.out.println("非对称RSA-公钥加密:" + encrypted);System.out.println("非对称RSA-私钥解密:" + decryptByAsymmetric(encrypted, privateKey));System.out.println("\n==============================================\n");// 私钥加密,公钥解密String encrypted2 = encryptByAsymmetric(input, privateKey);System.out.println("非对称RSA-私钥加密:" + encrypted2);System.out.println("非对称RSA-公钥解密:" + decryptByAsymmetric(encrypted2, publicKey));}/*** 从文件中加载公钥** @param filePath : 文件路径* @return : 公钥* @throws Exception*/public static PublicKey loadPublicKeyFromFile(String filePath) {try {// 将文件内容转为字符串String keyString = FileUtils.readFileToString(new File(filePath), String.valueOf(StandardCharsets.UTF_8));return loadPublicKeyFromString(keyString);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("获取公钥文件字符串失败!");}}/*** 从文件中加载私钥** @param filePath : 文件路径* @return : 私钥* @throws Exception*/public static PrivateKey loadPrivateKeyFromFile(String filePath) {try {// 将文件内容转为字符串String keyString = FileUtils.readFileToString(new File(filePath), String.valueOf(StandardCharsets.UTF_8));return loadPrivateKeyFromString(keyString);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("获取私钥文件字符串失败!");}}/*** 从字符串中加载公钥** @param keyString : 公钥* @return : 公钥* @throws Exception*/public static PublicKey loadPublicKeyFromString(String keyString) {try {// 进行Base64解码byte[] decode = Base64.decode(keyString);// 获取密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(RSA);// 构建密钥规范X509EncodedKeySpec key = new X509EncodedKeySpec(decode);// 获取公钥return keyFactory.generatePublic(key);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("获取公钥失败!");}}/*** 从字符串中加载私钥** @param keyString : 私钥* @return : 私钥* @throws Exception*/public static PrivateKey loadPrivateKeyFromString(String keyString) {try {// 进行Base64解码byte[] decode = Base64.decode(keyString);// 获取密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(RSA);// 构建密钥规范PKCS8EncodedKeySpec key = new PKCS8EncodedKeySpec(decode);// 生成私钥return keyFactory.generatePrivate(key);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("获取私钥失败!");}}/*** 打印密钥对并且保存到文件** @return*/public static void generateKeyPair(String pubPath, String priPath) {try {//  创建密钥对生成器对象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA);// 生成密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();PrivateKey privateKey = keyPair.getPrivate();PublicKey publicKey = keyPair.getPublic();String privateKeyString = Base64.encode(privateKey.getEncoded());String publicKeyString = Base64.encode(publicKey.getEncoded());System.out.println("私钥:" + privateKeyString);System.out.println("公钥:" + publicKeyString);// 保存文件if (pubPath != null) {FileUtils.writeStringToFile(new File(pubPath), publicKeyString, String.valueOf(StandardCharsets.UTF_8));}if (priPath != null) {FileUtils.writeStringToFile(new File(priPath), privateKeyString, String.valueOf(StandardCharsets.UTF_8));}} catch (Exception e) {e.printStackTrace();throw new RuntimeException("生成密钥对失败!");}}/*** 非对称加密数据** @param input : 原文* @param key   : 密钥* @return : 密文* @throws Exception*/public static String encryptByAsymmetric(String input, Key key) {try {// 获取Cipher对象Cipher cipher = Cipher.getInstance(RSA);// 初始化模式(加密)和密钥cipher.init(Cipher.ENCRYPT_MODE, key);byte[] resultBytes = getMaxResultEncrypt(input, cipher);return Base64.encode(resultBytes);} catch (Exception e) {e.printStackTrace();throw new RuntimeException("加密失败!");}}/*** 非对称解密数据** @param encrypted : 密文* @param key       : 密钥* @return : 原文* @throws Exception*/public static String decryptByAsymmetric(String encrypted, Key key) {try {// 获取Cipher对象Cipher cipher = Cipher.getInstance(RSA);// 初始化模式(解密)和密钥cipher.init(Cipher.DECRYPT_MODE, key);return new String(getMaxResultDecrypt(encrypted, cipher));} catch (Exception e) {e.printStackTrace();throw new RuntimeException("解密失败!");}}/*** 分段处理加密数据** @param input  : 加密文本* @param cipher : Cipher对象* @return*/private static byte[] getMaxResultEncrypt(String input, Cipher cipher) throws Exception {byte[] inputArray = input.getBytes();int inputLength = inputArray.length;// 最大加密字节数,超出最大字节数需要分组加密int MAX_ENCRYPT_BLOCK = 117;// 标识int offSet = 0;byte[] resultBytes = {};byte[] cache = {};while (inputLength - offSet > 0) {if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);offSet += MAX_ENCRYPT_BLOCK;} else {cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);offSet = inputLength;}resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);}return resultBytes;}/*** 分段处理解密数据** @param decryptText : 加密文本* @param cipher      : Cipher对象* @throws Exception*/private static byte[] getMaxResultDecrypt(String decryptText, Cipher cipher) throws Exception {byte[] inputArray = Base64.decode(decryptText.getBytes(StandardCharsets.UTF_8));int inputLength = inputArray.length;// 最大解密字节数,超出最大字节数需要分组加密int MAX_ENCRYPT_BLOCK = 128;// 标识int offSet = 0;byte[] resultBytes = {};byte[] cache = {};while (inputLength - offSet > 0) {if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);offSet += MAX_ENCRYPT_BLOCK;} else {cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);offSet = inputLength;}resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);}return resultBytes;}
}

效果:

Java加密算法—非对称加密相关推荐

  1. 各种Java加密算法-非对称加密

    RSA      这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和 ...

  2. java RSA非对称加密详解

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

  3. Java实现非对称加密

    1. 简介 公开密钥密码学(英语:Public-key cryptography)也称非对称式密码学(英语:Asymmetric cryptography)是密码学的一种算法,它需要两个密钥,一个是公 ...

  4. Java笔记-非对称加密RSA的使用

    使用OpenSSL生成对应RSA私钥和RSA公钥: #rsa私钥: genrsa -out rsa_private_key.pem 1024 pkcs8 -topk8 -inform PEM -in ...

  5. Java加密算法—对称加密(DES、AES)

    目录 1.概述 2.加密模式 2.1 ECB 2.2 CBC 3.填充模式 4.对称加密.解密实现 1.概述 对称加密就是采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,也称为单密 ...

  6. go加密算法:非对称加密(三)--Elliptic

    看了2星期的区块链原理与运行机制,加密这里开始变得有些生疏,花了一天时间复习了一些;看到了之前忽略的,也学会了椭圆曲线加密. //基础板:浅显易懂package main import ( " ...

  7. 【Java基础】加密与安全基础

    文章目录 一.编码算法 什么是编码? URL编码 1.什么是URL编码算法 2.Java中使用URL编码算法 Base64编码 1.什么是Base64编码算法 2.Java中使用Base64编码算法 ...

  8. Java中的加密与安全,你了解多少

    文章目录 数据安全 编码算法 摘要算法 MD5算法 SAH-1算法 BouncyCastle算法 Hmac算法 加密算法 对称加密算法 口令加密算法 密钥交换算法 非对称加密算法 数字签名算法 RSA ...

  9. 【加密】对称加密DES和非对称加密AES、数字签名|非对称加密--公钥和私钥的区别

    目录 对称加密DES和非对称加密AES.数字签名 对称加密 1.1 定义 1.2 优缺点 1.3 常用对称加密算法 非对称加密( Asymmetric Cryptography ) 非对称加密(现代加 ...

最新文章

  1. 难忘的一天——装操作系统(三)
  2. use stacks能够把很多相似的文件叠加在macos的桌面上
  3. 奇安信cdn配置教程_PicGo+jsDelivr+GitHub搭建免费cdn加速的图床
  4. 跟我一起学Redis之加个哨兵让主从复制更加高可用
  5. 本人计划继续写飞鸽传书,支持的人有吗?
  6. HTTP session的原理
  7. linux --- 启动过程
  8. 高等数学问题的符号解
  9. RTC唤醒低功耗(standby)模式
  10. 基于Python的西瓜数据集 3.0α的SVM实现
  11. Elasticsearch-拼音分词/排序
  12. 轮子哥:回顾我走过的编程之路
  13. 什么是大前端,前端工程师要不要成为全栈工程师?
  14. CentOS Install Passenger for ROR
  15. 最新完整数据结构与算法
  16. UI设计师涉及哪些工作内容呢?
  17. 时频分析:短时傅里叶变换(1)
  18. 贵州厉害的计算机学校,贵州2021年计算机学校好点的大专学校
  19. Mac OS 电脑恢复出厂设置之详细操作
  20. YOLOv5-Lite:Repvgg重参化对YOLO工业落地的实验和思考

热门文章

  1. python在哪里写代码-python代码在哪里编写
  2. matlab到word文字转变,Matlab代码或中文复制到word变成乱码的解决技巧
  3. 关于地图GIS开发事项的一次实践整理(上)
  4. 虚拟机玩转 Veritas NetBackup(NBU)之 Linux 配置 NBU 客户端
  5. Java------Thread线程
  6. 2022年P气瓶充装培训试题及答案
  7. MT7621基于OpenWrt 21.02使用DSA配置VLAN
  8. 国民技术(30077)十周年:不为外人知的数据
  9. 计算机组成原理:运算方法和运算器
  10. 未探索的TensorFlow库