Vigenere密码[关闭]

Posted

技术标签:

【中文标题】Vigenere密码[关闭]【英文标题】:Vigenere Cipher [closed] 【发布时间】:2016-08-02 18:07:04 【问题描述】:

我在运行以下为 vigenere cipher 设计的代码时遇到了问题。即使经过彻底检查,我也无法调试问题。它显示错误:被服务器杀死。请帮助。

 /**
 * 
 * vigenere.c
 * 
 * Abhishek kumar
 * encrypts entered string using vigenere cipher
 * */
 #include <stdio.h>
 #include <stdlib.h>
 #include <cs50.h>
 #include <ctype.h>
 #include <string.h>

 int main(int argc, string argv[] )
 
    if (argc != 2)
    
        printf("Usage: /home/cs50/pset2/vigenere <keyword>");
        return 1;
    

    if (argc == 2)
       string key = argv[1];
        for(int k = 0,l = strlen(key);k < l; k++)
        
            if(!isalpha(key[k]))
            
                printf("Keyword must only contain letters A-Z and a-z");
                exit(1);
             

        


        string txt = GetString();
        int i = 0,j = 0,c = 0;
        int n = strlen(txt);
        int m = strlen(key);
        while(i < n)
        
            if (isupper(txt[i]))
            
                if(isupper(key[j]))
                
                    c = ((((int) txt[i] - 65 + (int) key[j] -65)%26) + 65);
                    printf("%c", (char) c);
                    i++;
                    j++;
                
                if(islower(key[j]))
                
                    c = ((((int) txt[i] - 65 + (int) key[j] -97)%26) + 65);
                    printf("%c", (char) c);
                    i++;
                    j++;
                

            
            else if (islower(txt[i]))
            
                if(isupper(key[j]))
                
                    c = ((((int) txt[i] - 97 + (int) key[j] -65)%26) + 97);
                    printf("%c", (char) c);
                    i++;
                
                if(islower(key[j]))
                
                    c = ((((int) txt[i] - 97 + (int) key[j] -97)%26) + 97);
                    printf("%c", (char) c);
                    j++;
                


            
            else
            
                printf("%c",txt[i]);
                i++;

            
            if (j == m-1)
            
                j = 0;
            
        




    
 

以下是一些失败的测试用例。

:) vigenere.c exists
:) vigenere.c compiles
:( encrypts "a" as "a" using "a" as keyword
   \ killed by server
:( encrypts "world, say hello!" as "xoqmd, rby gflkp!" using "baz" as keyword
   \ killed by server
:( encrypts "BaRFoo" as "CaQGon" using "BaZ" as keyword
   \ expected output, but not "CGSFpp"
:( encrypts "BARFOO" as "CAQGON" using "BAZ" as keyword
   \ expected output, but not "CASFPO"
:) handles lack of argv[1]
:) handles argc > 2
:) rejects "Hax0r2" as keyword

【问题讨论】:

请添加一些示例输入和所需的输出。 请提问 已编辑,现在结帐.. 【参考方案1】:

islower(txt[i]) 部分,您无法在所有情况下增加ij。在你不增加i 的地方,即键的第一个字符和文本都是小写的地方,你最终会陷入无限循环。

isupper(txt[i]) 部分,您在isupper(key[j]) 部分增加ij,然后输入islower(key[j]) 部分,因为您使用if 而不是else if

对于上述两种情况,将if(islower(key[j])) 更改为else if(islower(key[j])),并在每个内部if 块之后移动j++printf。至于i,将while 更改为for 并增加i 作为其中的一部分。

在检查是否应重置 j 时,您偏离了 1。m-1key 的有效索引,因此您还不想重置。当j == m时这样做。

另外,将 ASCII 代码替换为它们所代表的实际字符,以便更清楚您在做什么。也不需要演员表。

    for (i=0; i < n; i++)
    
        if (isupper(txt[i]))
        
            if(isupper(key[j]))
            
                c = (((txt[i] - 'A' + key[j] -'A')%26) + 'A');
             
            else if(islower(key[j]))
            
                c = (((txt[i] - 'A' + key[j] -'a')%26) + 'A');
            
            printf("%c", c);
            j++;
        
        else if (islower(txt[i]))
        
            if(isupper(key[j]))
            
                c = (((txt[i] - 'a' + key[j] -'A')%26) + 'a');
             
            else if(islower(key[j]))
            
                c = (((txt[i] - 'a' + key[j] -'a')%26) + 'a');
            
            printf("%c", c);
            j++;
        
        else
        
            printf("%c",txt[i]);
        
        if (j == m)
        
            j = 0;
        
    

【讨论】:

以上是关于Vigenere密码[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用修改后的 Vigenere 密码算法,解密不会导致原始输入 [关闭]

Vigenere Cipher - 不给信[关闭]

为啥 Vigenere 密码只能正确加密部分消息?

Python:解码使用仿射密码编码的 Vigenere 密码

尝试加密和解密 vigenere 密码

Vigenere 密码语法错误