在' De-Vigenere'中使用模运算符的负数。程序

时间:2016-06-16 07:33:48

标签: c encryption vigenere

我正在制作一个解密vigenere密码的程序。用户只能输入字母键。

for (int i = 0, counter = strlen(text); i < counter; i++)
    {
        // prints non-alphabetical characters straight away
        if (!isalpha(text[i]))
        {
            printf("%c", text[i]);
        }

        else
        {
            // for index of key
            index = meta % strlen(key);

            if (islower(text[i]))
            {
                // separate cases depending upon case of key
                if (islower(key[index]))
                {
                    printf("%c", (((text[i] - 97) - (key[index] - 97)) % 26) + 97);
                }
                else
                {
                    printf("%c", (((text[i] - 97) - (key[index] - 65)) % 26) + 97);
                }
            }

            else
            {
                if (islower(key[index]))
                {
                    printf("%d", (((text[i] - 65) - (key[index] - 97)) % 26) + 65); 
                }
                else
                {
                    printf("%c", (((text[i] - 65) - (key[index] - 65)) % 26) + 65);
                }
            }
            // incrementing for next key alphabet
            meta++;
        }

的V @ genere:

  • 输入:MyName

  • key:qwerty

  • 输出:CuRrfc

De Vigenere:

  • 输入:CuRrfc
  • 键:QWERTY
  • 预期输出:MyName
  • 给定输出:3_NaSK

我该如何解决?

1 个答案:

答案 0 :(得分:1)

问题在于模数运算符处理负数的方式。

对于某些字符,您获得负值,然后模数运算返回负值。您想要一个[0,25]范围内的值。

你可以在取模数之前加26来修复它。

                printf("%c", (((text[i] - 97) - (key[index] - 97)) % 26) + 97);

会变成

                printf("%c", (((text[i] - 97) - (key[index] - 97) + 26) % 26) + 97);

以相同的方式更改所有四行。