我在互联网上发现了以下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]);
}
}
Run Code Online (Sandbox Code Playgroud)
它工作得很完美,但我也想解密字符串.
例如:
void xor_decrypt(char *key, char *encrypted_string)
{
//decrypt method goes here
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我加密字符串后,我会使用相同的加密密钥来解密以前加密的字符串.
我对编程很新,我只想知道如何解密以前加密的字符串.谢谢,所有的帮助表示赞赏.
dmi*_*g01 13
关于XOR加密的一个很酷的事情是当你应用它两次时,你会收回原始字符串 - 请参阅http://en.wikipedia.org/wiki/XOR_cipher.
在你的函数xor_decrypt中,你接受字符串和键并返回字符串^ key.如果,现在,你再次使用密钥,你得到(string ^ key)^ key = string ^(key ^ key)= string ^ identity = string(通过XOR运算符的属性:http://en.wikipedia. org/wiki/Exclusive_or#Properties)
因此,您可以在第一个xor_encrypt的输出上再次运行您的函数xor_encrypt.
Flo*_*ris 11
使用XOR,解密与加密操作完全相同.xor_encrypt再次通过该方法运行加密的字符串相同的键),然后返回纯文本.
需要注意的一件事是:如果字符串中的字符与键中的相应字符匹配,则结果将是'\0'.这将被您当前的代码解释为"字符串结尾",并会使解密缩短.为避免这种情况,您希望将"实际"字符串的长度作为参数传递给函数.
您还希望确保不会超出密钥的末尾 - 如果纯文本很长,则可能需要重复密钥.您可以与%操作员一起执行此操作 - 只需从头开始回收密钥即可.
这是一个完整的示例,显示了这些技术:
#include <stdio.h>
#include <string.h>
void xor_encrypt(char *key, char *string, int n)
{
int i;
int keyLength = strlen(key);
for( i = 0 ; i < n ; i++ )
{
string[i]=string[i]^key[i%keyLength];
}
}
int main(void) {
char plain[] = "This is plain text";
char key[] = "Abcdabcdabciabcdabcd";
int n = strlen(plain);
// encrypt:
xor_encrypt(key, plain, n);
printf("encrypted string: \n");
for(int ii = 0; ii < n; ii++) {
if(plain[ii] > 0x32 && plain[ii] < 0x7F ) printf("%c", plain[ii]);
else printf(" 0x%02x ", plain[ii]);
}
printf("\n");
// **** if you include this next line, things go wrong!
n = strlen(plain);
xor_encrypt(key, plain, n);
printf("after round trip, plain string is '%s'\n", plain);
}
Run Code Online (Sandbox Code Playgroud)
这(没有意识到kay == string的问题)导致截断的解密(iin plain匹配相同的字母key):
encrypted string:
0x15 0x0a 0x0a 0x17 A 0x0b 0x10 D 0x11 0x0e 0x02 0x00 0x0f B 0x17 0x01 0x19 0x16
after round trip, plain string is 'This is pla'
Run Code Online (Sandbox Code Playgroud)
离开我在上面标记的线(即,将值保持n为字符串的原始长度),结果是
encrypted string:
0x15 0x0a 0x0a 0x17 A 0x0b 0x10 D 0x11 0x0e 0x02 0x00 0x0f B 0x17 0x01 0x19 0x16
after round trip, plain string is 'This is plain text'
Run Code Online (Sandbox Code Playgroud)
完全如你所料.