2013-03-03 109 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