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

Java中的MAC ISO 9797-1 MAC算法3和填充方法1?,java,cryptography,Java,Cryptography,需要在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 = ne

需要在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;
}
public byte[]getRetailMAC(byte[]key,byte[]data){
int macSizeBits=64;
块密码=新的DESEngine();
Mac Mac=新的ISO9797Alg3Mac(密码,macSizeBits);
KeyParameter keyP=新的KeyParameter(键);
mac.init(keyP);
mac.update(数据,0,数据长度);
//手动执行填充
int n=cipher.getBlockSize();
int zeroppaddingrequired=n-(data.length+n-1)%n-1;
对于(int i=0;i
我希望输出是35字节(70个字符)的字母数字数据,但实际的输出是高于代码的:[B@2ee0d183

谁能帮我一下吗。

  • :[B@2ee0d183
    是字节数组的对象id(请参阅),而不是内容!方法
    org.bouncycastle.util.encoders.Hex.tohextString(…)
    可用于将内容显示为十六进制字符串,即,如果字节数组由3个字节组成,其中包含
    0x42
    0x42
    0x43
    ,则此方法返回字符串
    414243
  • ISO9797Alg3Mac
    生成的MAC的最大长度等于所用密码的块长度,即DES的块长度,即8字节。即参数
    macSizeBits
    (位长度)必须是(8和的倍数)小于或等于64。对于较大的大小,会在
    doFinal
    -方法中引发异常。因此,无法生成长度为35字节的MAC(当然,可以连接多个MAC,直到达到所需长度)
  • 此外,如果构造函数中未定义填充(目前的情况是这样),则默认情况下使用零字节填充(在本上下文中也称为
    填充方法1
    ),这意味着不需要手动实现零字节填充(但当然不会导致错误)

最后两点可以在源代码(,Sources and JavaDoc,
bcprov-jdk15on-161.zip
)中进行显式测试或验证。

好的..现在将对象转换为字符串作为
org.bouncycastle.util.encoders.Hex.toHexString(out)
正确吗?以及我们如何做到这一点-MAC可以连接到所需的长度(70个字符)是吗?请帮助我。谢谢@Topaco通常,MAC用于保护消息的完整性并证明其真实性。互联网上有很多关于这方面的信息,例如。我不知道35字节的MAC需要什么。这些信息应该来自您,例如,MAC需要什么,为什么需要长度为35字节,为什么在8字节限制方面使用ISO9797?我建议的连接应该只显示一种达到所需长度的方法(但这种方法相当非传统)。哦,有趣的是,我希望位填充是默认值。我正在检查如果给出完整的块会发生什么。确认这是可选的零填充,而不是始终应用的零填充。除了DES之外,是否还有其他削片程序生成35个字节(70个字符)字母数字数据?谢谢@Topaco您可以搜索长度至少为35字节的MAC。可能没有长度正好为35字节的MAC。较长的MAC必须相应缩短。以下是SunJCE提供商提供的MAC列表:,MAC部分。
HmacSHA512
提供的MAC大小为64字节,必须n可以缩短为35字节。下面是一个示例:(不包括截断为35字节)。