MAC ISO 9797-1 Java中的MAC算法3和填充方法1?

时间:2019-04-24 08:48:39

标签: java cryptography

需要使用ISO 9797-1 MAC算法3和Java中的填充方法1生成35个字节(70个字符)的字母数字数据。

我尝试使用下面的代码,但是它不会生成35字节(70个字符)的字母数字数据,并且使用密钥作为64字节密钥。

public byte[] getRetailMAC(byte[] key, byte[] data) {
    int macSizeBits = 64;

    BlockCipher cipher = new DESEngine();

    Mac mac = new ISO9797Alg3Mac(cipher, macSizeBits);

    KeyParameter keyP = new KeyParameter(key);
    mac.init(keyP);
    mac.update(data, 0, data.length);

    // perform padding manually
    int n = cipher.getBlockSize();
    int zeroPaddingRequired = n - (data.length + n - 1) % n - 1; 
    for (int i = 0; i < zeroPaddingRequired; i++) {
        mac.update((byte) 0x00);
    }

    byte[] out = new byte[macSizeBits / Byte.SIZE];
    mac.doFinal(out, 0);

    return out;
}

我希望输出为35 bytes (70 characters) Alphanumerical data,但实际得到的高于代码的输出为:[B@2ee0d183

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

  • :[B@2ee0d183是字节数组的对象ID(请参见Java: Syntax and meaning behind "[B@1ef9157"? Binary/Address?),而不是内容! org.bouncycastle.util.encoders.Hex.toHexString(...)方法可用于将内容显示为十六进制字符串,即字节数组由例如3个字节,内容为0x420x420x43,然后此方法返回字符串414243
  • ISO9797Alg3Mac生成的MAC的最大长度等于所用密码(即DES)的块长度,即8字节。即参数macSizeBits(以位为单位的长度)必须小于或等于64(8的倍数)。对于较大的尺寸,在doFinal方法中会引发异常。因此,无法生成长度为35字节的MAC(但是可以串联多个MAC,直到达到所需的长度)。
  • 此外,如果在构造函数中未定义填充(当前是这种情况),则默认使用零字节填充(在此上下文中也称为padding method 1)。这意味着不需要手动执行零字节填充(但当然不会引起错误)。

最后两点可以显式测试,也可以在源代码中验证(https://www.bouncycastle.org/latest_releases.html Sources and JavaDoc bcprov-jdk15on-161.zip部分)。