gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:40:06 25 4
gpt4 key购买 nike

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

我尝试使用下面的代码,但它没有生成 35 字节(70 个字符)字母数字数据并使用 key 作为 64 字节 key 。

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字节(70个字符)字母数字数据,但上面代码的实际输出是:[B@2ee0d183

任何人都可以帮我解决这个问题吗?

最佳答案

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

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

关于java - MAC ISO 9797-1 Java中的MAC算法3和填充方法1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55825965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com