2012-10-19 76 views
0

我有一個可怕的時間瞭解如何讓包裝使用這些加密程序。我得到了一個凱撒密碼程序來加密和解密,現在我正在使用Vigenere密碼。我有程序工作,但是當我使用一個會導致字母環繞的鍵時,我會得到奇怪的結果。這裏是我使用的代碼:包裝操作問題

int main(int argc, char *argv[]) 
{ 
    char s2[25]; 
    strcpy(s2, argv[1]); 
    printf("Please enter a string of text to be encrypted!\n"); 
    string p = GetString(); 
    for (int i = 0, n = strlen(p); i < n; i++) 
    { 
     if (isupper(p[i])){ 

     char c = (p[i] - 'A' + s2[i]); 
     printf("%c", c); 
     } 
    } 
    printf("\n"); 

} 

如果在命令行中輸入./program BACON,我進入BLAH文本進行加密此代碼將工作。例如,如果我使用./program ZZZZZ作爲關鍵,那麼我會得到各種奇怪的結果,因爲它不會迴繞。我試過使用模運算符,並且將它從我剛剛發佈的代碼中刪除,因爲我仍然無法使用它來包裝它。我剛開始學習編程,所以如果有人能夠詳細解釋我做錯了什麼,我將不勝感激。由於


也許你能幫助我理解數學更好的代碼工作完美,但我一直在試圖弄清楚這一點上一個計算器手動只是爲了看看怎麼回事。這是我到目前爲止有:

./program HHHHH 

KEYLEN應該在我的理解等於5,所以如果我給P [I]「H」的值

keyLen= 5 
p[i]= H //or 72 in ASCII 
int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A'); //sum = (72 - '65') + ([72 % 5] - '65'); 
char c = 'A' + sum%26; // c = 65 + -11 

也許我的數學很遙遠因爲當我按照順序做事情時,我認爲他們應該做sum = negative 63,所以26 mod是-63,這會給我帶來負11.這顯然是不對的,因爲當你加65和負11時,它等於54。如果我將11作爲正整數並加上65,我得到76是ASCII字符「L」,但正確答案是「O」。我顯然做錯了,但我一直在解決方案一段時間,並繼續得出相同的結果....

+0

當你調試你的代碼時你發現了什麼? –

+0

如果(例如)s2是5個字符長,'i'是10,那麼's2 [i]'會是什麼? –

回答

2

在您的程序中有兩個「環繞」問題:

  • 您的信件沒有環繞當鑰匙和當前字母相結合,產生超過26的值,並
  • 你讀過去,當這個詞的長度被加密的密鑰年底超過的長度鍵。

這裏是你如何解決這個問題:複製鑰匙插入s2之後,這樣做:

int keyLen = strlen(s2); 

現在你的循環內做到這一點:

int sum = (p[i] - 'A') + (s2[i % keyLen] - 'A'); // Calculate the sum of key+word 
char c = 'A' + sum%26; // Wrap around at 26, the number of letters in the alphabet 

這將使輸出看起來「正常」。

一旦你找出最後的公式是如何工作的,你應該能夠修改它來解碼這個詞。