1
38
考虑到这个问题,没有一个答案显得特别有用。我也遇到了同样的问题,需要一个简单的、可逆的散列,而不是出于安全目的,于是决定进行位重定位。它很简单,很快,而且不需要知道任何布尔数学或crypo算法或任何其他需要实际思考的东西。 最简单的方法可能是将一半的位向左移动,另一半向右移动:
这是可逆的,在hash(hash(n))=n中,并且具有非序列对{n,m},n<m,其中hash(m)<hash(n)。 为了获得一个看起来不那么顺序的实现,您可能还需要考虑从[msb,z,…,a,lsb]到[msb,lsb,z,a,…]或[lsb,msb,a,z,…]的隔行重新排序,或者您认为的任何其他重定位都为您处理的数字提供了一个适当的非顺序序列。 (上面的函数对于32位的数字是安全的,较大的数字保证会导致冲突,并且需要更多的位掩码覆盖来防止问题。也就是说,对于任何非安全uid,32位通常都足够了)。 也可以看看 multiplicative inverse 下面是安迪·海登的回答。 |
2
16
你要的是什么 是 加密。在其基本操作模式ECB中的分组密码,可逆地将输入块映射到相同大小的输出块上。输入和输出块可以解释为数字。 例如,AES是128位分组密码,因此它将输入的128位数字映射到输出的128位数字。如果128位对于您的目的来说足够好,那么您可以简单地将输入的数字填充到128位,用AES转换单个块,然后将输出格式化为128位数字。 如果128位太大,可以使用64位分组密码,如3DES、IDEA或Blowfish。 欧洲央行的模式被认为是软弱的,但它的软弱 是 假设为需求的约束(即,映射是“确定性的”)。这是一个弱点,因为一旦攻击者观察到123映射到9874362483910978,从那时起,只要她看到后者,她就知道明文是123。攻击者可以执行频率分析和/或建立已知明文/密文对的字典。 |
3
14
另一个简单的解决方案是 multiplicative inverses (see Eri Clippert's blog) :
我们取一个大数,例如4000000000和一个大的副素数,例如387420489:
我们首先用
现在,我们可以定义反比:
注:这个答案计算速度快,适用于4000000000以下的数字,如果需要处理较大的数字,请选择足够大的数字(和另一个协素数)。 你可能想用十六进制来做这个(来装入int):
如果你选择一个相对较大的副素数,那么这看起来是随机的,是非连续的,而且计算也很快。 |
4
3
基本上,您正在寻找双向加密,并且可能使用
你有很多选择:
下面是一个例子:“ Simple insecure two-way "obfuscation" for C# 你在看什么语言?如果是.NET,那么看看加密名称空间中的一些想法。 |
5
3
为什么不用一个很长的数字来表示异或呢? 容易的。快。可逆。 或者,如果这不需要非常安全,可以从基数10转换为一些较小的基数(比如基数8或基数4,具体取决于您希望数字的长度)。 |
July · 如何定义数字间隔,然后四舍五入 1 年前 |
user026 · 如何根据特定窗口的平均值(行数)创建新列? 1 年前 |
Ashok Shrestha · 需要追踪特定的颜色线并获取坐标 1 年前 |
Nicote Ool · 在FastApi和Vue3中获得422 1 年前 |
Abdulaziz · 如何对集合内的列表进行排序[重复] 1 年前 |
asmgx · 为什么合并数据帧不能按照python中的预期方式工作 1 年前 |