递增和包裹密钥

时间:2016-02-24 09:19:37

标签: c vigenere

 string text = GetString();

//enters length of argv string into q
//converts string argv[1] into string key

string key = argv[1];
int klen = strlen(key);
int kposition = 0;


    //loop through the characters in array "text"
    for (int tposition = 0, n = strlen(text); tposition < n; tposition ++)
    {
        if isupper(key[kposition])
        {
            key[kposition] = ((key[kposition] - 'A') % klen) + 'A';
        }
        else if islower(key[kposition])
        {
            key[kposition] = ((key[kposition] - 'a') % klen) + 'a';
        }

        //determine if character is alphabetical
        if (isalpha(text[tposition])) 
        {

            //encrypt upper case characters
            if (isupper(text[tposition]))
            {
                //modulo magic to loop to beginning of alphabet after 'Z'
                text[tposition] = (((text[tposition] - 'A') + key[kposition]) % 26) + 'A';
                printf("%c", text[tposition]);
            }        
                //encrypt lower case characters
            else
            {
                //modulo magic to loop to beginning of alphabet after 'z'
                text[tposition] = (((text[tposition] - 'a') + key[kposition]) % 26) + 'a';
                printf("%c", text[tposition]);
            }
        }
        //if the input isn't alphabetical, then just print the input (spaces)
        else 
        {
            printf("%c", text[tposition]); 
        }
    kposition ++;

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

}

我遵循了你的建议并使我的变量更具描述性,这有助于我查看代码。

我仍然没有从我的程序中获得正确的输出,尽管它编译并运行正常。

例如,当我跑: vigenere.c -bacon

然后输入:“在公园见我”, 我得到:“Gxzq mr ni kyr frea”, 而不是正确的答案,这是:“Negh zf av huf pcfx”。

所以大/小写正在工作,空间正在工作。问题在于密钥[kposition]的递增。问题的一部分是我不会很好地模仿模数,因此我不清楚模数运算究竟在做什么(除了它给出了两个数的其余部分)。

如何更好地安排我的关键[kposition]增量器?

2 个答案:

答案 0 :(得分:0)

内部for循环,递增j,似乎完全不合适而且不需要我。

你先做的事情看起来已经很不错了:定义两个迭代索引,一个在明文上(i),一个在密钥上(j)。

然后你只需要迭代明文。您使用关键位置i处的字符加密明文位置j处的字符。然后将两个迭代索引增加1,将键索引保持在范围内(例如,使用模数)。

所以,基本上你只需要摆脱内部for循环并添加逻辑以使用外部循环增加j

关于你的代码:建议将它分开一点:编写一个函数来加密单个字符并在循环中使用它。为变量使用更好的名称。 ij不具有描述性。

答案 1 :(得分:0)

要自行调试,请打印出key[kposition]

的值

您需要限制kposition

kposition = (kposition+1)%klen;

并仅修改字母字符。

将当前密钥作为临时密钥,不要重新添加'A',这不能正确地模数26

key[kposition] = ....;

转到

Tkey = ((key[kposition] - 'a') );

Tkey = ((key[kposition] - 'A') );

你没有修改klen,也没有更新密钥。将其他键[kposition]更改为Tkey

#include <stdio.h>
#include <string.h>

int main( int argc, char ** argv)
{
    char  text[] = "Meet me at the park";
    char * key = "bacon";

//enters length of argv string into q
//converts string argv[1] into string key

//string key = argv[1];
int klen = strlen( key);
int kposition = 0;


//loop through the characters in array "text"
for (int tposition = 0, n = strlen( text); tposition < n; tposition++)
{
    unsigned Tkey = 0;
    if( isupper(key[kposition]) )
    {
        Tkey = ((key[kposition] - 'A') );
    }
    else if( islower(key[kposition]) )
    {
        Tkey = ((key[kposition] - 'a') );
    }

    //determine if character is alphabetical
    if (isalpha(text[tposition]))
    {

        //encrypt upper case characters
        if (isupper(text[tposition]))
        {
            //modulo magic to loop to beginning of alphabet after 'Z'
            text[tposition] = (((text[tposition] - 'A') + Tkey) % 26) + 'A';
            kposition = (kposition + 1) % klen;

            printf("%c", text[tposition]);
        }
        //encrypt lower case characters
        else
        {
            //modulo magic to loop to beginning of alphabet after 'z'
            text[tposition] = (((text[tposition] - 'a') + Tkey) % 26) + 'a';
            kposition = (kposition + 1) % klen;
            printf("%c", text[tposition]);
        }
    }
    //if the input isn't alphabetical, then just print the input (spaces)
    else
    {
        printf("%c", text[tposition]);
    }

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