前言

默认的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. Neutron网络研究

    你将学到什么 虚拟机的Ping包是如何出外网的 DevStack环境准备 节点 硬件配置 网络配置 类型 操作系统 DevStack 4G 2CPU 50GB 2张网卡(NAT模式) VMWare虚拟 ...

  2. LVM使用

    LVM框架 LVM实验环境准备 创建一个128MB的文件模拟磁盘 [centos@centos lvm]$ dd if=/dev/zero of=./disk.img count=128 bs=1MB ...

  3. 51nod 1354【DP】

    (我一定是A了一题假DP) 给定序列a[0],a[1],a[2],...,a[n-1] 和一个整数K时, 有多少子序列所有元素乘起来恰好等于K. K<=1e8; 思路: 感觉 k 的 约数是突破 ...

  4. python之05 操作系统用户密码修改

    ubuntu的操作系统修改密码的操作方法: 一.在系统启动时按住shift键,出现下图的界面 二.按下e进入命令行,找到下图红色框中的文字并修改成rw init=/bin/bash 然后按F10启动, ...

  5. 2017-10-24 NOIP模拟赛

    括号序列 (bracket) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法 ...

  6. 对zabbix监控磁盘性能的补充

    原因 在上一篇文章中,我写了完整的磁盘监控步骤,希望对大家有所帮助.但是这里还需要作出一点补充. 根据上一篇文章的内容,我是使用iostat命令不停的收集磁盘的信息,然后写入到/tmp/iostat_ ...

  7. 使用pods添加第三方的时候,出现ld: library not found for -lpop

    ld: library not found for -lpop 错误,是在使用pods添加第三方的时候,出现的编译错误,同时伴随着的是error: linker command failed with ...

  8. springBoot2.0 配置@ControllerAdvice 捕获异常统一处理

    一.前言 基于上一篇 springBoot2.0 配置shiro实现权限管理 这一篇配置 异常统一处理 二.新建文件夹:common,param 三.返回结果集对象 1.ResultData.java ...

  9. HTML 常用头部标签(meta)

    先来看下常用的标签列表,后文会一一介绍: <!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang=&quo ...

  10. Javascript专题(一)严格模式

    严格模式是干什么的?它从哪里来? ECMAScript5中引入了严格模式.它为JS定义了一种不同的解析和执行模型. 摘自阮一峰博客:http://www.ruanyifeng.com/blog/201 ...