C xor加密的限制

C xor加密的限制,c,xor,encryption,C,Xor,Encryption,我正在尝试将明文字符串加密为加密字符串,以后使用它时,我将再次对其进行加密。我手动使用任意键,在大多数情况下,我都可以恢复普通字符串。但特别是,如果纯文本具有“$”,则加密文本不会被重新加密(解密)为原始文本 char * xor(char * plain_text, char * key) { size_t plaintext_len = strlen(plain_text); size_t keylen = strlen(key); char * encrypted

我正在尝试将明文字符串加密为加密字符串,以后使用它时,我将再次对其进行加密。我手动使用任意键,在大多数情况下,我都可以恢复普通字符串。但特别是,如果纯文本具有
“$”
,则加密文本不会被重新加密(解密)为原始文本

char * xor(char * plain_text, char * key) {
    size_t plaintext_len = strlen(plain_text);
    size_t keylen = strlen(key);

    char * encrypted = malloc(plaintext_len+1);

    int i;
    for(i = 0; i < plaintext_len; i++) {
        encrypted[i] = plain_text[i] ^ key[i % keylen];
    }
    encrypted[plaintext_len] = '\0';

    return encrypted;
}
char*xor(char*纯文本,char*键){
大小\u t纯文本\u len=strlen(纯文本);
尺寸=标准长度(键);
char*encrypted=malloc(纯文本长度+1);
int i;
对于(i=0;i
我是C新手,因此想知道为什么这个
“$”
字符没有显示出来。或者在选择纯文本和键时是否有任何限制

谢谢


PS:现在问题不在“$”了,你还想知道xor失败的最坏情况

我想你这里的根本问题是你的加密可以产生一个包含“\0”字符的字符数组。当您开始解密时,该字符将被视为终止字符。此外,为什么要限制您的密钥不包含
'\0'
字符

要解决这个问题,您确实需要让函数处理数组的长度。不能依靠
strlen()
获取长度。我建议您向函数中添加额外的参数,以允许调用方传入两个字符数组的长度

您的函数还应该接收
const char*
。所以我想这样做:

char *xor(
    const char *plain_text, size_t plaintext_len, 
    const char *key, size_t keylen
) 
{
    char *encrypted = malloc(plaintext_len+1);
    for(size_t i = 0; i < plaintext_len; i++) 
        encrypted[i] = plain_text[i] ^ key[i % keylen];
    encrypted[plaintext_len] = '\0';
    return encrypted;
}
char*xor(
常量字符*纯文本,大小为纯文本,
常量字符*键,大小\u t键
) 
{
char*encrypted=malloc(纯文本长度+1);
对于(大小i=0;i

调用方可以使用
strlen()
来计算纯文本和键的长度,这似乎是合理的。但是,对于解密操作,您必须记住原始纯文本的长度,并将其传递给函数。

使用密钥重复异或时,请不要将其称为加密。你在制造一种虚假的安全感,就像用回形针代替锁,并称之为保险箱一样。@Art:钥匙比纯文本长,就像一次性的软垫,完全可以……谢谢。也许我没有那么多的加密意识,而且据我所知,我只有一个选择。实际上,在这里,我想将它用作从一个应用程序到另一个应用程序的加密数据。所以在中途没人能想象那里写着什么。可能是回形针/纸袋,但数据将被隐藏。当您忘记释放内存时,MALLOC内部功能可能会导致内存泄漏。请不要使用malloc,而是将缓冲区添加到参数中,并让调用方处理分配和解除分配…@Art-这是加密。只是一个非常弱的加密。