我正在寻找一种将整数ID加密/混淆为另一个整数的方法。更确切地说,我需要一个函数int F(int x),这样
int F(int x)
x ^ 0x1234
为了清楚起见,我并不是在寻找强大的加密解决方案,而只是在混淆。想象一下,像URL的Web应用程序example.com/profile/1,example.com/profile/2等型材本身并不是秘密,但我想,以防止随意偷窥到视图/读取所有配置了一个又一个,所以我宁愿躲在他们身后像example.com/profile/23423,example.com/profile/80980234等等。虽然数据库存储的令牌可以很轻松地完成这项工作,我很好奇是否有一些简单的数学方法可用于此。
example.com/profile/1
example.com/profile/2
example.com/profile/23423
example.com/profile/80980234
我不清楚的一个重要要求是结果应该看起来是“随机的”,也就是说,给定一个序列x,x+1,...,x+n,F(x),F(x+1)...F(x+n)不应形成任何形式的进展。
x,x+1,...,x+n
F(x),F(x+1)...F(x+n)
使用2或3个简单方法的某种组合对其进行混淆:
x
y
变长数字系统方法本身并不能满足您的“进步”要求。它总是产生较短的算术级数。但是,当与其他方法结合使用时,它会产生良好的结果。
模块化表示方法也是如此。
这是其中3种方法的C ++代码示例。随机播放位示例可能会使用一些不同的掩码和距离,以使其更加不可预测。其他2个示例也适用于数量较少的人(仅出于说明目的)。应该扩展它们以正确混淆所有整数值。
// *** Numberic system base: (4, 3, 5) -> (5, 3, 4) // In real life all the bases multiplied should be near 2^32 unsigned y = x/15 + ((x/5)%3)*4 + (x%5)*12; // obfuscate unsigned z = y/12 + ((y/4)%3)*5 + (y%4)*15; // restore // *** Shuffle bits (method used here is described in D.Knuth's vol.4a chapter 7.1.3) const unsigned mask1 = 0x00550055; const unsigned d1 = 7; const unsigned mask2 = 0x0000cccc; const unsigned d2 = 14; // Obfuscate unsigned t = (x ^ (x >> d1)) & mask1; unsigned u = x ^ t ^ (t << d1); t = (u ^ (u >> d2)) & mask2; y = u ^ t ^ (t << d2); // Restore t = (y ^ (y >> d2)) & mask2; u = y ^ t ^ (t << d2); t = (u ^ (u >> d1)) & mask1; z = u ^ t ^ (t << d1); // *** Subset parity t = (x ^ (x >> 1)) & 0x44444444; u = (x ^ (x << 2)) & 0xcccccccc; y = ((x & 0x88888888) >> 3) | (t >> 1) | u; // obfuscate t = ((y & 0x11111111) << 3) | (((y & 0x11111111) << 2) ^ ((y & 0x22222222) << 1)); z = t | ((t >> 2) ^ ((y >> 2) & 0x33333333)); // restore