4

我正在尝试使用 BouncyCastle 的 CMac 实现,但显然我做错了。至少以下单元测试(基于 RFC 5297 测试向量)失败:

@Test
public void testCMacOfZeros() {
    byte[] key = {(byte) 0xff, (byte) 0xfe, (byte) 0xfd, (byte) 0xfc, //
            (byte) 0xfb, (byte) 0xfa, (byte) 0xf9, (byte) 0xf8, //
            (byte) 0xf7, (byte) 0xf6, (byte) 0xf5, (byte) 0xf4, //
            (byte) 0xf3, (byte) 0xf2, (byte) 0xf1, (byte) 0xf0, //
            (byte) 0xf0, (byte) 0xf1, (byte) 0xf2, (byte) 0xf3, //
            (byte) 0xf4, (byte) 0xf5, (byte) 0xf6, (byte) 0xf7, //
            (byte) 0xf8, (byte) 0xf9, (byte) 0xfa, (byte) 0xfb, //
            (byte) 0xfc, (byte) 0xfd, (byte) 0xfe, (byte) 0xff};

    byte[] zeros = new byte[16];

    byte[] result = new byte[16];

    CipherParameters params = new KeyParameter(key);
    BlockCipher aes = new AESEngine();
    CMac mac = new CMac(aes);
    mac.init(params);
    mac.update(zeros, 0, 16);
    mac.doFinal(result, 0);

    byte[] expected = {(byte) 0x0e, (byte) 0x04, (byte) 0xdf, (byte) 0xaf, //
            (byte) 0xc1, (byte) 0xef, (byte) 0xbf, (byte) 0x04, //
            (byte) 0x01, (byte) 0x40, (byte) 0x58, (byte) 0x28, //
            (byte) 0x59, (byte) 0xbf, (byte) 0x07, (byte) 0x3a};

    Assert.assertArrayEquals(expected, result);
}

我假设 CMac 实现本身已经过很好的测试,所以我必须错过一些东西。

4

1 回答 1

4

我发现了我的错误:

SIV-AES 在 CMAC 模式 (S2V) 和计数器模式 (CTR) 中使用 AES。SIV-AES 采用 256、384 或 512 位密钥(分为两个大小相等的密钥,一个用于 S2V,另一个用于 CTR)

我应该只使用给定键的前 16 个字节。

正如预期的那样,BouncyCastle 工作得很好。

于 2015-02-14T15:21:45.160 回答