如何将AES CCM与Bouncycastle JCE提供商一起使用 - CCMParameters

时间:2016-06-27 19:58:27

标签: java encryption aes bouncycastle jce

是否可以使用JCE执行CCM?

我在互联网上看到很多使用非JCE bouncycastle类的例子。特别是,我看到他们在CCMParameters对象中调用init传递。

麻烦的是,这个CCMParameters对象并不是从AlgorthmParameters或AlgorithmParameterSpec派生的,所以似乎无法将它传递给Cipher.init()(在使用Cipher.getInstance获取Cipher对象之后(&#34) ; AES / CCM / NoPadding"))

如何做到这一点?

2 个答案:

答案 0 :(得分:0)

这里是AES-CCM算法的示例代码 所有常用名称都是输入参数。 注意HEX数据字节和所有其他事情

import org.bouncycastle.crypto.BlockCipher;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CCMBlockCipher;
import org.bouncycastle.crypto.params.CCMParameters;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Hex;

public class AesCcm {
    public static void main(String[] args) throws IllegalStateException, InvalidCipherTextException {
    int macSize = 125;
    byte[] key = new byte[32];
    byte[] keybyte = "test123".getBytes();
    byte[] inputNouc = "abcdefghijklm".getBytes();
    for (int I = 0; I < keybyte.length; I++) {
        key[I] = keybyte[I];
    }

//      Input data in HEX format
    String input = "ed88fe7b95fa0ffa190b7ab33933fa";

    byte[] inputData= Hex.decode(input);

    BlockCipher engine = new AESEngine();
    CCMParameters params = new CCMParameters(new KeyParameter(key),
            macSize, inputNouc, null);

    CCMBlockCipher cipher = new CCMBlockCipher(engine);
    cipher.init(true, params);
    byte[] outputText = new byte[cipher.getOutputSize(inputData.length)];
    int outputLen = cipher.processBytes(inputData, 0, inputData.length,
            outputText , 0);
    cipher.doFinal(outputText, outputLen);

//      outputText and mac are in bytes 
    System.out.println(outputText);
    System.out.println(cipher.getMac());
    }
}

答案 1 :(得分:0)

否,当前的JCE(自JDK 10起)不支持CCM模式。

有关受支持的AES模式的列表,请查看Oracle here的官方文档。查看表4-13 “ SunJCE Provider密码转换”