短(6位)加密密钥哈希

时间:2012-04-10 12:17:43

标签: encryption cryptography hash

我必须实现一个简单的散列算法。

输入数据:

  • 值(16位整数)。
  • 钥匙(任何长度)。

输出数据:

  • 6位哈希(编号0-63)。

要求:

  • 如果您只有输入值而不是键,则实际上不可能预测哈希值。更具体:如果我知道hash(x)for x< M,在不知道密钥的情况下很难预测散列(M)。

可能的解决方案:

  1. 将完整映射保留为密钥。所以密钥长度为2 ^ 16 * 6位。这对我来说太长了。
  2. 线性代码。 Key是生成矩阵。它的长度是16 * 6。但是使用几个已知的哈希值很容易找到生成矩阵。
  3. 还有其他可能吗?

2 个答案:

答案 0 :(得分:5)

HMAC似乎就是你想要的。因此,您可以使用基于SHA的HMAC并仅使用生成的哈希的子字符串。这应该是相对安全的,因为加密哈希的位应尽可能独立且不可预测。

根据您的环境,这可能需要花费太多的处理时间,因此您可能必须选择更简单的哈希方案来构建您的HMAC。

原文回答评论中的讨论基于:

由于您无论如何都可以忘记加密属性(通过对5位散列的暴力攻击发现冲突很简单),您可以使用CRC或汉明码等内容并免费获取错误检测

答案 1 :(得分:1)

Mensi建议使用截断的HMAC是一个很好的建议,但是如果您确实遇到了一个高度受限制的系统并想要更快或更简单的东西,那么您可以选择任何block cipher,加密您的使用它的16位值(填充到一个完整的块)并将结果截断为6位。

与计算pseudorandom function的HMAC不同,块密码是pseudorandom permutation - 每个输入都映射到不同的输出。但是,当你丢弃除了6位的分组密码输出之外,剩下的东西看起来非常像伪随机函数。对重复输出会有一个非常微小的偏差,但是(假设分组密码的块大小远大于6位,应该是这样),它将是如此之小,以至于只有不可检测的。

非常低端系统的良好分组密码选择可能是TEA或其后继者XTEAXXTEA。虽然对这些密码有一些已知的攻击,但它们都需要比您的应用程序更加广泛的密码访问。