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加解密工具类* <pre>*     author  : Fantasy*     version : 1.1, 2019-07-12*     since   : 1.0, 2019-07-10* </pre>*/
public class TripleDESUtils {private static final String CHARSET = "UTF-8";/*** 加密,输出Base64字符串密文** @param data           明文* @param key            密钥* @param transformation 类型,格式为:加密算法/加密模式/填充方式,举例:DESede/CBC/PKCS5Padding,*                       相关取值可以查看下列两个文档:*                       <ul>*                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>*                       中的 javax.crypto.Cipher</li>*                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">*                       Standard Algorithm Name Documentation</a></li>*                       </ul>* @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,*                       相关取值可以查看下列两个文档:*                       <ul>*                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>*                       中的 javax.crypto.Cipher</li>*                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">*                       Standard Algorithm Name Documentation</a></li>*                       </ul>* @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,*                       相关取值可以查看下列两个文档:*                       <ul>*                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>*                       中的 javax.crypto.Cipher</li>*                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">*                       Standard Algorithm Name Documentation</a></li>*                       </ul>* @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,*                       相关取值可以查看下列两个文档:*                       <ul>*                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>*                       中的 javax.crypto.Cipher</li>*                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">*                       Standard Algorithm Name Documentation</a></li>*                       </ul>* @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 类型,格式为:加密算法/加密模式/填充方式,举例:<i>DESede/CBC/PKCS5Padding</i>。<br/>*                       相关取值可以查看下列两个文档:*                       <ul>*                       <li><a href="https://docs.oracle.com/javase/8/docs/api">JavaSE 8 API</a>*                       中的 javax.crypto.Cipher</li>*                       <li><a href="https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#Cipher">*                       Standard Algorithm Name Documentation</a></li>*                       </ul>* @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群哦!

使用Java实现3DES加密解密相关推荐

  1. java 3des_如何用Java进行3DES加密解密 java实现3des加密解密教程

    3des,全称为3DESede或TripleDES,中文解释为是三重数据加密,用户可以通过通过对DES算法进行改进,针对每个数据块进行三次DES加密,下面小编为你带来java实现3des加密解密教程! ...

  2. Java中3DES加密解密示例

    在java中调用sun公司提供的3DES加密解密算法时,需要使用到$JAVA_HOME/jre/lib/目录下如下的4个jar包: jce.jar security/US_export_policy. ...

  3. Java实现3DES加密解密(DESede/ECB/PKCS5Padding使用)

    一.简介 3DES(又叫Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称. 它相当于是对每个数据块应用三次DES加密算 ...

  4. 用java实现3DES加密解密算法

    3DES加密也称三重加密,其底层加密算法与DES相同,只不过它的密钥长度是168位.由于在DES加密算法中,64位密钥中每一个字节的第8位是奇偶校验位,所以每个字节中只有后7位起密钥作用,实际是56位 ...

  5. java 3des加密_Java使用3DES加密解密的流程 - 3des加密解密详细解释

    Java使用3DES加密解密的流程 ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象 SecretKey deskey = new Secret ...

  6. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

  7. iOS 3DES加密解密(一行代码搞定)

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

  8. 一行代码实现IOS 3DES加密解密

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

  9. 简进祥==iOS 3DES加密解密

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

最新文章

  1. 单链表的几个基本操作
  2. Mysql 基本框架 select的全过程
  3. CVPR 2021 involution:超越convolution和self-attention的神经网络新算子
  4. how does tomcat access js - SAPUI5 Core Libraries
  5. java 简单类继承
  6. BAT文件执行完成后如何删除自身的解决办法
  7. iframe嵌套微信网页,图片无法显示问题
  8. Idea 进行断点调试的 快捷键
  9. 熵权法计算权重原理python实现
  10. python 微博自动点赞软件_python3 爬虫学习: 自动给你心上人的微博点赞
  11. 《批判性思维》感1.1-[信念执念断言]
  12. Flutter 实现 仿Android原生启动模式SingleTask
  13. 线性混合效应模型Linear Mixed-Effects Models的部分折叠Gibbs采样
  14. django html传递数组,django将数组传递给前台模板的方法
  15. 马尔可夫和切比雪夫不等式的证明
  16. 数据结构 课堂测验错题_200911
  17. Arduino基础入门篇25—红外遥控
  18. Python的三个引号作用
  19. 《信息安全技术》实验一 PGP的原理与使用
  20. cad版本怎么在线转换?软件操作更高效

热门文章

  1. 荣耀电视与小米电视厮杀正烈,创维却以更低的价格杀入战场
  2. 使用SSH连接Linux上的Oracle
  3. 3D打印机DIY(二)X轴与Z轴安装
  4. window7安装python3.7
  5. 学习偏态分布的相关知识和原理的4篇论文推荐
  6. 【数据结构】【期末复习】知识点总结
  7. intbyreference java_从内存出发,java是pass by value 还是pass by reference
  8. node数据加密,还不快快点进来?
  9. eclipse svn上传文件 报错 403forbidden
  10. php 支付宝配置,Payment:支付宝支付配置文件设置教程 - PHP