我有一个字母数字字符串,其长度为11,需要进行模糊处理,其中混淆的字符串应满足以下条件:
- 它应保持11个字符长度
- 它应仅由字母数字字符组成(即它可以由10位数字+ 26个小写字母+ 26个大写字母组成)。
- 应该有一种方法可以对原始字符串进行反混淆处理。
请注意,我不需要混淆我的整个代码,一次只需要一个字符串 - 核心Java有没有办法做到这一点? - 我会感谢任何帮助,首选示例,示例链接或此类代码的指南 - 如果有人知道解决此类案件的第三方软件包,请留下链接。
提前致谢!
关于Zoul提出的答案/算法:我实现了一切,目前我对隐藏问题有疑问;这就是我所做的:
我目前使用了Zoul建议的random_stri
的值。这仅用于测试目的;请注意,我做了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, t, d, N, T, A, G, 6, a, D, H, L]
对于所有程序执行,这个混洗数组从现在开始是硬编码和常量。
我循环11-chars输入字符串,对于每个char,我从混洗数组中找到混淆的char的索引,如下所示:current char + ASCII_ARRAY [current char index]。例如,如果我的输入是'1bS0EMtBbK7',那么对于第一个char为'1',我们执行(1 + 114),它给我们ASCII值'1'加114,这给了我们(49 + 114) - > 163。
然后,为了找到混洗字符数组中混淆字符的索引,我执行163模数组长度并获取此索引处的字符。
问题是这些值仍然是连续的;即对于2个连续输入,输出结果也将是连续的!我在这里错过了什么?提前谢谢!
答案 0 :(得分: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以进行反混淆。通过一个很好的随机播放,您可以放弃随机令牌,只需使用相同的常量移动每个字符。
要反渗透,你只需向后移动。另请参阅维基百科上的Caesar cipher和ROT13。
答案 1 :(得分:1)
如果您认为输入字符串等于0到62 ^ 11-1的整数集,那么您真正需要的是该整数集的可逆排列。我建议如下:找到一个与62 ^ 11互质的数字p。然后找到q,p的Modular multiplicative inverse,即找到q使得p * q = 1(mod 62 ^ 11)。现在,混淆,乘以p(mod 62 ^ 11)。要进行反混淆,请乘以q(mod 62 ^ 11)。
将此与zoul在他的答案中建议的每个字符随机生成的旋转相结合,你将得到一系列字符串,这些字符串对于普通观察者来说看起来几乎是随机的,但是可以很容易地转换回有序的输入序列。
我不知道是否存在可逆地置换整数序列的加密安全方法,而不是生成和存储完整的随机排列,这对于大小为62 ^ 11的列表可能是不可行的。