【问题标题】:How to use AES CCM with Bouncycastle JCE provider - CCMParameters如何将 AES CCM 与 Bouncycastle JCE 提供程序一起使用 - CCMParameters
【发布时间】:2016-10-29 22:57:58
【问题描述】:

是否可以使用JCE进行CCM?

我在 Internet 上看到很多使用非 JCE bouncycastle 类的示例。特别是,我看到他们调用 init 并传入一个 CCMParameters 对象。

麻烦的是,这个 CCMParameters 对象不是从 AlgorthmParameters 或 AlgorithmParameterSpec 派生的,所以似乎没有办法将它传递给 Cipher.init() (在使用 Cipher.getInstance("AES/CCM/无填充"))。

如何做到这一点?

【问题讨论】:

标签: java encryption aes bouncycastle jce


【解决方案1】:

您好,这里是 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());
    }
}

【讨论】:

  • 这很好,但问题是关于使用 JCE,而不是 bouncycastle 专有 API。
【解决方案2】:

不,JCE 当前(从 JDK 10 开始)不支持 CCM 模式。

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

【讨论】:

  • 也许这值得提出一个新问题,但对上述问题的评论表明,使用 BC 和普通的 JCE API 现在这可能是可能的。如下所述,我知道 BC 专有 API 可以做到这一点,但如果 JCE API 有办法,即使它需要一个替代的密码提供程序,它也会很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多