在Java中计算CMAC-AES(RFC 4493)

3

我有密钥和数据:

现在如何根据这些参数计算CMAC?

更多信息:

使用AES作为基础块密码来计算MAC,根据NIST特别出版物800-38B中描述的CMAC标准。但是我很难找到Java中正确的MAC计算示例。

编辑 this 此链接对此非常有效。 我需要Java示例。


除了800-36B中定义的那个之外,还有几种基于AES的MAC算法。CMAC并没有被定义为接受IV的MAC算法,所以我很好奇是什么让你认为你正在处理的密钥和数据是用于CMAC而不是CbcMac、GMAC、AES-CCM等。无论如何,应该存在可以处理任何这些情况的Java库。 - undefined
我的错,没有IV。我已经编辑了我的代码。 - undefined
我一直在努力寻找一个好的Java示例,但没有运气 :( - undefined
你试过Bouncy Castle吗?它肯定有一个CMAC实现...否则:你可以将十六进制转换为二进制,然后用密钥初始化CMAC,然后进行计算,可能需要将结果重新转换为十六进制。你不需要示例,对吧?否则应该有可用的测试类。 - undefined
你的消息是以十六进制表示的。你忘记解码你的消息了。调用getBytes并不能做到这一点。而CMAC != HMAC。你以为只有一个字符的差异,所以它们差不多吗? - undefined
显示剩余2条评论
2个回答

2
如果有人在寻找CMAC AES计算的话,这里提供使用Bouncy Castle的方法:
 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'

0

这个也使用了BouncyCastle,但是使用的是Java Crypto API,如果需要使用不同的加密提供程序,则更加灵活:

Mac mac = Mac.getInstance("AESCMAC", new BouncyCastleProvider());
mac.init(new SecretKeySpec(key, "AES"));
mac.update(data);
mac.doFinal(moredata);

BouncyCastle必须作为依赖项添加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接