我是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++;
}
非常感谢任何帮助。谢谢!
答案 0 :(得分:4)
在C99 C之前,负数的%
行为是实现定义的。在C99以后,它是定义的,但没有做你想要的。
最简单的方法是:
((asciinum + 26) % 26)
假设asciinum
永远不会低于-26。
答案 1 :(得分:3)
不使用asciinum % 26
,而是使用(asciinum + 26) % 26
,这将使您在正数上使用模数,代价是每次循环都需要额外添加。