我在互联网上找到了以下XOR加密函数:
void xor_encrypt(char *key, char *string)
{
int i, string_length = strlen(string);
for(i=0; i<string_length; i++)
{
string[i]=string[i]^key[i];
printf("%i", string[i]);
}
}
它的工作完美,但我想解密字符串也。
例如:
void xor_decrypt(char *key, char *encrypted_string)
{
//decrypt method goes here
}
所以基本上在我加密字符串之后,我会使用相同的加密密钥来解密之前加密的字符串。
我很新的编程,我只想知道如何解密以前加密的字符串。谢谢,所有的帮助是赞赏。
2条答案
按热度按时间ajsxfq5m1#
关于XOR加密的一个很酷的事情是,当你应用它两次时,你会得到原始字符串-参见http://en.wikipedia.org/wiki/XOR_cipher。
在你的函数
xor_decrypt
中,你获取字符串和键并返回string ^ key
。如果现在你再次将其与键进行异或,你会得到(string ^ key) ^ key = string ^ (key ^ key) = string ^ identity = string
(根据XOR运算符的属性:http://en.wikipedia.org/wiki/Exclusive_or#Properties)因此,您可以在第一个
xor_encrypt
的输出上第二次运行您的函数xor_encrypt
。jum4pzuy2#
使用XOR,解密和加密是完全相同的操作。通过
xor_encrypt
方法再次运行加密的字符串(相同的密钥),您将得到纯文本。警告1:空字符
有一点要注意:如果字符串中的字符与密钥中的对应字符匹配,则结果将是
'\0'
。这将被当前代码解释为“字符串结束”,并将停止解密。为了避免这种情况,您需要将“实际”字符串的长度作为参数传递给函数。警告二:快捷键
你还需要确保你没有超过你的键的结尾-如果纯文本很长,你可能需要重复这个键。你可以用
%
操作符来做到这一点-只要从开始回收这个键。下面是一个完整的示例,展示了这些技术:
这(没有意识到kay == string的问题)导致截断解密(
plain
中的i
匹配key
中的相同字母):去掉我上面标记的那行(即,保持
n
的值作为字符串的原始长度),您的结果是正如你所料