gpt4 book ai didi

java - ISO 9797-1 MAC算法3和填充方法1 Java示例?

转载 作者:行者123 更新时间:2023-11-30 05:41:20 28 4
gpt4 key购买 nike

通过Java Cryptography Architecture和一些代码示例,我学会了如何使用Mac类来计算Mac:

请找到以下代码来计算MAC:

Mac mac = Mac.getInstance("HmacSHA256");
mac.init(<secretKeyHere>);
byte[] macHash = mac.doFinal(<encryptedTextHere>);

但实际上我正在寻找一种使用 ISO 9797-1 算法 3(零售 MAC)和填充 1 来计算 Mac 的方法(如有必要,将值为 0 的位添加到数据末尾,直到填充的数据为n 的倍数,其中 n 是 DES 密码的 block 大小,即 8)。

有人可以建议java代码示例吗?

最佳答案

BouncyCastle包括 ready-to-use class计算“零售 MAC”。

使用example :

public byte[] getRetailMAC(byte[] key, byte[] data) {
BlockCipher cipher = new DESEngine();
Mac mac = new ISO9797Alg3Mac(cipher, 64, new ISO7816d4Padding());

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

byte[] out = new byte[8];

mac.doFinal(out, 0);

return out;
}
<小时/>

要使用可选零填充,您需要自己执行填充,因为 Bouncy CaSTLe 总是填充,即使在执行不明确的零填充时也是如此。

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 - NOT REQUIRED, SEE UPDATE
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;
}

请注意,这种填充不区分以一个或多个零值字节结尾的消息(并且 8 字节 block 的数量保持不变)。因此,对于仅预定义字节数的消息来说,它是不安全的。

更新:

手动填充是不必要的,因为这种填充模式(规范中的类型 1)实际上是默认模式,并且在 MAC 实现中执行。因此,当不提供任何填充时,您会得到这个。请注意,这与提供 ZeroBytePadding 不同,因为最后一个总是填充。

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

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