2

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

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

3 回答 3

3

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

加密:

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

解密:

  1. 将 20 位数字转换为其二进制 64 位表示。
  2. 使用分组密码算法进行解密。
  3. 将 64 位转换为其 20 位表示。左边 4 位必须是0,剩下 16 位。
于 2013-06-02T19:32:57.430 回答
3

简单且安全性很低:添加一些东西,然后将这个数字与另一个大小相似的数字进行异或。只有在没有人可以访问源代码的情况下才可行。任何有权访问该程序(即使没有源代码)并且可以使用几个样本(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;
于 2013-06-02T17:22:00.197 回答
1

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

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

于 2013-06-03T18:00:08.820 回答