【问题标题】:Problem using modulo with negative numbers in decryption program在解密程序中使用带负数的模的问题
【发布时间】:2011-06-17 11:53:30
【问题描述】:

我对 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 个字符的模方法不起作用,就像减去 5 的 k 一样从a(即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++;
    }

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

【问题讨论】:

    标签: c encryption


    【解决方案1】:

    在 C99 之前的 C 中,% 对负数的行为是实现定义的。从 C99 开始,它已被定义,但不会做你想做的事。

    最简单的方法是:

    ((asciinum + 26) % 26)
    

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

    【讨论】:

      【解决方案2】:

      不要使用asciinum % 26,而是使用(asciinum + 26) % 26,这将让您对正数使用模数,但每次循环都会产生额外的加法。

      【讨论】:

        猜你喜欢
        • 2022-01-01
        • 1970-01-01
        • 2020-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-06
        • 2019-02-01
        相关资源
        最近更新 更多