如何获取BouncyCastle AES-CCM加密消息的消息认证码

时间:2011-01-18 20:04:41

标签: macos aes

我已加密了一些文字如下:

Cipher in = Cipher.getInstance("AES/CCM/NoPadding", "BC");
in.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(_nonce));
encoded = in.doFinal(payload);

效果很好。我想获得MAC,所以我试试这个:

byte[] K = Hex.decode(bek.getBytes());
Key key = new SecretKeySpec(K, "AES");
Mac mac = Mac.getInstance("AES/CCM/NoPadding", "BC");

但得到“没有这样的算法:AES / CCM / NoPadding for provider BC”。

那么,使用什么算法从AES / CCM加密消息中提取MAC?谢谢!

3 个答案:

答案 0 :(得分:0)

CCM模式意味着使用CBC分组密码MAC用于AES,因此这是您应该使用的算法,但我没有编写自己使用它的代码。我知道BouncyCastle使用CBCBlockCipherMac类来实现它,但我不是100%确定正确的算法名称,但在源代码中查看它似乎是“AESMac”(默认情况下使用CBC模式和零填充)。

答案 1 :(得分:0)

您不能使用JCE来提取MAC,它根本不受支持。您必须直接使用Bouncycastle加密API。类CCMBlockCipher有一个getMac方法来检索Mac字节。

答案 2 :(得分:0)

是的,密码文本中存在身份验证标记(mac)。如果在处理中使用了n位mac,那么密码文本中的最后一位是mac。

您也可以通过代码找到这个

 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,
            inputData, 0);
    cipher.doFinal(outputText, outputLen);
//this is your mac
cipher.getMac();