【问题标题】:Symmetric Bijective String Algorithm?对称双射字符串算法?
【发布时间】:2009-07-21 18:12:51
【问题描述】:

我正在寻找一种可以将一个字符串一对一映射到另一个字符串的算法。 我想要一个给定字母表的算法,我可以执行对称映射函数。

例如: 假设我有字母“A”,“B”,“C”,“D”,“E”,“F”。对于每个 N 字母排列,我想要 F("ABC") = "CEA" 和 F("CEA") = "ABC" 之类的东西。

当然,存在这样的算法。如果您知道一种算法,请发布它的名称,我可以研究它。如果我的要求不够清楚,请告诉我。

提前致谢。

编辑 1: 我应该澄清我想要足够的熵,以便 F("ABC") 等于 "CEA" 和 F("CEA") = "ABC",但我不希望 F("ABD") 等于 "CEF"。请注意两个输入字母是如何保持不变的,而两个对应的输出字母是如何保持不变的?

因此,Caesar Cipher/ROT13 或洗牌阵列是不够的。但是,我不需要任何“真正的”安全性。刚好足够的熵使函数的输出看起来是随机的。欢迎使用弱加密算法。

【问题讨论】:

  • 所以您只是想将字符映射到另一个字符?有点像Ceaser Cipher?
  • 我认为(但也许这只是我)你必须澄清你的问题。据我了解,身份功能满足您的要求,可能并非如此。

标签: algorithm string


【解决方案1】:

只需创建一个包含 2 个字段(一个字母和一个随机数)的对象数组。对数组进行排序。通过随机数。这将创建一个映射,其中字母表中的第 i 个字母现在映射到数组中的第 i 个字母。

【讨论】:

  • 我猜这不是对称的。
【解决方案2】:

如果简单的换位或替换还不够,听起来你想前进到polyalphabetic cipherVigenère cipher 在代码中非常容易实现,但不使用计算机仍然很难破解。

【讨论】:

  • 我喜欢这个...但是,当我更改输入中的一个字母时,输出中只有一个字母会发生变化。我想要一种算法,如果输入中的一个字母发生变化,则输出中的大部分字母都会发生变化。
【解决方案3】:

我建议如下。

对正整数的输入进行密集编码 - 字母大小为 n 且字符串长度为 m,您可以将字符串编码为介于零和 n^m - 1 之间的整数。在您的示例中,这将是范围[0,215]。现在对编码的数字执行一个固定的involution,然后再次解码。

【讨论】:

    【解决方案4】:

    使用 RC4,输入一些密码,就完成了。 (并不是说这会很安全。)

    【讨论】:

    • 加密函数不一定是满射的,所以它们不符合要求。
    • 没错,但更重要的是,加密和解密也不一定是相同的功能(如问题中所述)。对称性指的是键而不是功能。
    • 很好,但我认为 RC4 仍然可以满足 JP 的要求。 :)
    • 很公平。可能比他想的更复杂?
    • 我认为 RC4 行不通。对于非常小的输入(两个字节或更少),输出包含非常少的熵。事实上,如果输入是小输入的差 1,输出将是差 1。它似乎适用于大输入,但我更关心三到六个字节的小输入。所以我不认为它对我有用。不过还是谢谢。
    【解决方案5】:

    获取所有字母表排列的集合,将其随机排列,然后将集合的前半部分映射到后半部分。当然,不适合大字母。 :)

    不,想了想,我忘记了字符重复。也许将输入分成块而不重复字符并将我的建议应用于所有这些块。

    【讨论】:

      【解决方案6】:

      我会因此重述您的问题,并为您提供重述的策略:
      “一种替代密码,其中输入的变化导致输出的更大变化”。
      字符的阻塞是无关紧要的——最后,它只是数字之间的映射。我将在这里谈论字母,但您可以将其扩展到任何 n 个字符的块。

      最简单的方法之一是基于输入的轮换替换。既然您已经看过 Vigenere 密码,它应该很容易理解。与其使密钥成为静态的,不如让它依赖于前一个字母。也就是说,每个输入通过替换轮换不同的数量。

      变量轮换满足让每一个小的变化推到一个更大的变化的条件。请注意,该算法只会将更改推向一个方向,这样最终的更改会产生较小的影响。您可以双向运行算法(从前到后,然后从后到前),这样明文的每个更改的字母都有可能更改整个字符串。

      内部轮换策略消除了对密钥的需求,当然也失去了大部分加密安全性。不过,这在上下文中是有道理的,因为您的目标是熵而不是安全。

      【讨论】:

        【解决方案7】:

        你可以用Format-preserving encryption解决这个问题。

        可以在https://github.com/EVGStudents/FPE.git 下找到一个 Java 库。在那里您可以定义一个正则表达式并加密/解密与该正则表达式匹配的字符串值。

        【讨论】:

          猜你喜欢
          • 2011-03-09
          • 1970-01-01
          • 2017-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多