2012-12-28 37 views
1

我正在嘗試開發一個程序,該程序對使用Vigenere密碼編碼的消息進行編碼,解碼和打破加密。我陷入困境的地方是破壞信息的加密(沒有密鑰)。我對如何去做這件事有一個想法,但我不知道如何編寫它。我的想法如下:Java中的Vigenere/Polyalphabetic Cipher Decoder/Decrypter/Breaker

該程序將系統地生成潛在的密鑰,長度從1開始到26結尾。密鑰將包含英文字母的字母,並且不區分大小寫。對於每個密鑰長度(從1-26的任何位置),密鑰將填入字母'a',然後程序會檢查密鑰是否正確(我有另一種方法)。如果他們的鑰匙是不正確的,那麼最後位置的字母會旋轉到字母表中的下一個字母。一旦最後一封信經歷了所有26個可能的位置,倒數第二個字母將被旋轉,然後最後一個字母和倒數第二個字母會相應地旋轉,等等等等(一直回到第一個字母[潛在]鍵的字母)。每次生成一個新密鑰時,都會用一個單獨的方法檢查[潛在]密鑰,並在找到正確的密鑰時停止該方法。該密鑰創建進程會去是這樣的:

[starting with keys that are only 1 letter long] 
a 
b 
c 
... 
x 
y 
z 

[now the potential key length becomes two] 
aa 
ab 
ac 
ad 
... 
zw 
zx 
zy 
zz 

[eventually the potential key length becomes 26] 
aaaaaaaaaaaaaaaaaaaaaaaaaa 
aaaaaaaaaaaaaaaaaaaaaaaaab 
aaaaaaaaaaaaaaaaaaaaaaaaac 
aaaaaaaaaaaaaaaaaaaaaaaaad 
... 
zzzzzzzzzzzzzzzzzzzzzzzzzw 
zzzzzzzzzzzzzzzzzzzzzzzzzx 
zzzzzzzzzzzzzzzzzzzzzzzzzy 
zzzzzzzzzzzzzzzzzzzzzzzzzz 

(希望你可以看到有模式)

如果有人或知道如何做到這一點的代碼,或者可以幫助指導通過滿足這是必要的步驟,這將是非常感謝。

謝謝!

+0

我們不會編寫代碼前你。發佈一些具體的問題,並向我們展示一些迄今爲止編寫的代碼。 – MrSmith42

+1

首先,爲什麼這個標籤遞歸(看起來更像是簡單的迭代),第二個強制使用vigenere密碼的蠻力可能不是最好的方法。 – fvu

+0

到目前爲止我沒有任何東西,就像我說的,任何解釋/幫助都會提供幫助。 :) – iphonedev7

回答

1

編輯(現在我已經做了數學)

大約有6個* 10^36個可能你需要遍歷組合 - 最大long值約爲9×10^18 - 一個較小的數字。這就是說,假設你找到了一種優化的方法來迭代你可以產生和比較每秒萬億(10^12)組合的組合(,比你的普通開發者的機器快得多),你可以並將其在100萬臺機器上並行 - 每年檢查(60 * 60 * 24 * 365 * 10^12)* 10^6,或每年檢查約3 * 10^25個組合。

以這樣的速度,它仍然需要約1900億年才能通過所有組合。

我強烈建議您調查另一個替代方案來實現您的目標,而不是嘗試每個單一的密鑰。如果你有一個你想要迭代的鍵的合理大小的子集,我可以想象用一個直接的數字循環來做這樣的事情,這個循環只是將數字轉換爲一個修改過的基數-26爲關鍵。

一些僞代碼:

public void runAlgorithm() { 
    for (int i=startKey; i<endKey; i++) { 
     String key = toBase26(i); 
     testKey(key); 
    } 
} 

使用類似this hexavigesimal converter from wikipediatoBase26的IMPL(下面複製):

public static String toBase26(int number){ 
    number = Math.abs(number); 
    String converted = ""; 
    // Repeatedly divide the number by 26 and convert the 
    // remainder into the appropriate letter. 
    do 
    { 
     int remainder = number % 26; 
     converted = (char)(remainder + 'A') + converted; 
     number = (number - remainder)/26; 
    } while (number > 0); 

    return converted; 
} 
+0

你的解決方案唯一的問題是它產生這樣的輸出:A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q ,R,S,T,U,V,W,X,Y,Z,BA,BB,BC,BD,BE,BF,BG,BH,BI,BJ,BK,BL,BM,BN,BO, ,BQ,BR,BS,BT,BU,BV,BW,BX,BY,BZ,CA,CB,CC,CD,CE,CF,CG,CH,CI,CJ,CK,CL,CM,CN,CO ,CP,CQ,CR,CS,CT,CU,CV,CW,CX,CY,CZ ...在添加另一個字母開始第一個字母離開它應該是(例如,'b'而不是'a '),但除此之外它非常接近。謝謝! – iphonedev7

+0

非常完美,但它應該指向你正確的方向,你可以調整它做你想做的。 – Krease

+0

我正在計算可能的密鑰數量和它的一個巨大的數字(沒有意外),並且我試圖編輯你的代碼以適應我的需求,但似乎沒有任何工作......任何想法? – iphonedev7

相關問題