Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中密码的解密_C_Math_Encryption_Cryptography_Caesar Cipher - Fatal编程技术网

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

我正在用C语言制作一个凯撒图书馆。 库源代码包含以下函数,该函数返回给定字符的加密等效项:

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++中定义了不正确的数字编码。