2011-10-05 52 views
2

我使用下面的代码获得AESCMAC如何设置的消息认证码长度的Java JCE/JCA

Mac mac = Mac.getInstance("aescmac", new BouncyCastleProvider()); 
mac.init(k_mac); 
byte[] tooLong = mac.doFinal(tmp); 

doFinal会生成一个字节数组与16的大小,但我会喜欢它是8个字节长。我看到有一个方法getMacLength()返回16,但没有setMacLength方法。 thx为您的帮助

回答

0

我不认为你可以减少长度。信息长度为16个字节;你不能在不丢失信息的情况下缩短它。

1

AES-CMAC产生128位MAC(见http://tools.ietf.org/html/rfc4493),即16字节。如果你想要一个8字节的MAC,选择一个产生64位MAC的算法。

有没有什么特别的原因为什么你想64位而不是128位MAC?

+0

我正在为新的德国身份证实施Secure Messaging。见http://www2.icao.int/en/MRTD/Downloads/Technical%20Reports/Technical%20Report.pdf的第28页。它说:“对于消息认证,AES应该在CMAC模式[20]中与KMAC一起使用,MAC长度为8字节。要认证的数据报应由发送序列计数器” – user980045

+1

前缀“。像这样做: Mac mac = Mac.getInstance(“aescmac”,new BouncyCastleProvider()); mac.init(k_mac); byte [] tooLong = mac.doFinal(tmp); byte [] ret = new byte [8]; // TODO找到更好的方法,也许算法参数规范 System.arraycopy(tooLong,0,ret,0,8); return ret; 但这种方式不是很好。 – user980045

+0

@ user980045您链接的文档对NIST SP_800-38B有参考文献[20]。看看这里的建议; http://csrc.nist.gov/publications/nistpubs/800-38B/SP_800-38B.pdf,你会在附录D中看到'对于AES算法的例子,Tlen是128'。它还提到TDEA(三重DES)会给你一个64的MAC长度。所以看起来国际民航组织在他们的规范中有一个错误。当他们表明明显缺乏对基本加密基础知识的理解时,我也非常担心有人在从事电子护照软件工作。 – Qwerky

3

根据NIST 800-38B第6.2章(MAC生成)的第7步,生成一个N位MAC,您只需取N个最高有效位。附录A.2讨论了使用缩短的MAC的后果。