【JAVA秒会技术之加密】3DES(TripleDES)实现跨平台统一加密

简介: 3DES(TripleDES)实现跨平台统一加密 一、3DES简介 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是使用3条56位的密钥对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种

3DES(TripleDES)实现跨平台统一加密

一、3DES简介

3DES(或称为Triple DES是三重数据加密算法(TDEATriple Data Encryption Algorithm)块密码的通称。它相当于是使用356位的密钥对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。

加密算法,具体实现如下:

Ek()Dk()代表DES算法的加密和解密过程,K代表DES算法使用的密钥,M代表明文,C代表密文,这样:

3DES加密过程为:C=Ek3(Dk2(Ek1(M)))

3DES解密过程为:M=Dk1(EK2(Dk3(C)))

二、3DES实现跨平台加密

手机端后台通常是用JAVA开发的Web Service,而Android和IOS客户端需要调用同样的Web Service接口,为了数据安全考虑,要对数据进行加密。那么问题来了:如何编写出一套加密程序,以保证3个平台间加解密的结果一致呢?

1.相关类简介

(1)Cipher类

Cipher类为加密和解密提供密码功能。为创建 Cipher 对象,应用程序调用 Cipher 的getInstance方法并将所请求转换的名称传递给它。还可以指定提供者的名称(可选)。

[转换]是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作)。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案。

常用形式:算法/模式/填充”或“算法”。

API中返回实现指定转换的 Cipher 对象

static Cipher getInstance(String transformation)
static Cipher getInstance(String transformation, Provider provider)
static Cipher getInstance(String transformation, String provider)

(2)DESedeKeySpec类

DESedeKeySpec类指定一个 DES-EDE ("triple-DES") 密钥。两个构造方法:

DESedeKeySpec(byte[] key) //创建一个 DESedeKeySpec 对象,使用 key 中的前 24 个字节作为 DES-EDE 密钥的密钥内容。 
DESedeKeySpec(byte[] key, int offset) //创建一个 DESedeKeySpec 对象,使用 key 中始于且包含 offset 的前 24 个字节作为 DES-EDE 密钥的密钥内容。

(3)SecretKey接口

秘密(对称)密钥。此接口不包含方法或常量。其唯一目的是分组秘密密钥(并为其提供类型安全)。此接口的提供者实现必须改写继承自 java.lang.Object 的 equals 和 hashCode 方法,以便根据底层密钥材料而不是根据引用进行秘密密钥比较。

(4)SecretKeyFactory类

SecretKeyFactory类表示密钥的工厂。密钥工厂用来将密钥(类型 Key 的不透明加密密钥)转换为密钥规范(底层密钥材料的透明表示形式),反之亦然。秘密密钥工厂只对秘密(对称)密钥进行操作。密钥工厂为双工模式,即其允许根据给定密钥规范(密钥材料)构建不透明密钥对象,或以适当格式获取密钥对象的底层密钥材料。

API常用方法:

static SecretKeyFactory getInstance(String algorithm) //返回转换指定算法的秘密密钥的 SecretKeyFactory 对象。 
SecretKey generateSecret(KeySpec keySpec) //根据提供的密钥规范(密钥材料)生成 SecretKey 对象。

(5)IvParameterSpec类 

IvParameterSpec类指定一个初始化向量 (IV)。

API构造方法:

IvParameterSpec(byte[] iv) // 使用 iv 中的字节作为 IV 来构造一个 IvParameterSpec 对象。
IvParameterSpec(byte[] iv, int offset, int len) //使用 iv 中始于且包含 offset 的前 len 个字节作为 IV 来构造一个 IvParameterSpec 对象。

2.所需参数简介

1)算法:采用DESede/CBC/PKCS5Padding”。

[1]DESede即3DES加密算法。

[2]CBC密码分组链接模式。这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。是AES五种加密模式{CBC、ECB(电码本模式)、CTR(计算器模式)、OCF(密码反馈模式)、CFB(输出反馈模式}之一。其它各种模式的简单原理,可参照http://www.tuicool.com/articles/AZZjiu

 

[3]PKCS5Padding,简单理解,就是将原文填充到符合一定加密规则的指定长度。

2)IV初始向量long(createTime)转成字节,long字节序采用BIG_ENDIAN

CBC模式的作法是对第一块明文投入随机的初始向量(IV),然后将明文与向量运算的结果加密,加密的结果再作为下一块明文的向量。这种做法的最终目的是要达到语义上的安全,让攻击者无法从密文中获取能助其破译的相关线索,避免遭受选择明文攻击法。

初始向量的值依密码算法而不同。最基本的要求是“唯一性”,也就是说同一把金钥不重复使用同一个初始向量。这个特性无论在区块加密或串流加密中都非常重要。

3)对称密钥计算:每个服务分配的密钥(appsecret)

4)对加密后的密文进行base64编码

3.加密/解密代码实现

加密实现

Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
SecretKeyFactory skf = SecretKeyFactory.getInstance("DESede");
SecretKey secretKey = skf.generateSecret(new DESedeKeySpec(key.getBytes()));
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec);
byte [] encryptData = cipher.doFinal(plainText.getBytes("utf-8"));  
String result = Base64.encode(encryptData);      

解密实现

Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
SecretKeyFactory skf = SecretKeyFactory.getInstance("DESede");
SecretKey secretKey = skf.generateSecret(new DESedeKeySpec(key.getBytes()));
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
byte [] decryptData = cipher.doFinal(Base64.decode(encryptText));  
String result = new String(decryptData, "utf-8");


 

相关文章
|
10月前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
1021 44
|
10月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
829 1
|
11月前
|
安全 Java 编译器
new出来的对象,不一定在堆上?聊聊Java虚拟机的优化技术:逃逸分析
逃逸分析是一种静态程序分析技术,用于判断对象的可见性与生命周期。它帮助即时编译器优化内存使用、降低同步开销。根据对象是否逃逸出方法或线程,分析结果分为未逃逸、方法逃逸和线程逃逸三种。基于分析结果,编译器可进行同步锁消除、标量替换和栈上分配等优化,从而提升程序性能。尽管逃逸分析计算复杂度较高,但其在热点代码中的应用为Java虚拟机带来了显著的优化效果。
344 4
|
11月前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
1841 1
|
11月前
|
Java 测试技术 API
2025 年 Java 开发者必知的最新技术实操指南全览
本指南涵盖Java 21+核心实操,详解虚拟线程、Spring Boot 3.3+GraalVM、Jakarta EE 10+MicroProfile 6微服务开发,并提供现代Java开发最佳实践,助力开发者高效构建高性能应用。
1406 5
|
11月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
477 3
|
10月前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
963 0
|
11月前
|
存储 人工智能 算法
Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用(227)
本文探讨 Java 大数据在智能医疗影像压缩与传输中的关键技术应用,分析其如何解决医疗影像数据存储、传输与压缩三大难题,并结合实际案例展示技术落地效果。
|
11月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据在智能物流运输车辆智能调度与路径优化中的技术实现(218)
本文深入探讨了Java大数据技术在智能物流运输中车辆调度与路径优化的应用。通过遗传算法实现车辆资源的智能调度,结合实时路况数据和强化学习算法进行动态路径优化,有效提升了物流效率与客户满意度。以京东物流和顺丰速运的实际案例为支撑,展示了Java大数据在解决行业痛点问题中的强大能力,为物流行业的智能化转型提供了切实可行的技术方案。
|
11月前
|
分布式计算 Cloud Native 安全
Java:历久弥新的技术基石
Java:历久弥新的技术基石