前言
默認的jdk不支持DESeee的算法,本地化的JDK中配置有攔截規則,能夠經過使用bouncycastle的jar包中的DESEngine類來進行DESeee算法的運算。html
DES的8字節加解密
DESEngine能夠進行8字節數據的加解密,具體的調用方法以下:java
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));
輸出結果:git
des encrypt=77a7d6bcf57962b9 des decrypt=187a9fccd218a4dd
3DES的8字節加解密
DESede
bouncycastle自己支持DES的ede運算,使用org.bouncycastle.crypto.engines.DESedeEngine
能夠進行DES的ede運算,這個類的代碼很簡單,就是調用DESEngine的方法進行了"加密-解密-加密"的操做,調用示例代碼:github
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));
輸出結果:spa
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的代碼能夠這樣寫:.net
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的加解密方式。3d
總結
一、使用DESEngine能夠實現DES的8字節數據的加密和解密 二、使用DESedeEngine能夠實現3des ede的8字節數據的加密和解密 三、使用BufferedBlockCipher嵌套DESedeEngine能夠實現des ede ecb模式的加解密 四、bouncycastle中還有CCMBlockCipher、CFBBlockCipher等,能夠組合實現多種3des的加解密方式code
完整的代碼:https://github.com/itlgl/cryptoutil
參考: [1] 3DES 和 ECB CBC 加密方式