0

我有一个长度为 11 的字母数字字符串,需要对其进行混淆,其中混淆字符串应满足以下条件:
- 它应保持 11 个字符的长度。
- 它只能由字母数字字符组成,(即它可以由 10 个数字 + 26 个小写字母 + 26 个大写字母组成)。
- 应该有一种方法可以对原始字符串进行反混淆。

请注意,我不需要混淆我的整个代码,一次只需要一个字符串。
- 在核心 Java 中有没有办法做到这一点?
- 我将不胜感激任何帮助,首选示例、示例链接或此类代码的指南。
- 如果有人知道解决这种情况的第三方包,那么请留下一个链接。

提前致谢!


关于Zoul提出的答案/算法:我实现了一切,目前我遇到了隐藏问题;这就是我所做的:

  • 我目前使用random_striZoul 建议的值。这仅用于测试目的;请注意,我将其设为 11 长度,因为我不需要 13。

  • 由于上述原因,我使用了您使用的 ASCII 数组值,它再次被截断为 11: [114, 97, 110, 100, 111, 109, 95, 115, 116, 114, 105]

  • 我准备了一个包含所有 62 个可用字符的数组并将其打乱,这给了我以下打乱的字符数组:

[h,P,y,8,o,n,5,V,X,R,2,g,Q,p,Z,E,s,x,b,Y,m,v,u,c,j , 9,
 w, 4, I, l, z, B, U, K, S, f, 7, 1, 0, i, k, M, q, e, r, F, 3, C, J, W, O,吨,
 d、N、T、A、G、6、a、D、H、L]

从现在开始,对于所有程序执行,这个改组的数组都是硬编码的并且是不变的。

  • 我循环了 11 个字符的输入字符串,对于每个字符,我从混洗后的数组中找到混淆字符的索引,如下所示:当前字符 + ASCII_ARRAY [当前字符索引]。例如,如果我的输入是 '1bS0EMtBbK7',那么对于第一个字符 '1',我们执行 (1 + 114),得到 '1' 的 ASCII 值加上 114,得到 (49 + 114) --> 163。

  • 然后,为了在 shuffled chars 数组中找到混淆 char 的索引,我执行 163 模数组长度并获取该索引处的 char。

问题是这些值仍然是连续的;即对于 2 个连续输入,输出结果也将是连续的!我在这里想念什么?提前致谢!

4

2 回答 2

2

由于您需要保持结果的可读性,一个不错的解决方案是在由字符组成的数组中移动a-zA-Z0-9字符。移位将是模数组大小,即。当你到达数组的末尾时,你又回到了开始。这类似于 ROT13。这就是你如何移动一个:

sampletextzZ9
tbnqmfufyuA0a

为了稍微加强混淆,您可以为每个字母使用不同的移位常数。有第二个随机生成的字符串,并将源文本的每个字母移动随机生成的字符串中相应字母的 ASCII 码:

random_string # token
114, 97, 110, 100, 111, 109, 95, 115, 116, 114, 105, 110, 103 # ASCII codes
text # source text to obfuscate

t + 114 = …
e +  97 = …
x + 110 = …
t + 100 = …

然后你必须将随机令牌存储在代码中。这是默默无闻的安全,但在这些情况下通常没问题。随机标记也可以是二进制的,不限于可打印的字符,这会在生成的目标代码中稍微伪装一下。

如果您需要隐藏字符串的连续性,可以将a-zA-Z0-9用于移位的数组打乱。使用伪随机数生成器执行 shuffle 并记住种子,以便您可以执行完全相同的 shuffle 以进行反混淆。通过一个不错的随机播放,您可能会丢弃随机标记的东西,只需使用相同的常量移动每个字符。

要消除混淆,您只需向后移动。另请参阅Wikipedia 上的Caesar cipherROT13

于 2013-03-03T08:04:11.417 回答
1

如果您认为输入字符串等效于从 0 到 62^11-1 的整数集,那么您真正需要的只是该整数集的可逆排列。我建议如下:找到一个与 62^11 互质的数字 p。然后求q,p 的模乘逆,即求q 使得p * q = 1 (mod 62^11)。现在,为了混淆,乘以 p (mod 62^11)。要反混淆,请乘以 q (mod 62^11)。

将此与 zoul 在他的回答中建议的每个字符随机生成的旋转相结合,您最终会得到一系列字符串,这些字符串在普通观察者看来非常随机,但可以很容易地转换回有序输入序列。

我不知道是否存在可逆排列整数序列的加密安全方法,缺少生成和存储完整的随机排列,这对于大小为 62^11 的列表可能不可行。

于 2013-03-03T09:18:17.323 回答