C中的Vigenere Cipher:不完整加密

时间:2014-06-07 10:05:49

标签: c loops encryption cs50 vigenere

Vigenere Cipher的一般解释:

Vigenere Cipher是一种类似于Caesar Cipher的加密方法。该密码接受一个单词作为参数,并将该单词的字母解释如下 - a为0,b为1,c为2,依此类推。

所以,如果你的输入键是abc并且你想要类似"你好"要加密,输出将需要保持相同,我移动1个位置,h移动2个位置,e再次保持相同(因为它移位0),l移位1个位置,另一个移位1 2等等。

基本思想是每个字母都会移动参数中相应的字母,并忽略空格和其他标点符号。如果参数比消息短(在大多数情况下是这样),则参数只是循环消息。


我的问题:

我的消息刚刚被Vignere Cipher的第一个字母加密。

例如,./vc bc ----> message: ABCDE ABCDE变为BCDEF BCDEF。换句话说,整个消息只是被b的值移动,而它应该被移动bc的值(第一个字母表为+1,其他字母表为+2)。

我不明白为什么会发生这种情况,尽管它处于循环中。

代码:

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

int main(int argc, string argv[])
{
    string word = argv[1];
    int i = 0;
    int j = 0;

    if (argc != 2 || isalpha(word[j]) == false)
    {
        printf("Please enter a valid command line argument! \n");
        return 1;
    }

    else if (isalpha(word[j]))
    {
        printf("Message: "); 
        string message = GetString();

        for (int n = strlen(message); i < n; i++)
        {
               int plaintext = message[i];
               int ciphertext = word[j]; 
               int uppcb = (plaintext - 65 + ciphertext - 65);
               int upcipher1 = (uppcb) % 26;
               int uplc = (plaintext - 65 + ciphertext - 97);
               int upcipher2 = (uplc) % 26;
               int lopcb = (plaintext - 97 + ciphertext - 97);
               int locipher1 = (lopcb) % 26;
               int lolp = (plaintext - 97 + ciphertext - 65);
               int locipher2 = (lolp) % 26;

                if (isupper(word[j]) && isupper(message[i])) 
                {
                    j = (j+1)%strlen(word);
                    int upcode = (upcipher1 + 65); 
                    printf("%c", upcode);
                }
                else if (isupper(message[i]) && islower(word[j]))
                {
                    j = (j+1)%strlen(word);
                    int upcode1 = (upcipher2 + 65);
                    printf("%c", upcode1);
                }
                else if (islower(message[i]) && islower(word[j]))
                {
                    j = (j+1)%strlen(word);
                    int locode = (locipher1 + 97); 
                    printf("%c", locode);
                }
                else if (islower(message[i]) && isupper(word[j]))
                {
                    j = (j+1)%strlen(word);
                    int locode1 = (locipher2 +97);
                    printf("%c", locode1);
                }
                else 
                {
                    printf("%c", message[i]);
                }          
        }
        printf("\n");     
    }

}

0 个答案:

没有答案