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.rhkb.cn/news/457850.html

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

相关文章

生成式 AI 与向量搜索如何扩大零售运营:巨大潜力尚待挖掘

在竞争日益激烈的零售领域,行业领导者始终在探索革新客户体验和优化运营的新途径,而生成式 AI 和向量搜索在这方面将大有可为。从个性化营销到高效库存管理,二者在零售领域的诸多应用场景中都展现出变革性潜力,已成为保持行业领先…

【前端】css样式

文章目录 1.常用样式记录 1.常用样式记录 支持文字换行 white-space:pre-wrap;

WPF+Mvvm案例实战(五)- 自定义雷达图实现

文章目录 1、项目准备1、创建文件2、用户控件库 2、功能实现1、用户控件库1、控件样式实现2、数据模型实现 2、应用程序代码实现1.UI层代码实现2、数据后台代码实现3、主界面菜单添加1、后台按钮方法改造:2、按钮添加:3、依赖注入 3、运行效果4、源代码获…

102. UE5 GAS RPG 实现范围技能奥术伤害

在上一篇文章里,我们在技能蓝图里实现了通过技能实现技能指示,再次触发按键后,将通过定时器触发技能效果表现,最多支持11个奥术个体效果的播放。 在这一篇里,我们将实现技能播放时,对目标敌人应用技能伤害。…

C++11新特性相关内容详细梳理

0. 引言 C11简介: 在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1),使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性…

C#实现简单的文件夹对比程序

python版本的文件夹对比程序虽然简单,但可视化效果一般,不太好看。使用C#的Winform项目实现可视化对比文件夹内容,主要功能包括:   1)采用Directory.GetDirectories获取子文件夹集合,Directory.GetFiles获…

C语言[求x的y次方]

C语言——求x的y次方 这段 C 代码的目的是从用户输入获取两个整数 x 和 y ,然后计算 x 的 y 次幂(不过这里有个小错误,实际计算的是 x 的 (y - 1) 次幂,后面会详细说),最后输出结果。 代码如下: #include…

8 个用于创建电商组件的 CSS 和 JS 代码片段

文章目录 前言正文1.自定义办公桌配置工具2.商品展示卡片3.Vue.js 支持的便捷购物体验4.简化的多步结账流程5.移动端优化的商品页面6.动态购物车效果7.React 支持的购物车页面8.尺码指南 总结 前言 优秀的电商网站,必须操作简便、注重细节,才能让用户留…

飞书文档解除复制限制

解除飞书文档没有编辑器权限限制复制功能方法 方法一:使用插件 方法二: 通过调试工具删除所有的copy事件 使用插件 缺点: 只有markdown格式,如果需要其他格式需要再通过Typora等markdown编辑器转pdf,word等格式 安装插件 Cloud Do…

OpenTelemetry 实际应用

介绍 OpenTelemetry“动手”指南适用于想要开始使用 OpenTelemetry 的人。 如果您是 OpenTelemetry 的新手,那么我建议您从OpenTelemetry 启动和运行帖子开始,我在其中详细介绍了 OpenTelemetry。 OpenTelemetry开始改变可观察性格局,它提供…

AAPL: Adding Attributes to Prompt Learning for Vision-Language Models

文章汇总 当前的问题 1.元标记未能捕获分类的关键语义特征 如下图(a)所示, π \pi π在类聚类方面没有显示出很大的差异,这表明元标记 π \pi π未能捕获分类的关键语义特征。我们进行简单的数据增强后,如图(b)所示,效果也是如…

RestHighLevelClient操作es查询文档

目录 利用RestHighLevelClient客户端操作es查询文档 查询match_all dsl语句: ​编辑 java代码 小结 match字段全文检索查询 dsl语句 java代码 multi_match多字段全文检索查询 dsl语句 java代码 term精确查询 dsl语句 java代码 range范围查询 dsl语句 j…

鸿蒙是必经之路

少了大嘴的发布会,老实讲有点让人昏昏入睡。关于技术本身的东西,放在后面。 我想想来加把油~ 鸿蒙发布后褒贬不一,其中很多人不太看好鸿蒙,一方面是开源性、一方面是南向北向的利益问题。 不说技术的领先点,我只扯扯…

破解API加密逆向接口分析,看这篇就够了

破解API加密逆向接口分析,看这篇就够了 每日一练:API接口数据逆向,看完这篇,就能学会找到逆向的入口函数、调试js代码、分析js代码、还原加解密算法!为了能及时获取后续的爬虫及逆向的技术分享文章,请先关注…

qt EventFilter用途详解

一、概述 EventFilter是QObject类的一个事件过滤器,当使用installEventFilter方法为某个对象安装事件过滤器时,该对象的eventFilter函数就会被调用。通过重写eventFilter方法,开发者可以在事件处理过程中进行拦截和处理,实现对事…

代码随想录算法训练营第46期

class Solution { public: // 决定dp[i]的因素就是第i房间偷还是不偷。 // 偷第i房间,那么dp[i] dp[i - 2] nums[i] 即:第i-1房一定是不考虑的,找出 下标i-2(包括i-2)以内的房屋,最多可以偷窃的金额为dp[…

Unity插件-Intense TPS 讲解

目录 关于TPS 打开场景:WeaponTest.unity, 只要把这些枪点,打开(默认隐藏,不知道为何), 一开始不能运行如何修复 总结 关于TPS 个人不是TPS,FPS的射击游戏爱好者, 不过感觉这个枪感&…

riscv uboot 启动流程分析 - SPL启动流程

分析uboot 启动流程硬件:启明智显推出M4核心板 (https://gitee.com/qiming-zhixian/m4-openwrt) 1.U-boot和SPL概述 U-Boot 分为 uboot-spl 和 uboot 两个组成部分。SPL 是 Secondary Program Loader 的简称,第二阶段程序加载器。…

springboot083基于springboot的个人理财系统--论文pf(论文+源码)_kaic

基于springboot的个人理财系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了个人理财系统的开发全过程。通过分析个人理财系统管理的不足,创建了一个计算机管理个人理财系统的方案。文章介绍了个…

JavaEE初阶---多线程(三)---内存可见性/单例模式/wait,notify的使用解决线程饿死问题

文章目录 1.volatile关键字1.1保证内存的可见性--引入1.2保证内存的可见性--分析1.3保证内存的可见性--解决1.4内存可见性-JMM内存模型 2.notify和wait介绍2.1作用一:控制调度顺序2.2作用二:避免线程饿死2.3notify和notifyAll区分 3.单例模式--经典设计模…