Vigenere Cipher在C不工作

时间:2015-11-28 06:28:54

标签: c string ascii cs50 vigenere

我正在尝试制作vigenere密码。 有关它的信息在这里:https://www.youtube.com/watch?v=9zASwVoshiM 我的代码似乎不适用于少数情况。 我的代码列在下面请不要给我一个链接如何制作vigenere密码,而是一种方法来修复我的。如果我把密钥作为z,例如它是字母表的值25。现在,如果我将加密文本作为c加为2,则新文本的值为27并且应该显示b但对我来说它并不是。因此,如果该值超过25,它不会显示我想要的其他工作。而对于实际输出示例: ab作为键应该将ca改为cb

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

    int main( int argc , string argv[]){
        //string plaintext;

        string key;
        if(argc != 2){
            printf("Please run the programme again this time using a command line argument!\n");
            return 1;
        }
        key = argv[1];
        int keys[strlen(key)];


        for(int m = 0; m< strlen(key);m++){
            if(isalpha(key[m])==false){
                printf("Re-Run The programme without any symbols.\n");
                return 1;
            }
        }

        for(int b = 0; b < strlen(key);b++){
            if(isupper(key[b]) == false){
                keys[b] = key[b] - 'a';
            }
            else{
                keys[b] = key[b] - 'A';
            }
        }

        //printf("Enter a string which should be encrypted: \n");
        string plaintext = GetString();
        int plength = strlen(plaintext);
        int klength = strlen(key);
        string ciphertext = key;

        for(int u = 0; u<plength;u++){
            if(isalpha(plaintext[u])==false){
                printf("%c",plaintext[u]);
                continue;
            }
            int value = u % klength;

            ciphertext[u] = (keys[value] + plaintext[u]);
            //By the more than 90 I am referring to 'z'
if(ciphertext[u]>90){
                ciphertext[u] = ciphertext[u] ;
            }

            printf("%c",ciphertext[u]);
        }

        printf("\n");
        return 0;
    }

由于 格利扬

1 个答案:

答案 0 :(得分:1)

您正在正确处理密钥中的值,方法是在代码中始终将'A'的代码替换为大写字母,将'a'代码替换为小写字母。它给你:A | a =&gt; 0,B | b =&gt; 1,...,Z | z =&gt; 25.好到这里......

但是在加密时,您只需将此值添加到字符的代码中,而无需随时换行

让我们使用您的示例:key是'z'=&gt; keys中的值25,很好。取字符'c'。它的ASCII(*)代码是0x63或99. 99 + 25 = 124给出ascii表'|'!要正确包装它,您必须确保以任何方式'z'+ 1 =&gt; '一个'。你的代码可能是

        /* test wrapping for lowercase letters */
        if ((islower(plaintext[u]) && (ciphertext[u]>'z')) {
            ciphertext[u] = ciphertext[u] - 'z' + 'a'  - 1;
        }
        /* same for uppercase */
        if ((isupper(plaintext[u]) && (ciphertext[u]>'Z')) {
            ciphertext[u] = ciphertext[u] - 'Z' + 'A'  - 1;
        }

(*)示例假定ASCII代码,因为它现在是最常见的,但代码只假设所有大写字母都是顺序的,所有小写字母也是顺序的,不需要它们的确切值或顺序大小写序列。