前言

默认的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. SpringBoot应用篇(一):自定义starter

    一.码前必备知识 1.SpringBoot starter机制 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在mave ...

  2. [Xcode 实际操作]四、常用控件-(11)UIDatePicker日期时间选择器

    目录:[Swift]Xcode实际操作 本文将演示日期拾取器的使用. 使用日期拾取器,可以快速设置和选择日期与时间. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] ...

  3. web综合案例04

    web综合案例02 web综合案例02 web综合案例04 待补充 ... ...

  4. Collection、泛型

    Collection.泛型 Collection.泛型 Collection.泛型 Collection.泛型 Collection.泛型 Collection.泛型 Collection.泛型

  5. thinkphp实现登录后返回原界面

    主要思路还是用session记录原地址,在登录后再跳转回原界面 先保存请求login方法界面的url public function savelogin(){ session('returnUrl', ...

  6. JMETER进行REST API测试(分步指南)

    我确定你在这里是因为你需要加载测试Json Rest API.这并不奇怪,因为Rest API现在越来越受欢迎. 这本指南的目的:帮助您进行负载测试一个Json的 REST API 通过一个具体的例子 ...

  7. emmet中的用法

    CSS Abbreviations Link VALUES LINK Emmet is about more than just HTML elements. You can inject value ...

  8. vuex和localStorage/sessionStorage 区别

    1.最重要的区别:vuex存储在内存,localstorage则以文件的方式存储在本地 2.应用场景:vuex用于组件之间的传值,(响应式的),localstorage则主要用于不同页面之间的传值(其 ...

  9. CentOS下ganglia监控部署

    第一步:CentOS环境准备 1.yum -y install apr-devel apr-util check-devel cairo-devel pango-devel libxml2-devel ...

  10. flush logs时做的操作

    flush logs时做的操作:  对于一般查询日志和慢日志,先关闭文件再打开  对于binlog,关闭当前的,开始用下一个新的  用错误日志文件的话,先关闭再打开flush logs可以对一般查询日 ...