需要使用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
。
有人可以帮我吗?
答案 0 :(得分:1)
:[B@2ee0d183
是字节数组的对象ID(请参见Java: Syntax and meaning behind "[B@1ef9157"? Binary/Address?),而不是内容! org.bouncycastle.util.encoders.Hex.toHexString(...)
方法可用于将内容显示为十六进制字符串,即字节数组由例如3个字节,内容为0x42
,0x42
和0x43
,然后此方法返回字符串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
部分)。