我使用下面的代码获得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为您的帮助
我正在为新的德国身份证实施Secure Messaging。见http://www2.icao.int/en/MRTD/Downloads/Technical%20Reports/Technical%20Report.pdf的第28页。它说:“对于消息认证,AES应该在CMAC模式[20]中与KMAC一起使用,MAC长度为8字节。要认证的数据报应由发送序列计数器” – user980045
前缀“。像这样做: 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
@ 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