整数的对称双射算法

Emr*_*ici 32 algorithm encryption-symmetric bijection block-cipher

我需要一种能够将32位有符号整数与另一个32位有符号整数进行一对一映射(即无冲突)的算法.

我真正关心的是足够的熵,因此函数的输出似乎是随机的.基本上我正在寻找类似于XOR Cipher的密码,但它可以生成更多任意外观的输出.虽然默默无闻,但安全并不是我真正关心的问题.

编辑以便澄清:

  1. 算法必须是对称的,这样我就可以在没有密钥对的情况下反转操作.
  2. 该算法必须是双射的,每个32位输入数必须生成一个32位唯一编号.
  3. 函数的输出必须足够模糊,只在输入中添加一个应该对输出产生很大影响.

预期结果示例:

F(100)= 98456
F(101)= -758F
(102)= 10875498
F(103)= 986541
F(104)= 945451245
F(105)= -488554

就像MD5一样,改变一件事可能会改变很多事情.

我正在寻找一个数学函数,所以手动映射整数不是我的解决方案.对于那些提出要求的人来说,算法速度并不是很重要.

Nic*_*son 33

使用任何32位分组密码!根据定义,块密码以可逆的方式将其范围内的每个可能输入值映射到唯一的输出值,并且通过设计,很难确定在没有密钥的情况下任何给定值将映射到什么值.只需选择一个密钥,如果安全或默默无闻,请保密,并使用密码作为转换.

要将此想法扩展到非2次幂范围,请参阅我的有关使用分组密码的安全排列的帖子.

解决您的具体问题:

  1. 该算法确实是对称的.我不确定你的意思是"在没有钥匙对的情况下扭转操作".如果您不想使用密钥,请对随机生成的密钥进行硬编码,并将其视为算法的一部分.
  2. 是的 - 根据定义,分组密码是双射的.
  3. 对.如果不是这样的话,这将不是一个好的密码.

  • 一些可能的密码(排名不分先后):Hasty Pudding cipher、GDES、Simon、Speck、RC5。可能还有更多。 (2认同)

Joh*_*ohn 7

如果您的目标只是获得大致定义大小的看似随机的数字排列,那么还有另一种可能的方法:将数字集减少为素数。

然后您可以使用以下形式的映射

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 大小的一半。


Pet*_*erK 6

我将尝试通过一个更简单的示例来解释我的解决方案,然后可以轻松扩展您的大型示例.

说我有一个4位数.有16个不同的值.看它就像是一个四维立方体:4维立方体http://www.ams.org/featurecolumn/images/january2009/klee8.jpg.

每个顶点代表其中一个数字,每个位代表一个维度.所以它的基本XYZW,其中每个维度只能有0或1的值.现在想象你使用不同的维度顺序.例如XZYW.每个顶点现在改变了它的数量!

您可以针对任意数量的维度执行此操作,只需置换这些维度即可.如果您不担心安全问题,这对您来说可能是一个很好的快速解决方案.另一方面,我不知道输出是否会"模糊"以满足您的需求,当然在完成大量映射后,映射可以反转(根据您的需要,这可能是优势或劣势.)

  • 这不等于简单地将数字的各个位切换到给定的模式吗?无论如何,超立方体都很酷. (4认同)

Bjö*_*örn 5

下面的文章为您提供4或5个映射示例,为您提供功能而不是构建映射集:www.cs.auckland.ac.nz/~john-rugis/pdf/BijectiveMapping.pdf


Mic*_*ter 5

除了生成随机查找表之外,您还可以使用函数组合:

  • 异或
  • 对称位排列(例如移位 16 位,或翻转 0-31 至 31-0,或翻转 0-3 至 3-0、4-7 至 7-4,...)
  • 更多的?