【问题标题】:Simple way to encrypt 16 digit number加密16位数字的简单方法
【发布时间】:2013-06-02 17:13:18
【问题描述】:

我们正在寻找一种方法来加密 16 位数字(可能是 10-20 位数字),并满足以下要求:

  • 输出也是一个数字
  • 输出没有翻倍(或大大增加位数)
  • 不需要预先存储大量映射表
  • 可以,安全性中等到低

【问题讨论】:

  • 因为其中一项要求是将哈希输出存储为数字,所以您会立即放弃安全性。此外,“16 位数字”让我相信你们正在尝试散列信用卡号码?哎哟。可怕的想法。
  • @DanKanze - 你能详细说明数字的问题吗?为什么使用某个数字作为输出会构成安全威胁?此外,OP 询问的是加密(可逆),而不是散列(不可逆)。
  • @Rogach 我的意思是输出的摘要风险很高。可以用确定的火线排列破解。
  • @DanKanze - 让我换个说法 - 你的意思是输出中对 small number 的要求很糟糕,对吧?
  • @Rogach 我假设密钥将是一个数字,因为输出的要求是一个数字。

标签: encryption


【解决方案1】:

简单且安全性非常低:添加一些内容,然后将这个数字与另一个大小相似的数字进行异或。只有在没有人可以访问源代码的情况下才可行。任何有权访问该程序(即使没有源代码)并且可以使用几个样本(0、1000、10000、10000000)运行它的人都能够弄清楚。

取决于语言:

   uint64_t theNumber;

   uint64_t cryptbase1= 12345678909876, cryptbase2= 234567890987654;

   // encrypt 
   uint64_t encrypted= (theNumber + cryptbase1) ^ cryptbase2;

   // decrypt 
   uint64_t decrypted= (encrypted ^ cryptbase2) - cryptbase1;

【讨论】:

  • 你也可以在某处加入一个小的乘数,例如"((theNumber + cryptbase1) * 13) ^ cryptbase2" 如果你不介意数字的增加。
  • 反汇编二进制文件仍然会在 ASM 代码中显示 XOR。
  • 另外,您可以运行两次或多次加密(然后也解密两次)。
  • @hunter:是的,访问加密程序会严重降低安全性,那么它肯定无法承受超过一个小时的才华横溢的黑客或加密专家。
【解决方案2】:

我可以想象一个 16 位到 20 位的加密算法:

加密:

  1. 将 16 位数字转换为其二进制表示(需要 54 位)。
  2. 使用具有小块大小的块密码算法(例如,Triple-DES 的块大小为 64 位)来加密 54 位。
  3. 将加密的 64 位转换为其 20 位表示。

解密:

  1. 将 20 位数字转换为其二进制 64 位表示。
  2. 使用分组密码算法进行解密。
  3. 将 64 位转换为其 20 位表示。左边 4 位必须是 0,剩下 16 位。

【讨论】:

  • 这样做的一个问题是它无法加密所有 20 位十进制数字,因为它们最多需要 66 位。
  • @CodesInChaos:你是对的,在这种情况下,可以尝试切换到 3 * 32 位的块大小(Skip32 支持这么小的块大小)。这将导致 20 位到 29 位的加密算法。
【解决方案3】:

您可能正在查看一个块大小能够容纳多达 20 个十进制数字的块密码。您可以使用具有可变块大小的Hasty Pudding cipher,或者您可以滚动您自己的简单Feistel cipher,每个块的位数为偶数。您似乎不需要很高级别的安全性,因此简单的四六轮 Feistel 密码可能会更容易。

我使用简单的 Feistel 密码进行整数排列,F 函数为:

// The F function for the Feistel rounds.
private int F(int num, int round) {
    // XOR with round key.
    num ^= mRoundKeys[round];
    // Square, then XOR the high and low parts.
    num *= num;
    return (num >>> HALF_SHIFT) ^ (num & LOW_16_MASK);
} // end F()

您似乎不需要比这更复杂的东西。如果您想要加密安全,请使用 Hasty Pudding,它更安全。

任何适当大小的二进制块都可以表示为十进制数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 2011-07-12
    • 2013-11-26
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    相关资源
    最近更新 更多