Java安全——AES(对称加密)和 RSA(非对称加密)的实现

news/2024/10/25 11:03:09/

目录

一、对称加密和非对称加密 

1.对称加密

常见算法

2.非对称加密

常见算法

3.对称加密和非对称加密的对比

二、AES(对称加密)

1.生成AES密钥

2.加密数据

3.解密数据

完整代码

三、RSA(非对称加密)

1.生成RSA密钥对

2.加密数据

3.解密数据

完整代码


一、对称加密和非对称加密 

1.对称加密

对称加密使用相同的密钥进行加密和解密。这意味着发送方和接收方必须共享同一个密钥,并且必须安全地存储和传输该密钥。

常见算法

  • AES(高级加密标准)
  • DES(数据加密标准)
  • 3DES(三重数据加密标准)
  • RC4

2.非对称加密

非对称加密使用一对密钥:公钥和私钥。公钥用于加密数据,私钥用于解密。公钥可以公开,而私钥必须保密。

常见算法

  • RSA(Rivest-Shamir-Adleman)
  • DSA(数字签名算法)
  • ECC(椭圆曲线加密)

3.对称加密和非对称加密的对比

特性对称加密非对称加密
密钥数量只有一个密钥(加密和解密相同)一对密钥(公钥和私钥)
加密速度较快较慢
安全密钥管理复杂,密钥泄露风险高公钥可以公开,私钥保密确保安全
适用场景大量数据加密密钥交换、身份验证、数字签名

二、AES(对称加密)

1.生成AES密钥

  • 使用KeyGenerator类生成AES密钥。
  • 指定密钥长度,例如128位、192位或256位。
java">// 生成密钥 
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128位密钥长度(可选128,192或256位)
SecretKey secretKey = keyGenerator.generateKey();

2.加密数据

  • 使用Cipher类并指定AES算法。
  • 初始化Cipher对象为加密模式(Cipher.ENCRYPT_MODE)。
  • 使用密钥初始化Cipher对象。
  • 加密数据
java">Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(dataToEncrypt.getBytes());// 编码加密数据:将加密后的字节数据编码为Base64字符串,以便存储或传输
String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData);
System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);

3.解密数据

  • 使用相同的Cipher对象进行解密。
  • 初始化Cipher对象为解密模式(Cipher.DECRYPT_MODE)。
  • 使用相同的密钥初始化Cipher对象。
java">cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));
System.out.println("解密后的数据:" + new String(decryptedData));

完整代码

java">package com.lz.encryption;import javax.crypto.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;public class SymmetricEncryption {public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {// 对字符串数据进行加密// 待加密的数据String dataToEncrypt = "Hello World";// 1.生成密钥://  使用KeyGenerator类生成一个AES密钥//  指定密钥长度,例如128位、192位或256位KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128); // 128位密钥长度(可选128,192或256位)SecretKey secretKey = keyGenerator.generateKey();// 2.加密数据//  初始化Cipher对象://      使用Cipher类并指定AES算法//      初始化Cipher对象为加密模式(Cipher.ENCRYPT_MODE)。//      使用密钥初始化Cipher对象。Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encryptedData = cipher.doFinal(dataToEncrypt.getBytes());// 编码加密数据:将加密后的字节数据编码为Base64字符串,以便存储或传输String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedData);System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);// 3.解密数据://  使用相同的Cipher对象进行解密。//  初始化Cipher对象为解密模式(Cipher.DECRYPT_MODE)。//  使用相同的密钥初始化Cipher对象。cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));System.out.println("解密后的数据:" + new String(decryptedData));}
}

三、RSA(非对称加密)

1.生成RSA密钥对

  • 使用KeyPairGenerator类生成RSA密钥对。
  • 指定密钥长度,例如2048位、3072位或4096位。
java">// 生成RSA密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048); 
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 公钥
PublicKey publicKey = keyPair.getPublic();
// 私钥
PrivateKey privateKey = keyPair.getPrivate();

2.加密数据

  • 使用公钥初始化Cipher对象为加密模式(Cipher.ENCRYPT_MODE)。
  • 使用公钥加密数据。
java">// 公钥加密数据
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(dataToEncrypt.getBytes());// 将加密数据编码为Base64字符串
String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedBytes);
System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);

3.解密数据

  • 使用私钥初始化Cipher对象为解密模式(Cipher.DECRYPT_MODE)。
  • 使用私钥解密数据。
java">cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));

完整代码

java">package com.lz.encryption;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.*;
import java.util.Base64;public class RasEncryption {public static void main(String[] args) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {// 待加密的数据String dataToEncrypt = "Hello World";// 1.生成RSA密钥对KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048); // 2048位密钥长度KeyPair keyPair = keyPairGenerator.generateKeyPair();//公钥PublicKey publicKey = keyPair.getPublic();//私钥PrivateKey privateKey = keyPair.getPrivate();// 公钥加密数据Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encryptedBytes = cipher.doFinal(dataToEncrypt.getBytes());// 将加密数据编码为Base64字符串String encryptedDataBase64 = Base64.getEncoder().encodeToString(encryptedBytes);System.out.println("加密后的数据 (经Base64编码): " + encryptedDataBase64);// 私钥解密数据cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));// 将解密后的字节数据转换为字符串System.out.println("解密后的数据:" + new String(decryptedData));}
}


http://www.ppmy.cn/news/1541810.html

相关文章

基于KU115+ZU19EG+C6678 的高性能6U VPX 载板

基于KU115ZU19EGC6678 的高性能6U VPX 载板,板载 2 个 HPC 形式的FMC 连接器(用于外部信号扩展)。板卡选用了 1 片Xilinx 公司的Kintex UltraScale 系列 FPGA 家族中的XCKU115-2FLVA1517I 和 1 片 Zynq UltraScale MPSoC 家族的XCZU19EG-2FFV…

django celery 定时任务 Crontab 计划格式

Celery 定时任务教程 Celery 是一个强大的异步任务队列/作业队列基于分布式消息传递的开源项目。它广泛用于处理各种类型的后台任务,例如发送电子邮件、处理图像、数据分析和视频转换等。 本文将介绍如何使用 Celery 实现定时任务,包括: 安…

智能AI监测系统燃气安全改造方案的背景及应用价值

随着燃气行业的迅速发展和城市化进程的加快,燃气安全管理成为企业运营和城市管理中不可忽视的关键领域。燃气泄漏、管道破损等事故的发生不仅会造成严重的经济损失,还威胁到人民生命财产安全。传统的安全管理方法往往依赖人工巡检和手动监测,…

【CSS进阶】之属性值的计算过程背后的原理

当我们在页面上看见一个元素显示的时候,并附上了丰富的CSS样式,其实这背后经历了一系列复杂的属性计算过程,而最终页面上所呈现的样式则是最终计算的结果,可能并不是我们所编写的样式,这样一来就会在一些场景中造成一些…

【Docker系列】深入理解`docker attach`与`docker exec`

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

使用休眠的方式来解决电脑合盖后偶尔不能正常睡眠的问题

背景描述 用过Windows笔记本电脑的用户应该都偶尔遇到过这样的一个问题,就是电脑直接合上盖后放在包里,按道理来说应该会自动进入睡眠模式,但是等电脑再从包里拿出来时发现电脑很烫,并且已经没电了,似乎并没有进入到休…

分布式---CAPBASE理论

CAP理论 Consistency(一致性):用户访问分布式系统中的任意节点,得到的数据必须一致。即保证任意节点的数据内容一致Availability(可用性):用户访问集群中的任意健康节点,必须能得到…

64页精品PPT | 汽车经销商数据应用解决方案

汽车经销商正面临前所未有的盈利能力挑战。从18年起 ,传统燃油车汽车行业开始步入低速增长阶段 ,卖车已经挣不到钱 ,利润往往来自任务完成的厂家返利;新兴的直营模式的出现 ,冲击了传统授权经销的方式 ,疫情…