在解密程序中使用负数取模时出现问题

sha*_*cal 2 c encryption

我对 C 相当陌生,最近一直致力于制作一个简单的加密/解密程序。我设法很好地进行了加密,但在解密方面遇到了障碍。

相关代码如下:

加密(其中 asciinum 是字母的 ascii 值,k 是要移动的“vigenere”密钥)。

//shifts lowercase letters by key
    if (asciinum >= 97 && asciinum <= 123)
    {
        f = p % keylen;
        k = key[f];
        asciinum = (asciinum - 97) + k;
        asciinum = (asciinum % 26) + 97;
        letterc = (char) asciinum;
        //printf("%c\n", letterc);
        cipher[j] = letterc;
        p++;
    }

    //shifts uppercase letters by key
    if (asciinum >= 65 && asciinum <= 91)
    {
        f = p % keylen;
        k = key[f];
        asciinum = (asciinum - 65) + k;
        asciinum = (asciinum % 26) + 65;
        letterc = (char) asciinum;
        cipher[j] = letterc;
        p++;
    }
Run Code Online (Sandbox Code Playgroud)

我想使用类似的模型来解密(使用相同的密钥),但是当 asciinum 为负数时,我用来环绕 26 个字符的模方法不起作用,就像从 ( 中减去 5 的 ak 的情况一样)即0)。

解密尝试...

    //shifts uppercase letters by key
    if (asciinum >= 65 && asciinum <= 91)
    {
        f = p % keylen;
        k = key[f];
        asciinum = (asciinum - 65) - k;
        asciinum = (asciinum % 26) + 65;
        letterc = (char) asciinum;
        cipher[j] = letterc;
        p++;
    }
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。谢谢!

Oli*_*rth 5

%在 C99 之前的 C 中,负数的行为是实现定义的。从 C99 开始,它被定义了,但并没有做你想要的。

最简单的方法是:

((asciinum + 26) % 26)
Run Code Online (Sandbox Code Playgroud)

假设asciinum永远不会低于-26。