2013-03-03 111 views
0

我有一个字母数字字符串,其长度为11,需要被模糊化,其中模糊字符串应该满足以下条件:
- 它应该保持在11个字符的长度。
- 它应该仅由字母数字字符组成(即它可以由10位+26位小写字母+26位大写字母组成)。
- 应该有一种去混淆原始字符串的方法。如何混淆11个字符的字符串?

请注意,我不需要混淆我的整个代码,只需一次一个字符串。
- 核心Java有没有办法做到这一点?
- 我将不胜感激任何帮助,首选的例子,链接到一个例子或指导这样的代码。
- 如果有人知道解决此类问题的第三方软件包,请留下链接。

在此先感谢!


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

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

  • 由于上述原因,我使用了您使用的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个字符的输入字符串并且对于每个字符,我从混洗阵列找到所述模糊字符的指数如下:电流焦炭+ ASCII_ARRAY [当前字符的索引。例如,如果我的输入是'1bS0EMtBbK7',那么对于第一个字符'1',我们执行(1 + 114),这给了我们ASCII值为'1'加上114,这给我们(49 + 114) - > 163。

  • 然后,要找到混洗字符数组中的混淆字符的索引,我执行163模数组长度并获取该索引处的字符。

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

+5

你用rot13吗?混淆的目标是什么? – 2013-03-03 07:52:51

+0

混淆的目标是“隐藏”代表连续生成的ID的原始字符串;即如果当前字符串是'1bS0EMtBbK5',那么下一个将是'1bS0EMtBbK6';连续的一代不在我的控制之下。什么是rot13? – boomboom 2013-03-03 08:04:07

+0

原始字符串中允许使用什么字符集? – 2013-03-03 08:04:09

回答

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数组进行洗牌。使用伪随机数生成器来执行随机播放并记住种子,以便您可以执行完全相同的随机播放以进行反混淆处理。随着一个很好的随机播放,你可能会放弃随机标记的东西,只是使用相同的常量移动每个字符。

要反混淆,你只需要向后移动。另见维基百科上的Caesar cipherROT13

+0

这会使字符串的连续性非常明显 – 2013-03-03 08:07:48

+0

@zoul我明白这个想法,但是你的意思是'那么你必须将随机标记存储在代码中'?你的意思是说,对于每一个我混淆的字符串,我需要将随机标记保存在某个地方?顺便说一句,你有偶然的代码示例?另一个问题:如果我将洗牌用于轮班的阵列,我该如何执行反混淆?谢谢 !!! – boomboom 2013-03-03 08:16:02

+0

随机标记是模糊处理方案的一个关键,适用于您的应用程序。我会再增加一个例子来说明这一点。 – zoul 2013-03-03 08:18:17

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的列表可能不可行。

+0

我很欣赏你的答案,但我不明白......算法和英语对我来说太复杂了:)再次感谢你的努力! – boomboom 2013-03-03 09:40:51