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

目录

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

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位。
// 生成密钥 
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // 128位密钥长度(可选128,192或256位)
SecretKey secretKey = keyGenerator.generateKey();

2.加密数据

  • 使用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));

完整代码

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位。
// 生成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)。
  • 使用公钥加密数据。
// 公钥加密数据
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)。
  • 使用私钥解密数据。
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedData = cipher.doFinal(Base64.getDecoder().decode(encryptedDataBase64));

完整代码

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.mzph.cn/pingmian/57880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

索引的使用和优化

索引就是一种快速查询和检索数据的数据结构,mysql中的索引结构有:B树和Hash。 索引的作用就相当于目录的作用,我么只需先去目录里面查找字的位置,然后回家诶翻到那一页就行了,这样查找非常快, 创建一个表结…

日常实习与暑期实习详解

日常实习与暑期实习详解 问了下正在实习的同学,发现天要塌了–才知道日常实习是没有笔试的 1. 实习的定义 1.1 日常实习 日常实习是企业长期招聘的实习岗位,通常没有时间限制。企业会在需要时进行招聘,招聘对象包括在校大学生和大一、大二的…

苍穹外卖 新增套餐接口

新增套餐主要的坑:新增时操作数据库,不能使用简单的Insert注解,因为要使用到数据库自增的id值,所以说必须使用XML配置数据库;必须要注意建立好套餐和对应菜品之间的关联。 SetmealController package com.sky.control…

短视频矩阵系统源码开发优势,短视频矩阵系统oem部署

短视频矩阵系统就是在多个短视频平台上构建自己的内容生态,通过多平台、多账号、多内容的运营策略,实现品牌曝光、用户引流、产品销售等目的。短视频矩阵的核心在于通过矩阵式的布局,实现资源优化配置和利用,提升企业市场竞争力。…

2024年【安全员-A证】最新解析及安全员-A证作业考试题库

安全生产是企业发展的基石,关系到每一位员工的生命安全和企业的长远发展。为了提升安全管理人员的专业素养和应对突发事件的能力,2024年【安全生产模拟考试一点通】发布了最新的【安全员-A证】考试解析及题库,旨在帮助考生顺利通过考试&#…

.Net 8 Web API CRUD 操作

本次介绍分为3篇文章: 1:.Net 8 Web API CRUD 操作https://blog.csdn.net/hefeng_aspnet/article/details/143228383 2:在 .Net 8 API 中实现 Entity Framework 的 Code First 方法https://blog.csdn.net/hefeng_aspnet/article/details/1…

【C++干货篇】——类和对象的魅力(四)

【C干货篇】——类和对象的魅力(四) 1.取地址运算符的重载 1.1const 成员函数 将const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后面。const实际修饰该成员函数隐含的this指针(this指向的对…

Facebook登录客户追踪:了解用户访问路径,优化客户体验

随着数字化转型的不断加速,精准的客户数据收集和用户行为追踪成为企业提升用户体验和优化业务流程的关键。Facebook登录作为一种便捷的第三方登录方式,已经被广泛应用于各类网站和应用中。它不仅简化了用户的注册与登录流程,还帮助企业获得用…

nuxt3项目创建

安装 npx nuxilatest init <project-name> 此时会出现报错&#xff0c;需要在host文件中加入 185.199.108.133 raw.githubusercontent.com 再次执行命令&#xff0c;进入安装 此处选择npm&#xff0c;出现下图表示安装成功 启动项目 执行npm run dev&#xff0c;访…

【力扣 + 牛客 | SQL题 | 每日4题】牛客大厂笔试真题SQLW6, W7, W8

1. 牛客大厂笔试真题SQLW6&#xff1a;统计所有课程参加培训人次 1.1 题目&#xff1a; 描述 某公司员工培训信息数据如下&#xff1a; 员工培训信息表cultivate_tb(info_id-信息id,staff_id-员工id,course-培训课程)&#xff0c;如下所示&#xff1a; 注&#xff1a;该公…

【大数据技术基础 | 实验五】ZooKeeper实验:部署ZooKeeper

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验步骤&#xff08;一&#xff09;安装JDK&#xff08;二&#xff09;修改ZooKeeper配置文件&#xff08;三&#xff09;启动ZooKeeper集群 六、实验结果七、实验心得 一、实验目的 掌握ZooKeeper集群安装部署…

基于Netty构建WebSocket服务并实现项目群组聊天和实时消息通知推送

文章目录 前言需求分析技术预研Web端方案服务端技术 技术方案设计思路功能实现添加依赖自定义NettyServer自定义webSocketHandler使用NettyServer向在线用户发送消息 需要完善的地方 前言 我们的项目有个基于项目的在线文档编制模块&#xff0c;可以邀请多人项目组成员在线协同…

python爬虫-爬取蛋白晶体和分子结构

文章目录 前言一、环境准备二、爬取PDB蛋白结构1.下载指定数量的随机PDB2.下载指定靶标的PDB二、从ZINC爬取小分子mol2结构1.下载指定数量的随机分子2.下载指定分子三、从ChEMBL爬取小分子信息1.下载指定ID的SMILES(测试不成功,网站变成readonly了)四、总结爬虫1.查看对应的…

AMD锐龙8845HS+780M核显 虚拟机安装macOS 15 Sequoia 15.0.1 (2024.10)

最近买了机械革命无界14X&#xff0c;CPU是8845HS&#xff0c;核显是780M&#xff0c;正好macOS 15也出了正式版&#xff0c;试试兼容性&#xff0c;安装过程和之前差不多&#xff0c;这次我从外网获得了8核和16核openCore&#xff0c;分享一下。 提前发一下ISO镜像地址和open…

Flink Rest API

REST API | Apache Flink Flink官网API 通过curl 或者Rest API工具测试web UI对应的接口返回信息 Flink 提交yarn任务 ./bin/flink run -t yarn-per-job historyServer ../bin/historyserver.sh start

JavaScript完整笔记

JS引入 JavaScript 程序不能独立运行&#xff0c;它需要被嵌入 HTML 中&#xff0c;然后浏览器才能执行 JavaScript 代码。 通过 script 标签将 JavaScript 代码引入到 HTML 中&#xff0c;有两种方式&#xff1a; 内部方式 通过 script 标签包裹 JavaScript 代码 我们将 &…

安装Maven配置以及构建Maven项目(2023idea)

一、下载Maven绿色软件 地址&#xff1a;http://maven.apache.org/download.cgi 尽量不要选择最高版本的安装&#xff0c;高版本意味着高风险的不兼容问题&#xff0c;选择低版本后续问题就少。你也可以选择尝试。 压缩后&#xff1a; 打开后&#xff1a; 在该目录下新建mvn-…

SQLite 3.47.0 发布,大量新功能来袭

SQLite 开发团队于 2024 年 10 月 21 日发布了 SQLite 3.47.0 版本&#xff0c;我们来了解一下新版本的改进功能。 触发器增强 SQLite 3.47.0 版本开始&#xff0c;触发器函数 RAISE() 的 error-message 参数可以支持任意 SQL 表达式。在此之前&#xff0c;该参数只能是字符串…

SQL注入之sqlilabs靶场21-30题

重点插入&#xff1a;html表 第二十一题 分析过程&#xff1a;&#xff08;没有正确的账号密码是否能拿到Cookie&#xff1f;最后注释好像只能使用#&#xff0c;--好像无法注释&#xff09; 查看源码 这里输入账号密码处被过滤了 但Cookie被base64编码了 可以从Cookie入手 …

【Flutter】页面布局:弹性布局(Flex)

在 Flutter 开发中&#xff0c;布局是非常重要的部分。布局系统允许开发者控制和管理界面上的组件如何排列和展示。弹性布局&#xff08;Flex&#xff09;是其中一个非常强大且常用的布局组件&#xff0c;它能够在水平方向或垂直方向上灵活调整子组件的空间分配比例。Row 和 Co…