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

附加要求是:

  • 数字的字符串表示形式应至少在某种程度上混淆原始数字。因此,像f(x)= x.toString()这样的原始解决方案将不起作用。
  • 字符串长度很重要:越少越好。
  • 如果人们知道K的字符串表示形式,我希望它在某种程度上能够猜测K + 1的字符串表示形式是不平凡的。

  • 对于p.1和p.2,显而易见的解决方案是使用类似Base64(或适合所有值的BaseXXX)表示法。但是我们能以最少的努力适应p.3吗?常识告诉我,我还需要一个双射的“字符串字符串”函数用于BaseXXX值。有什么建议么?
    或者也许有比BaseXXX更好的东西可以用来满足所有3个要求?

    最佳答案

    如果您不需要太安全,可以在BaseXXX中编码后使用简单的对称密码。例如,您可以选择整数[n₁,n2,n₃...]的键序列,然后使用Vigenere cipher

    密码的基本概念很简单-将每个字符C编码为C + K(mod 26),其中K是 key 中的一个元素。在进行过程中,只需从键中获取下一个字符的下一个数字,然后在键中的值用完后就自动换行。

    这里确实有两个选择:您可以先将数字转换为baseXXX中的字符串,然后进行加密,或者可以使用相同的思想将每个数字加密为单个字符。在这种情况下,您需要将其从mod 26更改为mod N + 1

    想到这一点,一个更简单的选择是仅对键和值中的元素进行xor。 (与使用Vigenere公式相反。)我认为这对于混淆也同样有效。

    09-06 22:50