我正在处理一些接收AES / CCM加密数据包但没有附加MAC的代码。这导致我在Java中出现问题,因为库期望MAC存在。以下是执行解密的代码片段:
javax.crypto.Cipher out = Cipher.getInstance("AES/CCM/NoPadding", "BC");
out.init(Cipher.DECRYPT_MODE, key, new javax.crypto.spec.IvParameterSpec.IvParameterSpec(nonce));
byte[] decrypted = out.doFinal(encrypted);
执行时,我的输入失败,因为8个字节的MAC未附加到encrypted
数组的末尾。错误消息为:Encryption failed : MAC check in CCM failed
。有没有办法使用Java库设置解密,以便不期望MAC?不幸的是,我无法控制远程设备发送给我的数据格式。
答案 0 :(得分:0)
CCM是带有MAC的CBC。如果您不想使用身份验证字段,请使用AES / CBC。
答案 1 :(得分:0)
通过在 async askFeedbackStep(stepContext) {
const CHOICES = ['⭐','?'];
return await stepContext.prompt(FEEDBACK_PROMPT, {
choices: ChoiceFactory.toChoices(CHOICES),
style: ListStyle.suggestedAction
});
}
}
中将 macSize
设置为 0,您可以使用 Bouncy Castle 执行此操作。下面的示例假设 AEADParameterSpec
附加了 MAC。在您的情况下,通过调用 ciphertext
而不是 cipher.doFinal(ciphertext)
来调整它丢失的事实。
cipher.doFinal(ciphertext, 0, ciphertext.length - LENGTH_MAC_TAG)