【问题标题】:Reversible "hash" function from 64-bit integer to 64-bit integer从 64 位整数到 64 位整数的可逆“散列”函数
【发布时间】:2015-12-25 18:46:11
【问题描述】:

我需要的是一个 可逆 函数,它将一个 long(64 位整数)转换为另一个 long 数字,其方式是对用户来说似乎是“随机的”(但实际上是确定性的),因此 3 个后续数字被转换为 3 个彼此完全不同的数字。

这很容易做到,但不可逆,但当涉及到这部分时,它变得相当困难。

基本上它和Reversible hash function? 是同一个问题,但我需要超过 2^32 个不同的值。

有什么想法吗?

PS:我打算用 Java 写,但问题本身就很笼统。

【问题讨论】:

  • 是的。只需按照他们对另一个问题所做的操作,但要使用 64 位而不是 32 位。
  • 哈希/校验和是一条单行道。它们被设计为不可逆转的。您正在寻找密码。

标签: algorithm combinations


【解决方案1】:

这些是分组密码的基本要求,通常使用 Feistel 结构实现:https://en.wikipedia.org/wiki/Feistel_cipher

  1. 创建低 32 位的哈希并将其异或到高 32 位
  2. 交换低 32 位和高 32 位
  3. 重复几次。

【讨论】:

    【解决方案2】:

    您可以使用任何 64 位分组密码(例如 DES),对“散列”使用加密,对“反向散列”使用解密。

    【讨论】:

      【解决方案3】:

      如果您不关心安全性并且您只需要在视觉上随机化数字,那么一个非常快速的解决方案是在代码中使用带有固定密钥的简单 XOR。要取回它,只需用这个“秘密”密钥再次 XOR。

      如果您对安全性感兴趣,但没有空间限制,您可以使用更大的密钥(例如滑动异或)甚至OTPHere 是 OTP 的 Java 示例。

      我还应该强调以下两种情况,其中已经提出的使用某些对称加密算法(甚至是简单的 XOR 或 OTP)的解决方案可能无法按预期工作。

      1. 如果我们需要维护号码的符号
      2. 如果我们需要保持数字的大小(例如,我有一个 5 位数字,我想显示它的可逆随机 5 位版本(或至少接近其大小 (4-6))

      为支持上述要求,仅适用于所需位的基于策略的修改 XOR/OTP 可能是一个不错的选择。

      【讨论】:

      • 如果输入数字之间存在一些二进制关系,它根本不是“随机”的。
      • 是的,我完全同意,您可以应用更复杂的策略来增加随机性,但随机性的水平取决于 OP 想要实现的目标。我指出它只是视觉上的随机,而不是按位;否则答案很明显,你需要一个安全的加密算法!
      【解决方案4】:
      static long GMULL = 0x9E3779B97F4A7C15L;
      static long GDIVL = 0xF1DE83E19937733DL;
      static long GADDL = 0x0123456789ABCDEFL;
      public static long golden64fwd(long key) {
          key *= GMULL;
          key += GADDL;
          return key;
      }
      
      public static long golden64rev(long key) {
          key -= GADDL;
          key *= GDIVL;
          return key;
      }
      
      static int GMULI = 0x9E3779B9;
      static int GDIVI = 0x144CBC89;
      static int GADDI = 0x01234567;
      public static int golden32fwd(int key) {
          key *= GMULL;
          key += GADDL;
          return key;        
      }
      
      public static int golden32rev(int key) {
          key -= GADDI;
          key *= GDIVI;
          return key;        
      }
      

      因此,就哈希属性而言,它充其量只是平均水平。 GMUL[I,N] 是 64 位和 32 位的近似黄金比例。 GDIV[I,N] 是各自的乘法逆模 2^size。 GADD[I,N] 是奇数。有些数字是连续的,它们的“散列”值也非常接近。但我怀疑连续三个。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 1970-01-01
        相关资源
        最近更新 更多