这是一个问题,我正在尝试为其创建最佳解决方案。我在 [0 ... N] 的范围内有一组有限的非负整数。我需要能够将此集合中的每个数字表示为字符串,并能够将此字符串向后转换为原始数字。所以这应该是一个双向函数。
其他要求是:
对于第1页& p.2显而易见的解决方案是使用类似Base64(或任何BaseXXX以适合所有值)的表示法。但是我们能否以最小的额外努力适应p.3?常识告诉我,我还需要BaseXXX值的双射“String< - > String”函数。有什么建议? 或者可能有比BaseXXX更好的东西来满足所有3个要求?
答案 0 :(得分:1)
如果你不需要这个太安全,你可以在BaseXXX中编码后使用一个简单的对称密码。例如,您可以选择整数的键序列[n 1,n 2,n 3 ...],然后使用Vigenere cipher。
密码背后的基本思想很简单 - 将每个字符C编码为C + K(mod 26),其中K是密钥中的元素。随着时间的推移,只需从密钥中获取下一个字符的下一个数字,一旦用完密钥中的值就会回滚。
这里有两个选项:您可以先将数字转换为baseXXX中的字符串然后加密,或者您可以使用相同的想法将每个数字加密为单个字符。在这种情况下,您可能希望将其从mod 26
更改为mod N + 1
。
想想看,一个更简单的选择就是只需xor
来自键和值的元素。 (与使用Vigenere公式相反。)我认为这对于混淆也是有效的。
答案 1 :(得分:1)
这种方法符合要求1-3,但它的计算成本可能太高了:
p > N+2
,而不是更大的g
modulo p
,即模数p
为p-1
的乘法顺序的数字0 <= k <= N
,让enc(k) = min {j > 0 : g^j == (k+2) (mod p)}
f(k) = enc(k).toString()
答案 2 :(得分:1)
构建一个长度为M
的表。此表应将数字0到M-1
映射到具有随机排序的不同短字符串。将整数表示为基数 - M
数字,使用表中的字符串表示数字中的数字。解码时直接逆转。
使用M=26
,您可以为每个数字使用一个字母。或者取M=256
并为每个数字使用一个字节。
甚至不是一个好的加密方法!
答案 3 :(得分:0)
所以你需要一个混淆原始数字的字符串,但是当str(K)已知时你可以确定str(K + 1)吗?
如何f(x) = (x + a).toString()
只做a
秘密?然后,外部用户无法从x
确定f(x)
,但他们可以确信,如果他们有一个字符串“1234”,例如,对于未知的x
那么“1235”地图到x+1
。
答案 4 :(得分:0)
页。 1和p。 3有点矛盾,也有点模糊。
我建议使用整数的十六进制表示。
17 => 0x11
123123 => 1E0F3