我已加密了一些文字如下:
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?谢谢!
答案 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();