C中的Vigenère密码,如何仅在字母字符上移动关键字

Posted

技术标签:

【中文标题】C中的Vigenère密码,如何仅在字母字符上移动关键字【英文标题】:Vigenère cipher in C, how to shift keyword only on alpha chars 【发布时间】:2014-04-04 12:34:47 【问题描述】:

我正在尝试为我本周的问题集制作一个 Vigenère 加密代码,我几乎完成了。我有一个小问题,我不能让关键字 char 只在字母字符上移动这是我的代码,我无法跟踪问题。

GetString() 由库实现(类似于 scanf)和字符串 typedef 也

int main(int argc, string argv[])

    string keyWord;      
    if( argc != 2  )
    
        printf("Wrong Argument");
        return 1;            
    
    else
    
        keyWord = argv[1]; 

        //check if argument is 
        //only alphabetical characters
        for(int i = 0; i < strlen(keyWord); i++)     
        
            char c = keyWord[i];
            if( !isalpha(c) )
            
                printf("Your Keyword Must Contain Only alphabetical characters\n");
                return 1;
                                                
        
    

    string plainText = GetString();       

    for(int i = 0,j = 0; i < strlen(plainText); i++,j++) 
                            
        if(j >= strlen(keyWord))
            j = 0;                

        char c = plainText[i];
        int keyWordWrapper;
        char keyC;                                  

        if(isalpha(c))
                                 
                keyWordWrapper = j % strlen(keyWord);
                keyC = keyWord[keyWordWrapper];
                int key;
                tolower(c);

                if(islower(keyC))
                 key = keyC - 'a';

                if(isupper(keyC))
                 key = keyC - 'A';                                         
                c = (c - 'a'  + key) % 26 + 'a'; 
             
        printf("%c",c);                      
    

printf("\n");
return 0;

【问题讨论】:

tolower(c); --> c=tolower(c); 哦,谢谢,我没看到……那么降低后的情况如何维护?我的意思是在prinf中什么是上保持上,什么下保持下,但这不是我的主要问题,这段代码的问题是它没有忽略空间 【参考方案1】:

你可以这样做

    //to skip the spaces
    if(c==32)
      
         j--;
         continue;         
      

    char c = plainText[i];
    int keyWordWrapper;
    char keyC;       
    if(isalpha(c))
                             
            keyWordWrapper = j % strlen(keyWord);
            keyC = keyWord[keyWordWrapper];
            int key;
            tolower(c);

            if(islower(keyC))
            
               key = keyC - 'a';
               c = (c - 'a'  + key) % 26 + 'a'; 
            
            if(isupper(keyC))
            
              key = keyC - 'A';                                         
              c = (c - 'A'  + key) % 26 + 'A'; 
            
         

【讨论】:

那么继续做什么?忽略后面的代码进入下一个循环?这是一个错误的答案... 在循环开始后放入if语句,它不会跳过keyC并忽略空格,还在新的if块中添加了j--;。希望有帮助。

以上是关于C中的Vigenère密码,如何仅在字母字符上移动关键字的主要内容,如果未能解决你的问题,请参考以下文章

编码 Vigenère 密码时 c 中的分段错误

Vigenère 密码,C 中的问题

[字符串][NOIP2012]Vigenère密码

如何让我的 Vigenère 密码处理消息中的空格?

维吉尼亚密码(Vigenère cipher)

PHP 中的 Vigenère 表