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

news2025/1/17 1:20:28

对称加密是使用相同的密码进行加密和解密, 对称加密实现简单,安全性相比非对称加密较弱, 常用的对称加密算法有 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


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

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

相关文章

【CSH 入门基础 5 -- csh 文件监控脚本实现】

文章目录 背景CSHLL 代码实现cshell 中 unset 的介绍bash 中监控文件的方法 背景 由于开发代码是在外网编译,而镜像的烧写是在内网中的EDA工具中进行的,所以就需要先将代码在外网编译好后,再通过FTP工具将镜像传输到内网中,然后在…

MyBatis配置文件:配置连接数据库的环境,实现数据库连接

目录 1、MyBatis配置数据库环境的连接方式 1.1连接方式一:MyBatis核心配置文件配置数据库连接信息 1.2连接方式二:在MyBatis核心配置文件中引入properties文件,配置数据库的环境 2、MyBatisd核心配置文件连接数据库的环境完整配置信息 3…

Win11麦克风说话别人听不见解决办法

Win11麦克风说话别人听不到声音怎么办?麦克风没有声音可能有三种原因造成的,第一种声音设置里面确认麦克风设备是否启用,第二种查看麦克风的访问权限,第三种是检查驱动是否有问题,下面就简单的讲一下解决方法&#xff…

【loadbalancer】还在用Ribbon?试试Spring自带的LoadBalancer吧

Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器, 用来替代Ribbon。 Spring官方提供了两种客户端都可以使用loadbalancer: RestTemplate:Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程…

【第二阶段】it关键字

1.invoke()函数 meThod1(1,2,3)等价meThod1.invoke(1,2,3) fun main() {val meThod1:(Int,Int,Int)->String{n1,n2,n3->val num"kotlin"println("num$num,n1$n1,n2$n2,,n3$n3")"num$num,n1$n1,n2$n2,,n3$n3,"}//调…

Vue响应式数据的原理

在 vue2 的响应式中,存在着添加属性、删除属性、以及通过下标修改数组,但页面不会自动更新的问题。而这些问题在 vue3 中都得以解决。 vue3 采用了 proxy 代理,用于拦截对象中任意属性的变化,包括:属性的读写、属性的…

前端使用ReadableStream.getReader来处理流式渲染

文章目录 前言一、纯css二、vue-typed-js插件1.安装2.注册3.使用总结 三、ReadableStream1.ReadableStream是什么?2.ReadableStream做什么?3.ReadableStream怎么用 前言 需求:让接口返回的文章根据请求一段一段的渲染,同时可以点击…

Spring MVC视图解析器

Spring MVC视图解析器 ➢ AbstractCachingViewResolver:➢ XmlViewResolver:➢ ResourceBundleViewResolver➢ UrlBasedViewResolver:➢ InternalResourceViewResolver:➢ FreeMarkerViewResolver➢ ContentNegotiatingViewResolv…

OffSec Labs Proving grounds Play——FunboxEasyEnum

文章目录 端口扫描目录扫描文件上传漏洞利用查看用户爆破密码sudo提权flag位置FunboxEasyEnum writeup walkthrough Funbox: EasyEnum ~ VulnHub Enumeration Brute-force the web server’s files and directories. Be sure to check for common file extensions. Remote…

OCR的发明人是谁?

OCR的发明背景可以追溯到早期计算机科学和图像处理的研究。随着计算机技术的不断发展,人们开始探索如何将印刷体文字转换为机器可读的文本。 OCR(Optical Character Recognition,光学字符识别)的发明涉及多个人的贡献&#xff0c…

布局性能优化:安卓开发者不可错过的性能优化技巧

作者:麦客奥德彪 当我们开发Android应用时,布局性能优化是一个必不可少的过程。一个高效的布局能够提高用户体验,使应用更加流畅、响应更加迅速,而低效的布局则会导致应用的运行变得缓慢,甚至出现卡顿、崩溃等问题&…

植被利用了多少陆地降水?

降水部分被植被利用,部分转化为河水流量。量化植被直接使用的水量对于解读气候变化的影响至关重要。 新提出的模型的预测与之前的结果进行了比较。资料来源:AGU Advances 水是地球的重要组成部分,因此,了解大尺度的水平衡及其建模…

【Rust】Rust学习 第十章泛型、trait 和生命周期

泛型是具体类型或其他属性的抽象替代。我们可以表达泛型的属性,比如他们的行为或如何与其他泛型相关联,而不需要在编写和编译代码时知道他们在这里实际上代表什么。 之后,我们讨论 trait,这是一个定义泛型行为的方法。trait 可以…

Springboot04--vue前端部分+element-ui

注意点: 这边v-model和value的区别:v-model是双向绑定的,value是单向绑定 li的key的问题 vue的组件化开发: 1. NPM(类似maven,是管理前段代码的工具) 安装完之后可以在cmd里面使用以下指令 2.…

带你认识储存以及数据库新技术演进

01经典案例 1.0 潜在问题 02存储&数据库简介 2.1 存储器层级架构 2.1 数据怎么从应用到存储介质 2.1 RAID技术 2.2 数据库 数据库分为 关系型数据库 和 非关系型数据库 2.2.2 非关系型 2.2.1 关系型 2.3 数据库 vs 经典存储-结构化数据管理 2.3.1 数据库 vs 经典存储-事务能…

c++ static

static 成员 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用 static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。 看看下面代码体会一下: //其他类 class …

​运行paddlehub报错,提示:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte…**​

我在windows11环境下运行paddlehub报错,提示:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte…** 参考篇文字的解决方案:window10下运行项目报错:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte...的解决办法_uni…

C语言——将一串字符进行倒序

//将一串字符进行倒序 #include<stdio.h> #define N 6 int main() {int a[N]{0,1,2,3,4,5};int i,t;printf("原数组数值&#xff1a; ");for(i0;i<N;i)printf("%d",a[i]);for(i0;i<N/2;i){ta[i];a[i]a[N-1-i];a[N-1-i]t;}printf("\n排序…

Xilinx DDR3学习总结——3、MIG exmaple仿真

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Xilinx DDR3学习总结——3、MIG exmaple例程仿真 前言仿真 前言 前面我们直接把exmaple例程稍加修改就进行了抢先上板测试&#xff0c;证明了MIG模块工作时正常的&#xff0…

SWIG使用方法

安装 下载 swigwin软件包&#xff0c;解压到合适的位置&#xff0c;然后将路径添加到环境变量即可。 编写C代码 //vector.hpp class Vector { private:int x;int y; public:Vector(int,int);double abs();void display(); };//vector.cpp #include "vector.hpp" …