Emr*_*ici 32 algorithm encryption-symmetric bijection block-cipher
我需要一种能够将32位有符号整数与另一个32位有符号整数进行一对一映射(即无冲突)的算法.
我真正关心的是足够的熵,因此函数的输出似乎是随机的.基本上我正在寻找类似于XOR Cipher的密码,但它可以生成更多任意外观的输出.虽然默默无闻,但安全并不是我真正关心的问题.
编辑以便澄清:
预期结果示例:
F(100)= 98456
F(101)= -758F
(102)= 10875498
F(103)= 986541
F(104)= 945451245
F(105)= -488554
就像MD5一样,改变一件事可能会改变很多事情.
我正在寻找一个数学函数,所以手动映射整数不是我的解决方案.对于那些提出要求的人来说,算法速度并不是很重要.
Nic*_*son 33
使用任何32位分组密码!根据定义,块密码以可逆的方式将其范围内的每个可能输入值映射到唯一的输出值,并且通过设计,很难确定在没有密钥的情况下任何给定值将映射到什么值.只需选择一个密钥,如果安全或默默无闻,请保密,并使用密码作为转换.
要将此想法扩展到非2次幂范围,请参阅我的有关使用分组密码的安全排列的帖子.
解决您的具体问题:
如果您的目标只是获得大致定义大小的看似随机的数字排列,那么还有另一种可能的方法:将数字集减少为素数。
然后您可以使用以下形式的映射
f(i) = (i * a + b) % p
如果 p 确实是素数,那么这将是所有 a != 0 和所有 b 的双射。对于较大的 a 和 b 来说,它看起来相当随机。
例如,在我偶然发现这个问题的情况下,我使用 1073741789 作为小于 1 << 30 的数字范围的素数。这使我只丢失 35 个数字,这对我来说很好。
那么我的编码是
((n + 173741789) * 507371178) % 1073741789
Run Code Online (Sandbox Code Playgroud)
解码是
(n * 233233408 + 1073741789 - 173741789) % 1073741789
Run Code Online (Sandbox Code Playgroud)
请注意, 507371178 * 233233408 % 1073741789 == 1,因此这两个数字是模 1073741789 的数字域的逆数(您可以使用扩展欧几里德算法计算出此类字段中的逆数)。
我相当随意地选择了 a 和 b,我只是确保它们大约是 p 大小的一半。
我将尝试通过一个更简单的示例来解释我的解决方案,然后可以轻松扩展您的大型示例.
说我有一个4位数.有16个不同的值.看它就像是一个四维立方体:4维立方体http://www.ams.org/featurecolumn/images/january2009/klee8.jpg.
每个顶点代表其中一个数字,每个位代表一个维度.所以它的基本XYZW,其中每个维度只能有0或1的值.现在想象你使用不同的维度顺序.例如XZYW.每个顶点现在改变了它的数量!
您可以针对任意数量的维度执行此操作,只需置换这些维度即可.如果您不担心安全问题,这对您来说可能是一个很好的快速解决方案.另一方面,我不知道输出是否会"模糊"以满足您的需求,当然在完成大量映射后,映射可以反转(根据您的需要,这可能是优势或劣势.)
除了生成随机查找表之外,您还可以使用函数组合:
| 归档时间: |
|
| 查看次数: |
5128 次 |
| 最近记录: |