使用bouncycastle進行DESede/DESeee/AES128/AES192/AES256的加解密

前言

默認的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 加密方式

相關文章
相關標籤/搜索