我对 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)
任何帮助将不胜感激。谢谢!
%在 C99 之前的 C 中,负数的行为是实现定义的。从 C99 开始,它被定义了,但并没有做你想要的。
最简单的方法是:
((asciinum + 26) % 26)
Run Code Online (Sandbox Code Playgroud)
假设asciinum永远不会低于-26。