异或加密的局限性

阿卡克斯

我试图稍后将纯文本字符串加密为加密字符串,以使用它,我再次对它进行加密。我手动使用任意键,并且在大多数情况下,我可以找回纯字符串。但是特别是如果有纯文本,"$"则加密的文本不会被重新加密(解密)为原始文本;

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失败的最坏情况

大卫·赫弗南(David Heffernan)

我认为这里的基本问题是加密可以产生包含'\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()用来计算纯文本和密钥的长度是合理的。但是对于解密操作,您必须记住原始纯文本的长度,并将其传递给函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章