简单的加密16位数字的方法

3
我们正在寻找一种加密16位数字(可能是10-20位数字)的方法,具有以下要求:
  • 输出也是数字
  • 输出不会翻倍(或大量增加数字位数)
  • 不需要预先存储大量映射表
  • 可以接受中低安全性

4
因为其中一个要求是将哈希输出存储为数字,所以您立即放弃了安全性。此外,“16位数字”让我相信你们正在尝试对信用卡号进行哈希处理?哎呀,这想法很可怕。 - Dan Kanze
@DanKanze - 你能详细解释一下数字问题吗?为什么将某些数字用作输出会构成安全威胁?另外,OP正在询问加密(可逆),而不是哈希(不可逆)。 - Rogach
1
@Rogach 我的意思是输出的摘要非常高风险。可以通过一条确定的排列线路破解。 - Dan Kanze
@Rogach 当然,任何东西都可以表示为数字。但是我们正在讨论数字的加密输出。该输出需要使用“另一个数字”进行加密,因为在添加该约束时可用的加密方法非常有限。至少我所知道的是如此。是否愿意分享其他想法? - Dan Kanze
当然,我正在寻找一种在发票和收据上打印“交易ID”的方法。用户将能够在网站上输入交易ID以获取信用或奖励。因此,我希望对其进行加密,以使其不容易被猜测。 - dazhi
显示剩余6条评论
3个回答

4

简单而且安全性很低:添加一些内容,然后将数字与另一个大小相似的数字进行异或运算。只有在没有人可以访问源代码的情况下才可行。任何有权访问程序(即使没有源代码)并可以使用几个样本(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"。 - Nicholaz
1
反汇编二进制代码仍然会在汇编代码中显示XOR操作。 - Hunter McMillen
另外,您可以运行两次或更多次加密(然后也可以解密两次)。 - Nicholaz
@hunter:是的,获取加密程序将严重降低安全性,肯定经不起有才华的黑客或加密专家超过一小时的攻击。 - Nicholaz

3
我可以想象一个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
@CodesInChaos:你说得对,在这种情况下,可以尝试切换到3 * 32位的块大小(Skip32支持这样一个小的块大小)。这将导致一个20到29位数字的加密算法。 - Christian Ammer

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,它更加安全。
任何适当大小的二进制块都可以表示为十进制数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接