C语言中密码的解密
我正在用C语言制作一个凯撒图书馆。 库源代码包含以下函数,该函数返回给定字符的加密等效项:C语言中密码的解密,c,math,encryption,cryptography,caesar-cipher,C,Math,Encryption,Cryptography,Caesar Cipher,我正在用C语言制作一个凯撒图书馆。 库源代码包含以下函数,该函数返回给定字符的加密等效项: char cypher_charac(char charac, int key) { if (islower(charac)) { charac = 'a' + (charac - 'a' + key) % 26 ; return charac ; } else if (isupper(charac)) { ch
char cypher_charac(char charac, int key)
{
if (islower(charac)) {
charac = 'a' + (charac - 'a' + key) % 26 ;
return charac ;
} else if (isupper(charac)) {
charac = 'A' + (charac - 'A' + key) % 26 ;
return charac
} else{
return charac ;
}
}
当调用该函数进行加密时,该函数效果非常好。
但是,当用于解密时(key=-key),函数返回非字母字符
我检查了多个论坛和不同的代码,但我就是看不到
谢谢 问题在于如何为C中的负数定义
%
余数运算-负数的余数是负数,绝对不在0-25范围内!C中%
的定义不同于Python,但与Javascript的定义相似
考虑行业标准ROT13算法,它使用13作为加密密钥。现在如果charac
=A'
,那么charac-'A'+键将等于-13
,(-13)%26
仍然是-13
。将其添加到'A'
中,您将不会拥有'N'
,而是'4'
要获得正确的解密密钥,必须从26中减去加密密钥,而不是将其取反(即key=26-key
)。对于ROT13,它将是26-13
,再次等于13。对于标准剖腹产ROT3,解密密钥为23。对于ROT26,解密密钥将为0。同样,您的方法可能在Python和许多其他编程语言中都有效,但这是因为(-13)%26
的结果是+13,而不是-13 谢谢你的回答。问题解决了
如上所述,问题是由于C中的%定义
当我更换以下部件时,它起了作用:
charac='a'+(charac-'a'+键)%26
在代码中
与:
charac='a'+((charac-'a'+cle)%26)+26)%26
对负数和正键都有效。
当你询问C写的程序时,不要使用C++标签。我已经检查了多个论坛和不同的代码。检查代码怎么样?你通过调试器运行了吗?当key
为负数时,表达式(charac-'a'+key)%26
会发生什么变化?谢谢。事实上,它与C中模的定义有关。然而,当我使用key=26-key如果key<0,我得到的加密和解密的答案是相同的。通常你会为此定义一个mod
函数,比如intmod(intx,intn){return(x%n+n)%n);}
,然后,读者就可以清楚地知道执行的是什么函数,并且代码中不会重复令人讨厌的26
。您应该能够删除最里面的%26
。对于字母表来说是正确的,但是如果将其作为一个单独的函数,您可能会遇到有趣的溢出问题,特别是在C/C++中定义了不正确的数字编码。