algorithm - 整数的对称双射算法

标签 algorithm encryption-symmetric block-cipher bijection

我需要一种算法,可以将 32 位有符号整数一对一映射(即无冲突)到另一个 32 位有符号整数。

我真正关心的是足够的熵,以至于函数的输出看起来是随机的。基本上,我正在寻找一种类似于 XOR Cipher 的密码,但它可以生成看起来更随意的输出。安全不是我真正关心的问题,尽管默默无闻才是。

为澄清目的编辑:

  1. 算法必须是对称的,这样我就可以在没有 key 对的情况下反转操作。
  2. 算法必须是双射的,每个 32 位输入数字必须生成一个 32 位唯一数字。
  3. 函数的输出必须足够隐蔽,仅向输入添加一个应该会对输出产生很大影响。

示例预期结果:

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

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

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

最佳答案

使用任何 32 位分组密码!根据定义,分组密码以可逆方式将其范围内的每个可能输入值映射到唯一输出值,并且根据设计,如果没有 key ,很难确定任何给定值将映射到什么。只需选择一个 key ,如果安全性或模糊性很重要,请将其保密,然后使用密码作为您的转换。

要将此想法扩展到非 2 的幂范围,请参阅我在 Secure Permutations with Block Ciphers 上的帖子.

解决您的具体问题:

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

关于algorithm - 整数的对称双射算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3131193/

相关文章:

algorithm - 高效的多选算法

algorithm - 小数据 block 的良好压缩算法? (大小约2k)

c - 如何在编码和解码时正确处理文件?

java - "NoPadding"参数在 Cipher 类中到底有什么作用?

java - 无法解密在webcrypto api中加密的java数据

遍历项目列表的算法(存储在用户播放歌曲历史中的歌曲)

algorithm - 8方向寻路算法

gnupg - gpg2中的gpg-agent

encryption - 初始化向量(四)——更新频率

java - 如何在java中管理 key