我正试图加密一个明文字符串到加密字符串,然后再使用它,我再次对它进行加密。我手动使用任意键,在大多数情况下,我能够得到简单的字符串返回。但特别是如果纯文本有"$",那么加密的文本不被重新加密(解密)到原始;
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是新手,因此我想知道为什么这个'$'字符没有显示出来。或者,在选择纯文本和键时,是否存在limititaion?
谢谢
PS:现在'$‘不是问题,仍然想知道xor失败的最坏情况
发布于 2014-01-20 11:34:30
我认为这里的基本问题是您的加密可以生成一个包含'\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()计算纯文本和键的长度,这是合理的。但是对于解密操作,您必须记住原始纯文本的长度,并将其传递给函数。
https://stackoverflow.com/questions/21232388
复制相似问题