在解密程序中使用带负数的模数的问题

时间:2011-06-17 11:53:30

标签: 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++;
    }

我想使用类似的模型来解密(使用相同的密钥),但是当asciinum是负数时,我用来包裹26个字符的模数方法不起作用,就像减去ak为5的情况一样来自(即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++;
    }

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:4)

在C99 C之前,负数的%行为是实现定义的。在C99以后,它是定义的,但没有做你想要的。

最简单的方法是:

((asciinum + 26) % 26)

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

答案 1 :(得分:3)

不使用asciinum % 26,而是使用(asciinum + 26) % 26,这将使您在正数上使用模数,代价是每次循环都需要额外添加。