Encryption 短(6位)加密密钥散列

Encryption 短(6位)加密密钥散列,encryption,cryptography,hash,Encryption,Cryptography,Hash,我必须实现一个简单的哈希算法 输入数据: 值(16位整数) 键(任意长度) 输出数据: 6位散列(数字0-63) 要求: 如果只有输入值而没有键,那么预测散列值几乎是不可能的。更具体地说:如果我知道x

我必须实现一个简单的哈希算法

输入数据:

  • 值(16位整数)
  • 键(任意长度)
输出数据:

  • 6位散列(数字0-63)
要求:

  • 如果只有输入值而没有键,那么预测散列值几乎是不可能的。更具体地说:如果我知道x
可能的解决办法:

  • 将完整映射作为密钥保留。因此,密钥的长度为2^16*6位。我的案子太长了
  • 线性码。键是一个生成器矩阵。它的长度是16*6。但使用几个已知的散列值很容易找到生成器矩阵
  • 还有其他可能性吗?

    A似乎就是你想要的。所以,您可以使用基于SHA的HMAC,只使用结果哈希的子字符串。这应该是相对安全的,因为加密散列的位应该尽可能独立和不可预测

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

    原始答案评论中的讨论基于:


    由于您可以忘记密码属性(通过对5位散列的暴力攻击发现冲突是很平常的),因此您也可以使用CRC或Hamming码之类的代码,免费获得错误检测,但是,如果您正好在一个高度受限的系统上,想要更快或更简单的东西,您可以选择任何一个,用它加密您的16位值(填充到一个完整的块),并将结果截断为6位

    与HMAC不同,HMAC计算a,分组密码是a-每个输入映射到不同的输出。然而,当你扔掉分组密码输出中除六位以外的所有位时,剩下的看起来非常像一个伪随机函数。对于重复输出,会有一个非常小的偏差,但是(假设分组密码的块大小远远大于6位,应该是),它会非常小,以至于几乎无法检测到


    对于非常低端的系统,一个好的分组密码选择可能是或其继承者和。虽然这些密码存在一些已知的攻击,但它们都需要比应用程序中更广泛的密码访问权限。

    CRC不是散列。OP没有说他想要它做什么,但在某些情况下,CRC是哈希表的一个特别差的替代品,比如在哈希表中。@NickJohnson为什么CRC不适合哈希表(除了有更快的方法来获得合适的哈希表)?因为正如您自己指出的,CRC包括冗余,以提供可靠的错误检测,这会影响其分布特征。我的信息论讲座已经过去了一段时间,但纠错码不应该具有类似于散列的属性,因为数据的变化会导致代码发生重大变化,只是冲突很容易找到?@mensi,谢谢你的回答。我的问题不够详细。我已经更正了描述。该算法的主要要求是:对于给定的输入值,几乎不可能预测哈希值。如果我知道X