截断GNU Umac32输出长度

时间:2014-05-05 11:42:28

标签: java cryptography aes

我使用名为UMac32的GNU加密类来创建消息验证代码。你可以在这里阅读文档:
http://www.gnu.org/software/gnu-crypto/manual/api/gnu/crypto/mac/UMac32.html

它现在正在运行,但我希望能够获得更短的输出。有一个从名为Imac的接口TRUNCATED_SIZE继承的字段,我认为我可以使用它,但它没有按预期工作。

这是我的代码:

String message = "Hello World!";
String MAC_KEY_MATERIAL = "gnu.crypto.mac.key.material";
String TRUNCATED_SIZE = "gnu.crypto.mac.truncated.size";
String NONCE_MATERIAL = "gnu.crypto.umac.nonce.material";

Map attributes = new HashMap();
attributes.put(MAC_KEY_MATERIAL, PRIVATE_KEY.getBytes());
attributes.put(TRUNCATED_SIZE, 4);
attributes.put(NONCE_MATERIAL, PRIVATE_NONCE.getBytes());

uMac32.init(attributes);

byte[] data = message.getBytes("ASCII");
uMac32.update(data, 0, message.length());
uMac32.digest();

digest()函数我得到一个长度为8的字节数组。

是否可以使用此类获得更短的结果?

提前致谢

1 个答案:

答案 0 :(得分:1)

来自the code of the UMac32 class

for (int i = 0; i < OUTPUT_LEN; i++)
{
    result[i] = (byte) (result[i] ^ pad[i]);
}

其中OUTPUT_LEN被定义为值为8的常量.JavaDoc中定义的UMAC-OUTPUT-LEN不是实现的可配置参数,而是UMAC算法的一个参数(如Perseids已澄清)。 / p>

所以你唯一能做的就是手动截断结果。这实际上是加密声音;哈希和MAC身份验证标记经常被截断,只留下最不重要(最左边)的字节。但是,8字节的标记大约是最小的;任何不足都会降低函数的加密强度。