我有密钥和数据:
现在如何根据这些参数计算CMAC?
更多信息:
使用AES作为基础块密码来计算MAC,根据NIST特别出版物800-38B中描述的CMAC标准。但是我很难找到Java中正确的MAC计算示例。
编辑 this 此链接对此非常有效。 我需要Java示例。
我有密钥和数据:
现在如何根据这些参数计算CMAC?
更多信息:
使用AES作为基础块密码来计算MAC,根据NIST特别出版物800-38B中描述的CMAC标准。但是我很难找到Java中正确的MAC计算示例。
编辑 this 此链接对此非常有效。 我需要Java示例。
public void getCMAC()
throws Exception {
byte[] msg = new byte[]{(byte) 0xA3, (byte) 0x00, (byte) 0x00, (byte) 0x35, (byte) 0xE7, (byte) 0x58,
(byte) 0xC6, (byte) 0x09, (byte) 0x00, (byte) 0x4F, (byte) 0x44, (byte) 0x36, (byte) 0xF0,
(byte) 0xEA, (byte) 0x31, (byte) 0x9A, (byte) 0xF4, (byte) 0x31, (byte) 0xE1,
(byte) 0x98, (byte) 0xBC, (byte) 0x41, (byte) 0xA0, (byte) 0x67, (byte) 0xD1};
byte[] keydata = new byte[]{(byte) 0x67, (byte) 0x1B, (byte) 0x9D, (byte) 0x1D, (byte) 0xC1, (byte) 0x54,
(byte) 0x74, (byte) 0xA2, (byte) 0x5C, (byte) 0xB1, (byte) 0x77, (byte) 0xCA, (byte) 0x1A,
(byte) 0x19, (byte) 0x9F, (byte) 0x0E};
CipherParameters params = new KeyParameter(keydata);
BlockCipher aes = new AESEngine();
CMac mac = new CMac(aes);
mac.init(params);
mac.update(msg, 0, msg.length);
byte[] out = new byte[mac.getMacSize()];
mac.doFinal(out, 0);
StringBuilder s19 = new StringBuilder();
for (byte b : out) {
s19.append(String.format("%02X ", b));
}
Log.e("ecrypted Kmac :", s19.toString());
}
Make sure you add lib like this:
implementation 'org.bouncycastle:bcpkix-jdk15on:1.56'
这个也使用了BouncyCastle,但是使用的是Java Crypto API,如果需要使用不同的加密提供程序,则更加灵活:
Mac mac = Mac.getInstance("AESCMAC", new BouncyCastleProvider());
mac.init(new SecretKeySpec(key, "AES"));
mac.update(data);
mac.doFinal(moredata);
BouncyCastle必须作为依赖项添加。
getBytes
并不能做到这一点。而CMAC != HMAC。你以为只有一个字符的差异,所以它们差不多吗? - undefined