前言

默认的jdk不支持DESeee的算法,本地化的JDK中配置有拦截规则,可以通过使用bouncycastle的jar包中的DESEngine类来进行DESeee算法的运算。

DES的8字节加解密

DESEngine可以进行8字节数据的加解密,具体的调用方法如下:

byte[] key = ByteUtil.fromHex("0102030405060708");
byte[] input = ByteUtil.fromHex("0102030405060708");
byte[] out = new byte[8]; // 使用DESEngine进行加密
DESEngine desEngine = new DESEngine();
desEngine.init(true, new KeyParameter(key));
desEngine.processBlock(input, 0, out, 0);
System.out.println("des encrypt=" + ByteUtil.toHex(out)); // 使用DESEngine进行解密
desEngine.init(false, new KeyParameter(key));
desEngine.processBlock(input, 0, out, 0);
System.out.println("des decrypt=" + ByteUtil.toHex(out));

输出结果:

des encrypt=77a7d6bcf57962b9
des decrypt=187a9fccd218a4dd

3DES的8字节加解密

DESede

bouncycastle本身支持DES的ede运算,使用org.bouncycastle.crypto.engines.DESedeEngine可以进行DES的ede运算,这个类的代码很简单,就是调用DESEngine的方法进行了"加密-解密-加密"的操作,调用示例代码:

byte[] key = ByteUtil.fromHex("010203040506070801020304050607080102030405060708");
byte[] input = ByteUtil.fromHex("0102030405060708");
byte[] out = new byte[input.length];
DESedeEngine desEdeEngine = new DESedeEngine(); // 使用DESedeEngine进行加密
desEdeEngine.init(true, new KeyParameter(key));
desEdeEngine.processBlock(input, 0, out, 0);
System.out.println("des ede encrypt=" + ByteUtil.toHex(out)); // 使用DESedeEngine进行解密
desEdeEngine.init(false, new KeyParameter(key));
desEdeEngine.processBlock(input, 0, out, 0);
System.out.println("des ede decrypt=" + ByteUtil.toHex(out));

输出结果:

des ede encrypt=77a7d6bcf57962b9
des ede decrypt=187a9fccd218a4dd

DESeee

bouncycastle中没有提供DESeee的实现代码,但是我们可以根据DESedeEngine的代码自己实现一个DESeeeEngine,只要将processBlock中"加解加"的代码"加加加"即可,具体代码参见:https://github.com/itlgl/cryptoutil

调用示例代码:

byte[] key = ByteUtil.fromHex("010203040506070801020304050607080102030405060708");
byte[] input = ByteUtil.fromHex("0102030405060708");
byte[] out = new byte[input.length];
DESeeeEngine desEeeEngine = new DESeeeEngine(); // 使用DESeeeEngine进行加密
desEeeEngine.init(true, new KeyParameter(key));
desEeeEngine.processBlock(input, 0, out, 0);
System.out.println("des eee encrypt=" + ByteUtil.toHex(out)); // 使用DESeeeEngine进行解密
desEeeEngine.init(false, new KeyParameter(key));
desEeeEngine.processBlock(input, 0, out, 0);
System.out.println("des eee decrypt=" + ByteUtil.toHex(out));

输出结果:

des eee encrypt=ee5e6222f17509cd
des eee decrypt=5e207f47b1ea8ee2

des和3des的ECB、CBC

bouncycastle中的BlockCIpher是可以嵌套的,使用org.bouncycastle.crypto.modes.CBCBlockCipher嵌套DESEngine可以实现DES的cbc单位字节加密功能。

org.bouncycastle.crypto.BufferedBlockCipher可以嵌套BlockCipher的实现,进行8字节整数倍字节的加解密运算。

那么,3des EEE CBC的代码可以这样写:

public static byte[] desEeeCbc(final byte[] key, final byte[] src, final byte[] icv, final boolean encrypting) throws DesException {
if(key == null || (key.length != 16 && key.length != 24)) {
throw new DesException("DesEEE key should be 16 or 24 bytes");
}
if(icv == null || icv.length != 8) {
throw new DesException("DesEEE icv should be 8 bytes");
}
if(src == null || src.length == 0) {
throw new DesException("DesEEE src should not be empty");
}
if(src.length % 8 != 0) {
throw new DesException("DesEEE src length should be be an integer multiple of 8");
}
byte[] result = new byte[src.length];
try {
BufferedBlockCipher engine = new BufferedBlockCipher(new CBCBlockCipher(new DESeeeEngine()));
engine.init(encrypting, new ParametersWithIV(new KeyParameter(key), icv));
int len = engine.processBytes(src, 0, src.length, result, 0);
engine.doFinal(result, len);
} catch (InvalidCipherTextException e) {
throw new DesException(e);
}
return result;
}

bouncycastle中不止有BlockCIpher、CBCBlockCipher这两个cipher,还有CCMBlockCipher、CFBBlockCipher等,可以组合实现多种3des的加解密方式。

总结

1、使用DESEngine可以实现DES的8字节数据的加密和解密

2、使用DESedeEngine可以实现3des ede的8字节数据的加密和解密

3、使用BufferedBlockCipher嵌套DESedeEngine可以实现des ede ecb模式的加解密

4、bouncycastle中还有CCMBlockCipher、CFBBlockCipher等,可以组合实现多种3des的加解密方式

完整的代码:https://github.com/itlgl/cryptoutil

参考:

[1] 3DES 和 ECB CBC 加密方式

使用bouncycastle进行DESede/DESeee/AES128/AES192/AES256的加解密的更多相关文章

  1. .NET Core加解密实战系列之——使用BouncyCastle制作p12(.pfx)数字证书

    简介 加解密现状,编写此系列文章的背景: 需要考虑系统环境兼容性问题(Linux.Windows) 语言互通问题(如C#.Java等)(加解密本质上没有语言之分,所以原则上不存在互通性问题) 网上资料 ...

  2. AES128和AES256主要区别和安全程度是多少?他们对于机器的消耗是怎样的?两者性能如何?实际开发如何选择?

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...

  3. 用Portable.BouncyCastle来进行加解密的代码demo

    前言 这里对之前对接的公司中的代码demo做一个总结,原本为清一色的java,哈哈.这里都转成C#.用到的库是Portable.BouncyCastle.官网.之前也是准备用.net core 内置的 ...

  4. Java DESede 加解密("DESede/ECB/PKCS5Padding")

    private static final Cipher DES_CIPHER; static { try { DES_CIPHER = Cipher.getInstance("DESede/ ...

  5. iOS AES128 CBC No Padding加密解密

    最近的项目中数据传输用到加密,项目选择了AES128 CBC No Padding加密方式,PHP和Android方面的代码网上太多了.但是唯独没有iOS的,但是也有别的写法,但不是是AES128 C ...

  6. 最近项目和java对接,涉及到java的DESede加解密算法

    google后找到这个作者的一篇博客,搬过来用 http://hersface.com/page/17.html <?php class DESede{ /** * 加密 * @param $d ...

  7. iOS开发之Objective-c的AES256加密和解密算法的实现

    原文:http://www.lidaren.com/archives/1470 高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法. 以下实现 ...

  8. c# AES128 加解密算法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  9. C#中TripleDES对应Java中的DESede即大家说的3DES,附C#及Java加解密结果一致的控制台程序例子

    直接上代码了. Java控制台代码: package Test; import java.security.Key; import javax.crypto.Cipher; import javax. ...

随机推荐

  1. Oracle中 row_number() over()分析函数(转)

    https://www.cnblogs.com/moon-jiajun/p/3530035.html

  2. LibreOJ #6192. 「美团 CodeM 复赛」城市网络

    #6192. 「美团 CodeM 复赛」城市网络 内存限制:64 MiB时间限制:500 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: sqc 提交提交记录统计讨论测试数据   题目描 ...

  3. 根据T-Code查看用户出口的代码

    在此非常非常感谢源作者,这段代码真的非常非常有用好用! REPORT  YLBTEST. TABLES :  tstc,     "SAP Transaction Codes(SAP 事务代 ...

  4. springBoot2.0 配置shiro实现权限管理

    一.前言 基于上一篇springBoot2.0 配置 mybatis+mybatisPlus+redis 这一篇加入shiro实现权限管理 二.shiro介绍 2.1 功能特点 Shiro 包含 10 ...

  5. react native 安卓生产包无法获取线上数据

    android:usesCleartextTraffic="true"

  6. 由奇葩cookie导致服务器500来认识cookie

    问题:cookie中文会导致服务器报500错误. 一:cookie的特点 1.以键值对的形式出现的,比如:a=b;b=c 2.中文的值需要转义 cookie的例子 <!DOCTYPE html& ...

  7. 使用shell巧妙高效的批量删除历史文件或目录

    背景:有实时产生的数据按小时分文件保存,如“/data/2013/09/18/14.txt”.现需要保留30天的最新数据,而删除所有其它的历史数据.注意“保留30天的最新数据”,可能不是连续的30天, ...

  8. CUDA杂谈

    这一年都在编写CUDA的程序,用了很多优化的手段,发现大部分其实还是官方的指南里面的手段 https://docs.nvidia.com/cuda/cuda-c-best-practices-guid ...

  9. Linux中vim编辑器的缩进的功能键

    vim编程时,经常需要对代码进行缩进处理,以增加程序的可读性和后期的代码维护. 可以采用多种方式达到缩进的目的: 1) 命令模式(command mode) 2) Visual模式(visual mo ...

  10. JavaScript 浮点数处理

    众所周知,JavaScript 浮点数运算时经常遇到会 0.000000001 和 0.999999999 这样奇怪的结果,如 0.1+0.2=0.30000000000000004.1-0.9=0. ...