双射“整数< - >字符串”函数

时间:2012-01-12 09:55:52

标签: algorithm bijection

这是一个问题,我正在尝试为其创建最佳解决方案。我在 [0 ... N] 的范围内有一组有限的非负整数。我需要能够将此集合中的每个数字表示为字符串,并能够将此字符串向后转换为原始数字。所以这应该是一个双向函数。

其他要求是:

  1. 数字的字符串表示应至少在某种程度上模糊原始数字。像 f(x)= x.toString()这样的原始解决方案是行不通的。
  2. 字符串长度很重要:越少越好。
  3. 如果知道 K 的字符串表示,我希望猜测 K + 1 的字符串表示是非常重要的(在某种程度上)。
  4. 对于第1页& p.2显而易见的解决方案是使用类似Base64(或任何BaseXXX以适合所有值)的表示法。但是我们能否以最小的额外努力适应p.3?常识告诉我,我还需要BaseXXX值的双射“String< - > String”函数。有什么建议? 或者可能有比BaseXXX更好的东西来满足所有3个要求?

5 个答案:

答案 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,但它的计算成本可能太高了:

  1. 找到一个素数p > N+2,而不是更大的
  2. 找到原始根 g modulo p,即模数pp-1的乘法顺序的数字
  3. 代表0 <= k <= N,让enc(k) = min {j > 0 : g^j == (k+2) (mod p)}
  4. 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