热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Java实现3DES加密解密

1.介绍3DES又称TripleDES,是三重数据加密算法(TDEA,TripleDataEncryptionAlgorithm

1. 介绍

3DES又称Triple DES,是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。密钥长度是128位(bit)和192位(bit)。原版DES容易被破解,新的3DES出现,增加了加密安全性,避免被暴力破解。它同样是对称性加密,同样涉及到加密模式和填充方式。加密模式有ECB、CBC、CTR、OFB、CFB。填充方式有PKCS5Padding、PKCS7Padding、ZeroPadding、ISO10126、Ansix923。

这里提供一个在线进行3DES加密解密:http://tool.chacuo.net/crypt3des


2. 具体实现

加密后对数据的输出采用2种方式:Base64、Hex,其中Base64使用的是Android SDK里面的API,具体代码如下:

package com.fantasy.blogdemo.crypto.utils;import android.util.Base64;import com.fantasy.blogdemo.utils.ConvertUtils;import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;/*** 3DES加解密工具类*

* author : Fantasy* version : 1.1, 2019-07-12* since : 1.0, 2019-07-10* */
public class TripleDESUtils {private static final String CHARSET = "UTF-8";/*** 加密,输出Base64字符串密文** @param data 明文* @param key 密钥* @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:DESede/CBC/PKCS5Padding,* 相关取值可以查看下列两个文档:*

    *
  • JavaSE 8 API* 中的 javax.crypto.Cipher
  • *
  • * Standard Algorithm Name Documentation
  • *
* @param iv 偏移量,ECB模式不需要,传null* @return 密文* @throws Exception 异常*/public static String encryptBase64(String data, String key, String transformation, String iv) throws Exception {return Base64.encodeToString(handle(data.getBytes(CHARSET), key, transformation, iv, true), Base64.NO_WRAP);}/*** 解密,密文为Base64字符串** @param data 密文* @param key 密钥* @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:DESede/CBC/PKCS5Padding,* 相关取值可以查看下列两个文档:*
    *
  • JavaSE 8 API* 中的 javax.crypto.Cipher
  • *
  • * Standard Algorithm Name Documentation
  • *
* @param iv 偏移量,ECB模式不需要,传null* @return 明文* @throws Exception 异常*/public static String decryptBase64(String data, String key, String transformation, String iv) throws Exception {return new String(handle(Base64.decode(data, Base64.NO_WRAP), key, transformation, iv, false), CHARSET);}/*** 加密,输出十六进制字符串密文** @param data 明文* @param key 密钥* @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:DESede/CBC/PKCS5Padding,* 相关取值可以查看下列两个文档:*
    *
  • JavaSE 8 API* 中的 javax.crypto.Cipher
  • *
  • * Standard Algorithm Name Documentation
  • *
* @param iv 偏移量,ECB模式不需要,传null* @return 密文* @throws Exception 异常*/public static String encryptHex(String data, String key, String transformation, String iv) throws Exception {return ConvertUtils.bytesToHexString(handle(data.getBytes(CHARSET), key, transformation, iv, true));}/*** 解密,密文为十六进制字符串** @param data 密文* @param key 密钥* @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:DESede/CBC/PKCS5Padding,* 相关取值可以查看下列两个文档:*
    *
  • JavaSE 8 API* 中的 javax.crypto.Cipher
  • *
  • * Standard Algorithm Name Documentation
  • *
* @param iv 偏移量,ECB模式不需要,传null* @return 明文* @throws Exception 异常*/public static String decryptHex(String data, String key, String transformation, String iv) throws Exception {return new String(handle(ConvertUtils.hexStringToBytes(data), key, transformation, iv, false), CHARSET);}/*** 处理数据,加密或解密** @param data 数据* @param key 密钥* @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:DESede/CBC/PKCS5Padding
* 相关取值可以查看下列两个文档:*
    *
  • JavaSE 8 API* 中的 javax.crypto.Cipher
  • *
  • * Standard Algorithm Name Documentation
  • *
* @param iv 偏移量,ECB模式不需要,传null* @param isEncrypt 如果是加密,则为true;如果为解密,则为false* @return 加密后或解密后的字节数组* @throws Exception 异常*/private static byte[] handle(byte[] data, String key, String transformation, String iv,boolean isEncrypt) throws Exception {SecretKey secretKey = new SecretKeySpec(key.getBytes(CHARSET), "DESede"); // 构造密钥Cipher cipher = Cipher.getInstance(transformation);if (iv == null || iv.length() == 0) {cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, secretKey);} else {IvParameterSpec ips = new IvParameterSpec(iv.getBytes(CHARSET));cipher.init(isEncrypt ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, secretKey, ips);}return cipher.doFinal(data);}}

3. 使用方式

这里以"DESede/CBC/PKCS5Padding"模式为例

String transformation = "DESede/CBC/PKCS5Padding";
String key = "QSfg26hg433BV42DKJN234SD"; // 密钥长度16位、24位
String iv = "CI2390NK"; // IV偏移量的长度必须为8位
String data = "blogDemo123"; // 待加密的数据// 加密结果:xyHZl10iOlBxi2RbR547cA==
String result1 = TripleDESUtils.encryptBase64(data, key, transformation, iv);// 解密结果:blogDemo123
String result2 = TripleDESUtils.decryptBase64(result1, key, transformation, iv);

想看更多例子可以到我的GitHub上面看看BlogDemo。

 


如果想进一步交流和学习的同学,可以加一下QQ群哦!



推荐阅读
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 本文介绍了如何在Android应用中通过Intent调用其他应用的Activity,并提供了详细的代码示例和注意事项。 ... [详细]
  • Vuforia 开发指南:第二章 环境配置与搭建
    本章节详细介绍了如何在Vuforia官网上完成账号注册及环境配置。首先,访问Vuforia官方网站并点击“Register”按钮,按照提示填写必要的个人信息。提交表单后,系统将验证信息并创建账户。接下来,用户需要下载并安装Vuforia开发工具,确保开发环境的顺利搭建。此外,还提供了详细的配置步骤和常见问题的解决方案,帮助开发者快速上手。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 解决Win10 1709版本文件共享安全警告问题
    每当Windows 10发布新版本时,由于兼容性问题往往会出现各种故障。近期,一些用户在升级至1709版本后遇到了无法访问共享文件夹的问题,系统提示‘文件共享不安全,无法连接’。本文将提供多种解决方案,帮助您轻松解决这一难题。 ... [详细]
  • OpenCV中的霍夫圆检测技术解析
    本文详细介绍了如何使用OpenCV库中的HoughCircles函数实现霍夫圆检测,并提供了具体的代码示例及参数解释。 ... [详细]
  • Windows操作系统提供了Encrypting File System (EFS)作为内置的数据加密工具,特别适用于对NTFS分区上的文件和文件夹进行加密处理。本文将详细介绍如何使用EFS加密文件夹,以及加密过程中的注意事项。 ... [详细]
  • 本文详细介绍了Elasticsearch中的分页查询机制,包括基本的分页查询流程、'from-size'浅分页与'scroll'深分页的区别及应用场景,以及两者在性能上的对比。 ... [详细]
  • 腾讯云移动推送TPNS(Tencent Push Notification Service)为APP开发者和运营人员提供了一站式、高效、稳定的推送解决方案,帮助提升用户活跃度和运营效率。 ... [详细]
  • 本文介绍了一种通过设置主题(Theme)来实现快速启动的Android引导页,并详细说明了如何避免因不同屏幕分辨率导致的图片拉伸问题。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • This feature automatically validates new regions using the AWS SDK, ensuring compatibility and accuracy. ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战?
    Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战? ... [详细]
author-avatar
隔壁小王
刚开始
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有