2017-03-09 38 views
-1

我試圖製作一個程序,即使用Vigenere的密碼。每第三個字母都是錯的。有人可以給我一個提示嗎?感謝您的幫助。實現一個使用Vigenère密碼加密消息的程序,C

#include <stdio.h> 
#include <cs50.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h> 


int main(int argc, string argv[]) 
{ 

int n = 0; 
int j = 0; 
int p; 
int l; 
int x = 0; 


if(argc != 2) 
{ 
    printf("missing command-line argument\n"); 
    return 1; 
} else 
{ 
    printf("plaintext: "); 
}  

string text = get_string(); 
string key = (argv[1]); 

printf("ciphertext: "); 


for (j = 0, x = 0, n = strlen(text); j < n; j++) 
{ 

    p = (((text[j] - 65) + ((key[x] - 65) % strlen(key))) % 26) + 65; 
    l = (((text[j] - 97) + ((key[x] - 97) % strlen(key))) % 26) + 97; 

if(isalpha(text[j])) 
{ 
    if(isupper (text[j])) 
    { 
    printf("%c", p); 
    x++; 
    } 
    if(islower (text[j])) 
    { 
    printf("%c", l); 
    x++; 
    } 
}else 
{ 
    printf("%c", text[j]); 
} 
if(x == strlen(key)) 
{ 
    x = 0; 
} 
} 
printf("\n"); 
return 0; 
} 

如果int p,int l錯誤或者是其他問題,我無法確定。

聽到的是輸入/輸出exempel

:) 「一」 「一個」 使用 「a」 作爲關鍵字

加密:(加密 「barfoo」 爲 「caqgon」 使用 「baz」 的作爲關鍵字 \預期的輸出,但不是 「密文:casgop \ n」 個

:(加密 「BaRFoo」 爲 「CaQGon」 使用 「巴茲」 作爲關鍵字 \預期的輸出,但不是 「密文:CaSGoo \ n」 個

:(使用「CAQGON」加密「BARFOO」 「BAZ」 作爲關鍵字 \預期的輸出,而不是 「密文:CASGOP \ n」 個

:(加密爲 「xoqmd $!?」 使用 「巴茲」 作爲關鍵字 \預期的輸出, 「世界$!?」但不是 「密文:xosmd $ \ n嗎?」

:(加密 「的世界裏,打個招呼!」 爲使用 「巴茲」 作爲關鍵字 \預期的輸出,而不是「密文 「xoqmd,RBY gflkp!」: \ n「

+0

您提供什麼輸入以及您期望輸出什麼?代碼也可以做更好的縮進,因爲它不是可讀的。 –

+0

@ChrisTurner我的猜測是作爲參數傳遞的鍵(argv [1])是一個由3個字符組成的字符串。 acipi9嘗試使用if(x == strlen(key)+1) –

+0

@ J.A.I.L。最好有實際的輸入/輸出示例比猜測:) –

回答

0

查看密碼的維基百科描述,打破數學,你有17(R)+ 25(Z)mod 26,它是16(Q)......所以基本上用Z加密任何字母會得到你之前的R爲Q的字母。

但是你的代碼並沒有這樣做 - 它在錯誤的地方有一個虛假的「%strlen(key)」,這就是爲什麼你認爲它應該是S.你想要在key的索引內像這樣,因此你可以溝變量x

p = (((text[j] - 'A') + (key[j % strlen(key)] - 'A')) % 26) + 'A'; 
l = (((text[j] - 'a') + (key[j % strlen(key)] - 'a')) % 26) + 'a'; 

而且,你會發現我換成65 & 97字符,使代碼更大量的可讀性。

+0

它幫助小寫 – acipi9

+0

大寫字母是./vigenere ABCDEFGHIJKLMNOPQRSTUVWXYZ 明文:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ciphertext ciphertext:[\]^_'aHIJKLMNOPQRSTUVWXYZ [\]^_'aHIJKLMNOPQRSTU – acipi9

+0

是的,這是因爲如果您的密鑰與您的明文不同,它會得到每個等式的一半錯誤 - 密碼不是真正爲混合大小寫文本設計。但它很容易修復 - 只需分別計算每個字母在密鑰和明文中的含義,然後對結果進行數學運算即可。 –