对xor加密的限制

时间:2014-01-20 11:08:14

标签: c xor encryption

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

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;
}

我是C的新手,因此想知道为什么没有显示这个'$'字符。或者在选择纯文本和密钥时是否有任何限制

由于

PS:现在'$'不是问题仍然想知道xor失败的最坏情况

1 个答案:

答案 0 :(得分:0)

我认为您遇到的根本问题是您的加密可以生成包含'\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;
}

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