c - 异或加密的限制

标签 c xor encryption

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

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 的新手,因此想知道为什么这个 '$' 字符没有被显示回来。或者在选择纯文本和 key 时是否有任何限制

谢谢

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

最佳答案

我认为您在这里遇到的根本问题是您的加密可以生成包含 '\0' 字符的字符数组。当您解密时,该字符将被视为终止字符。此外,为什么要限制您的 key 不包含 '\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() 来计算明文和 key 的长度,这似乎是合理的。但对于解密操作,您必须记住原始纯文本的长度,并将其传递给函数。

关于c - 异或加密的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21232388/

相关文章:

c# - 在 C# 中 int 和 char 之间的转换错误

python - 基于 ID 列表有效计算 XOR(^) 校验和的方法

encryption - MessageHub - 静态数据加密

javascript - 是否可以在 Php 中加密 JWT token 并在 Javascript 中解密?

c - 在 MIB 中定义动态长度的标量序列

c - 如何根据 C 中的多个定界符分隔字符串?

c++ - 谁能告诉我为什么 float 不能容纳 3153600000?

javascript - Javascript 和 Python 中的异或运算结果不一致

c# - 使用 Aes 解密失败

c - 结构问题,将它们放在哪里以及如何在标题中引用它们?