Java实现对称加密(DES,AES)快速入门示例

对称加密是使用相同的密码进行加密和解密, 对称加密实现简单,安全性相比非对称加密较弱, 常用的对称加密算法有 DES,AES以及PDE等,关于对称加密相关概念参考:
对称加密、非对称加密深度解析

本篇介绍Java的DES和AES的加密和解密, 关于PDE算法的加解密实现, 可以参考:
Java使用PBE算法进行对称加解密最简入门和示例

DES 加密和解密

在Java语言中, DES 算法使用一个密钥进行加密和解密,使用密码规范(DESKeySpec)和密钥工厂(SecretKeyFactory)生成密钥。通过Cipher类来进行加密和解密操作,使用“DES/ECB/PKCS5Padding”作为加密算法和填充模式。

DES加密示例代码:

	/**
	 * DES 对称加密
	 */
	@Test
	public void desEncrypt() throws Exception {
		String plainText = "需要加密的内容";
		String secretKey = "this is password";
		DESKeySpec desKeySpec = new DESKeySpec(secretKey.getBytes(StandardCharsets.UTF_8));
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		SecretKey key = keyFactory.generateSecret(desKeySpec);

		Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
		cipher.init(Cipher.ENCRYPT_MODE, key);

		byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
		String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
		System.out.println("DES加密后的内容=" + encryptedText);
	}

DES 解密示例代码:

	
	@Test
	public void desDecrypt() throws Exception {
		String encryptedText = "HAyFHQXRKmihGtxFsrZlAJwla4FE3aqS";
		String secretKey = "this is password";
		DESKeySpec desKeySpec = new DESKeySpec(secretKey.getBytes(StandardCharsets.UTF_8));
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		SecretKey key = keyFactory.generateSecret(desKeySpec);

		Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
		cipher.init(Cipher.DECRYPT_MODE, key);

		byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
		String plainText = new String(decryptedBytes, StandardCharsets.UTF_8);
		System.out.println("DES解密的内容=" + plainText);
	}

这里为什么是DES/ECB/PKCS5Padding , 而不直接是 DES呢?

DES/ECB/PKCS5Padding 是一种加密算法和模式的规范,常用于对数据进行加密和解密操作。

具体来说:

  • DES(Data Encryption Standard)是一种对称加密算法,它使用相同的密钥(通常是 56 位长)进行加密和解密操作。
  • ECB(Electronic Codebook)是一种加密模式,它将输入的数据分成块,每块独立进行加密运算。
  • PKCS5Padding 是一种填充模式,它在数据块长度不足时,使用特定的填充方式进行填充,使每个数据块的长度达到指定长度。

DES/ECB/PKCS5Padding 相比其他加密算法和模式,具有以下优点和缺点:

优点:

  • 运算速度相对较快,适合对大数据流进行加密和解密操作;

  • 实现比较简单,可在多种编程语言和平台上进行实现;

  • 加密后的数据大小不会增加。

缺点:

  • ECB 模式不具备随机性和反复率,相邻数据块可能会产生相同的密文,容易受到攻击;

  • 密钥长度较短,安全性相对较低,易受到暴力破解和密码分析攻击;

使用相同密钥加密同一数据,密文总是相同,可容易地进行重放攻击和密码攻击。

因此,对于加密性能要求较高,安全要求相对较低的场景,可以选择使用 DES/ECB/PKCS5Padding 进行加密和解密操作。对于安全性要求较高的场景,应该考虑使用更加安全和可靠的加密算法和模式,比如 AES、RSA、CBC、GCM 等。

AES 加密和解密

AES 的加解密和DES很类似,直接看代码:

AES加密代码示例:

	@Test
	public void encryptAES() throws Exception {
		String plainText = "需要加密的内容";
		String secretKey = "this is password";
		SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
        
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
        String encryptedText =  Base64.getEncoder().encodeToString(encryptedBytes);
        System.out.println("AES加密后的内容=" + encryptedText);
	}

AES解密代码示例:

	@Test
	public void decryptAES() throws Exception {
		String encryptedText = "oL2b5xULTtAmfi4ujnpw/jPamo0nTNCgRC9Bo+SBz7k=";
		String secretKey = "this is password";
        SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));
		String plainText = new String(decryptedBytes, StandardCharsets.UTF_8);
		System.out.println("AES解密的内容=" + plainText);
	}

AES(Advanced Encryption Standard)使用相同的密钥进行加密和解密操作。这个示例中使用密钥字符串构建了一个 AES 密钥规范(SecretKeySpec),并通过 Cipher 类来进行加密和解密操作,使用 “AES/ECB/PKCS5Padding” 作为加密算法和填充模式。

需要注意的是,AES 是一个块密码算法,不同于 DES 等分块密码,它支持不同的密钥长度,如 AES-128、AES-192 和 AES-256。

在实际应用中,为了保证安全性,密钥应该足够长,同时需要确保密钥的安全生成、存储和传输。

Java 8 找不到 javax.crypto.spec.SecretKeySpec问题解决

在Java 11 和Java 17版本中,上面示例运行正常,但是在Java 8 中会提示找不到 javax.crypto.spec.SecretKeySpec,在及基于Eclipse 开发中, 虽然import 了SecretKeySpec , 但是会提示找不到这个类:

The import javax.crypto.spec.SecretKeySpec cannot be resolved

这里需要下载jce的扩展包,下载地址:
https://www.oracle.com/java/technologies/javase-jce8-downloads.html

下载后解压,
在这里插入图片描述

将 local_policy.jar 和US_export_policy.jar 放入JRE 的security目录中,比如C:\Program Files\Java\jdk1.8.0_361\jre\lib\security\policy\unlimited, 覆盖该目录下的同名文件:
在这里插入图片描述

之后在 Eclipse 的项目中导入这两个文件。

在线代码

  • https://github.com/osxm/java-ency/blob/master/src/main/java/com/osxm/je/topic/security/SymmetricEncy.java


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/71096.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

模拟信号和数字信号的转换

此文章介绍的模拟信号与数字信号转换相关的知识有如下: 通信原理的PCM脉冲编码调制 数字电子技术的A/D与D/A 以及stm32的ADC与DAC 模拟信号是指-----时间和数值均连续变化的电信号,如正弦波、三角波等。 数字信号是指-----在时间上和数值上均是离散的…

小兔鲜项目 uniapp (1)

目录 项目架构 uni-app小兔鲜儿电商项目架构 小兔鲜儿电商课程安排 创建uni-app项目 1.通过HBuilderX创建 2.通过命令行创建 pages.json和tabBar案例 uni-app和原生小程序开发区别 用VS Code开发uni-app项目 拉取小兔鲜儿项目模板代码 基础架构–引入uni-ui组件库 操…

图的拓扑排序算法

拓扑排序 什么是拓扑排序? 比如说,我们平时工作过程中一定听过一个词叫做—不能循环依赖。什么意思? A依赖BCD,B依赖CD,C依赖D,D依赖EF,想要获得A的话,首先就要先有EF,有…

PostgreSQL查询慢sql原因和优化方案

PostgreSQL sql查询慢优化方案有一下几种解决方案: 1.关闭会话 查询慢sql的执行会话,关闭进程。 查看数据库后台连接进程 SELECT count(*) FROM pg_stat_activity;SELECT * FROM pg_stat_activity; 查看数据库后台连接进程,但是此条SQL不…

分类预测 | Matlab实现基于TSOA-CNN-GRU-Attention的数据分类预测

分类预测 | Matlab实现基于TSOA-CNN-GRU-Attention的数据分类预测 目录 分类预测 | Matlab实现基于TSOA-CNN-GRU-Attention的数据分类预测效果一览基本介绍研究内容程序设计参考资料 效果一览 基本介绍 Matlab实现分类预测 | Matlab实现基于TSOA-CNN-GRU-Attention的数据分类预…

Golang 基本常量声明及 iota 使用

文章目录 一、局部常量声明二、全局常量声明三、多行常量定义,值表达式为空时自动继承前一个四、常量声明 - iota 一、局部常量声明 package mainimport "fmt"func main() {//局部常量声明//方式一:主动声明类型const lengthA int 10//方式二…

设计模式(6)原型模式

一、介绍 Java中自带的原型模式是clone()方法。该方法是Object的方法,native类型。他的作用就是将对象的在内存的那一块内存数据一字不差地再复制一个。我们写简单类的时候只需要实现Cloneable接口,然后调用Object::clone方法就可实现克隆功能。这样实现…

SpringBoot携带Jdk绿色部署项目

文章目录 SpringBoot携带Jdk绿色部署运行项目1. 实现步骤2. 自测项目文件目录及bat文件内容,截图如下:2-1 项目文件夹列表:2-2. bat内容 SpringBoot携带Jdk绿色部署运行项目 说明: 实际应用的不方便场景:1. 实际项目…

Centos7.9系统_亲测成功_磁盘满了_分区和挂载新盘_创建文件夹并挂载分区---Linux工作笔记057

由于在某些部署环境下,运维管理员,仅仅是给分配一些硬盘容量,但是并没有进行分区和挂载到对应的合适的目录下,因此这个时候就需要我们自己去处理了. 这个是自己亲测成功的:由于是后面记录的,尽量记录详细 free -h 查看一下内存情况 df -h查看 硬盘的使用情况,还有是否有没挂载…

【博客692】grafana如何解决step动态变化时可能出现range duration小于step

grafana如何解决step动态变化时可能出现range duration小于step 1、grafana中的step和resolution grafana中的 “step” grafana本身是没有提供step参数的,因为仪表盘根据查询数据区间以及仪表盘线条宽度等,对于不同查询,相同的step并不能…

实例 -- Loadrunner实现Android / IOS 手机APP压力测试

随着手机APP用户量的增大,大的手机APP一般都需要进行压力测试,这几天用了Loadrunner 12进行了手机APP的压力测试,整理了下,大家可以参考参考怎样给Andorid / IOS手机APP进行压力测试,以下是操作实例。 先前我的一个帖…

Spring MVC 简介

目录 1. 什么是MVC2. 什么是SpringMVC 1. 什么是MVC MVC是一种常用的软件架构模式。可以看作是一种设计模式,也可以看作是一种软件框架。经典MVC模式中,M是指模型,V是视图,C则是控制器,使用MVC的目的是将M和V的实现代…

mysql8和mysql5的安装过程都有!!!超多图超详细保姆级教程最新教程新手小白轻松上手,带你了解清楚你安装过程的每一个术语

目录 前言mysql5和mysql8的区别1.官网下载2.mysql8的安装2.1安装程序打开前2.2Choosing a Setup Type选择安装模式2.3Select Products选择组件2.3.1Select Products的组件解释2.3.2Select Products的组件选择2.3.3电脑操作系统位数查看2.3.4Select Products的组件的内容配置2.3…

Stable Diffuion webui Mac版本安装过程

系统环境 操作系统:MacOS Ventura13.5 芯片:Apple M2 Max Python: 3.10 安装前置准备 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git注意事项:修改源码内全部 git clone 链接,设置代理 https://ghpr…

PyTorch翻译官网教程-NLP FROM SCRATCH: CLASSIFYING NAMES WITH A CHARACTER-LEVEL RNN

官网链接 NLP From Scratch: Classifying Names with a Character-Level RNN — PyTorch Tutorials 2.0.1cu117 documentation 使用CHARACTER-LEVEL RNN 对名字分类 我们将建立和训练一个基本的字符级递归神经网络(RNN)来分类单词。本教程以及另外两个“from scratch”的自然…

虚拟机/双系统Ubuntu扩容

虚拟机Ubuntu扩容 1.需要删除所有的快照 2.扩展虚拟机磁盘大小 虚拟机(M)→设置(s)→硬盘(SCSI)→扩展磁盘容量 3.Ubuntu内调整分区大小 安装gparted分区工具:sudo apt-get install gparted 启动gparted并resize分区 4.最后最好建一个快照,不然gg了…

JavaWeb 中对 HTTP 协议的学习

HTTP1 Web概述1.1 Web和JavaWeb的概念1.2 JavaWeb技术栈1.2.1 B/S架构1.2.2 静态资源1.2.3 动态资源1.2.4 数据库1.2.5 HTTP协议1.2.6 Web服务器 1.3 Web核心 2 HTTP2.1 简介2.2 请求数据格式2.2.1 格式介绍2.2.2 实例演示 2.3 响应数据格式2.3.1 格式介绍2.3.2 响应状态码2.3.…

windows任务栏右下角不显示网络图标解决方法

1、背景 我运行windows诊断服务之后,然后重启了一把电脑,结果发现电脑无法上网了,进一步发现任务栏右下角的网络显示图标也没有了,网络状态显示也是一条横线。 几经折腾终于给解决了,遇到了不少坑,记录一…

【软件工程】数据流图/DFD概念符号/流程图分层/数据字典

【软件工程】数据流图/DFD概念符号/流程图分层/数据字典 目录 【软件工程】数据流图/DFD概念符号/流程图分层/数据字典 一、数据流图 ( DFD ) 简介 二、数据流图 ( DFD ) 概念符号 1、数据流 2、加工 ( 核心 ) 3、数据存储 4、外部实体 三、数据流图 ( DFD ) 分层 1、…

Java AWT Swing(图形化界面编程)(一)

目录 1.简介 2.Java中的图像化界面----Awt与Swing 一、AWT编程 1.简介 2.AWT的继承体系 3.container容器 3.1container继承体系 3.2.常见API 3.3容器演示一 3.4容器演示二 3.5容器演示三 1.简介: 通常情况下,java语言一般是用来开发后台程序的&#xff0…