加密16位数的简单方法

时间:2013-06-02 17:13:19

标签: encryption

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

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

3 个答案:

答案 0 :(得分:3)

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

加密:

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

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

答案 1 :(得分:2)

简单且非常低的安全性:添加一些内容,然后将该数字与另一个相似数量的XOR进行异或。只有在没有人可以访问源代码的情况下才可行。任何能够访问该程序(即使没有源代码)并且可以使用一些样本(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;

答案 2 :(得分:1)

您可能正在查看块大小,块大小最多可容纳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。

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