2012-01-12 20 views
5

這是一個問題,我試圖創建最佳的解決方案。我在[0 ... N]範圍內有一組有限的非負整數。我需要能夠將此組中的每個數字表示爲一個字符串,並且能夠將此字符串反向轉換爲原始數字。所以這應該是一個雙重功能。雙目「整數<->字符串」函數

附加要求是:

  1. 若干String表示應該混淆原始數至少到一定程度。所以原始解決方案如f(x)= x.toString()將不起作用。
  2. 字符串長度很重要:越少越好。
  3. 如果有人知道K的字符串表示,我希望它是非平凡的(某種程度上)猜測K + 1的字符串表示形式。

對於第1頁第2頁&明顯的解決方案是使用類似Base64編碼(或任何BaseXXX適合所有的值)的符號。但是我們能否以最小的額外努力適應第3頁?常識告訴我,我還需要一個雙射「String < - > String」函數用於BaseXXX值。有什麼建議麼? 或者有比BaseXXX更適合所有3種需求的東西?

+0

右邊的「相關」列表有許多類似的qs,它似乎是 – AakashM 2012-01-12 10:26:17

+0

根據定義,可逆混淆函數是一個「密碼」。不能從enc(k)計算'enc(k + 1)'對於一個好的密碼來說是非常需要的,因爲如果可以的話,一個已知的明文/密碼對將會給你儘可能多的附近明文的密文你有時間計算。那麼我認爲這個問題是,爲了獲得短密文,你是否願意接受一個密碼是「壞」(或者計算代價高昂),無論你是否要使用鹽,以及是否需要一個密碼流模式。 – 2012-01-12 11:45:16

+0

流式傳輸模式非常重要,並不是完全無關緊要的,因爲即使您的密碼使其無法逆轉單個數字的表示形式,攻擊者也可以看到很長的一系列數字並知道一些可能的明文數據分佈可能能夠執行頻率分析,馬爾可夫鏈分析等,以識別特定普通明文值的加密值。有關流模式失敗的示例,請參閱http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29。 – 2012-01-12 11:54:23

回答

0

所以你需要一個混淆原始數字的字符串,但是當str(K)已知時允許一個確定str(K + 1)?

剛剛在做f(x) = (x + a).toString(),其中a是祕密嗎?然後,外部用戶無法確定的x,但他們可以確信,如果他們具有字符串「1234」,例如對於未知的x,則「1235」映射到x+1

+1

他想要相反 - 猜測'x + 1'應該是*平凡*。 – 2012-01-12 10:11:13

+0

啊,完全誤讀 – Chowlett 2012-01-12 14:04:32

1

如果你不需要這是安全,你可以使用一個簡單的對稱密碼在BaseXXX編碼之後。例如,您可以選擇一個鍵序列[n 1,n 2,n 3 ...],然後使用Vigenere cipher

密碼背後的基本思想很簡單 - 將每個字符C編碼爲C + K(mod 26),其中K是密鑰中的元素。隨着時間的推移,只需從下一個字符的鍵中獲取下一個數字,一旦用完了鍵中的值,就會迴繞。

您真的有兩個選擇:您可以先將一個數字轉換爲baseXXX中的一個字符串,然後加密,或者您可以使用相同的想法將每個數字加密爲單個字符。在這種情況下,您需要將其從mod 26更改爲mod N + 1

想想吧,一個更簡單的選項就是xor這個鍵和值的元素。 (與使用Vigenere公式相反)我認爲這同樣適用於混淆。

+0

Vigenere密碼是我的第一個想法。只是試圖讓自信,我沒有跳過一些更瑣碎的東西... – 2012-01-12 10:18:35

+0

嘿,當別人有和我一樣的想法時總是很好:) – 2012-01-12 10:20:34

0

p。 1和p。 3有點矛盾,也有點模糊。

我會建議使用整數的十六進制表示。

17 => 0x11 
123123 => 1E0F3 
+0

爲什麼p.1和p.3是矛盾的?當然你的解決方案違反了p.3。 – 2012-01-12 10:19:55

1

這種方法符合要求1-3,但它也許是有點太耗費計算:

  1. 找到一個素​​,沒有太多大
  2. 找到原根gp,即,其乘法模p的數字是p-1
  3. 對於0 <= k <= N,讓enc(k) = min {j > 0 : g^j == (k+2) (mod p)}
  4. f(k) = enc(k).toString()
1

構建長度M的表。該表應該將數字0到M-1映射到具有隨機排序的不同的短字符串。將整數表示爲基數 - M數字,使用表中的字符串表示數字中的數字。直接翻轉解碼。

隨着M=26,你可以只爲每個數字使用一個字母。或者採取M=256併爲每個數字使用一個字節。

甚至不是一個很好的加密方法!

相關問題