对称双向字符串算法?

时间:2009-07-21 18:12:52

标签: algorithm string

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

例如: 让我们考虑我有字母“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或者洗牌阵列是不够的。但是,我不需要任何“真正的”安全性。刚好足够的熵使函数的输出看起来是随机的。弱加密算法受欢迎。

7 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我建议如下。

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

答案 3 :(得分:1)

拿RC4,找些密码,你就完成了。 (不是说这会非常安全。)

答案 4 :(得分:0)

取出字母表中所有排列的集合,将其随机播放,并将集合的前半部分映射到下半部分。当然,大字母不好。 :)

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

答案 5 :(得分:0)

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

最简单的方法之一是基于输入的旋转替换。既然您已经查看了Vigenere密码,那么它应该很容易理解。而不是使密钥是静态的,它取决于前一个字母。也就是说,每次输入通过替换旋转不同的量。

变量旋转满足使每个小变化推向更大变化的条件。请注意,该算法仅推动一个方向的变化,使得朝向末端的变化具有较小的影响。您可以通过两种方式运行算法(从前到后,然后从后到前),以便更改明文的每个字母都可以更改整个字符串。

内部轮换策略忽略了对密钥的需求,当然也失去了大部分加密安全性。但是,它在上下文中是有意义的,因为你的目标是熵而不是安全性。

答案 6 :(得分:0)

您可以使用 Format-preserving encryption 解决此问题。

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