我们正在寻找一种加密 16 位数字(可能是 10-20 位)的方法,具有以下要求:
- 输出也是一个数字
- 输出不加倍(或大大增加位数)
- 不需要预先存储海量的映射表
- 好的,安全性中等到低
我们正在寻找一种加密 16 位数字(可能是 10-20 位)的方法,具有以下要求:
我可以想象一个 16 位到 20 位的加密算法:
加密:
解密:
0
,剩下 16 位。简单且安全性很低:添加一些东西,然后将这个数字与另一个大小相似的数字进行异或。只有在没有人可以访问源代码的情况下才可行。任何有权访问该程序(即使没有源代码)并且可以使用几个样本(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;
您可能正在查看一个块大小能够容纳多达 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,它更安全。
任何适当大小的二进制块都可以表示为十进制数字。