什么原因导致XOR加密返回“空白”?

时间:2013-01-09 20:57:07

标签: encryption c

使用XOR加密时,某些字符为空的原因是什么?此外,在解密时如何补偿?

例如:

....
void basic_encrypt(char *to_encrypt) {
    char c;
    while (*to_encrypt) {
        *to_encrypt = *to_encrypt ^ 20;
        to_encrypt++;
    }
}

将为角色k返回“无”。显然,字符衰减对解密来说是个问题。

我认为这是由位运算符引起的,但我对二进制文件不是很好,所以我想知道是否有人可以解释。

在这种情况下,它是否将元素k转换为某种无空格的ASCII字符?可以通过选择一些y<来补偿这一点。 x< z运算符,其中x是运算符?

最后,如果它没有得到补偿,除了猜测和检查之外,还有一个真实的解密策略来填空吗?

3 个答案:

答案 0 :(得分:6)

'k'具有ASCII值107 = 0x6B200x14,所以

'k' ^ 20 == 0x7F == 127

如果您的字符集与ASCII兼容。 127是ASCII中的\DEL,这是一个不可打印的字符,因此如果将其打印出来将不会显示。

答案 1 :(得分:3)

您必须知道字节和字符之间的区别,以了解发生了什么。一方面,你有C char类型,它只是一个字节的表示,而不是一个字符。

在过去,每个字符都映射到字符编码表或代码页中的一个字节或八位字节值。现在我们的编码为某些字符占用了更多的字节,例如UTF-8,甚至是总是占用多个字节的编码,如UTF-16。最后两个是unicode编码,这意味着每个字符都有一定的数字值,编码用于将这个数字编码为字节。

许多计算机将解释ISO / IEC 8859-1或Latin-1中的字节,有时会扩展为Windows-1252。这些代码页有控制字符的孔,或者根本不使用的字节值。现在,它取决于运行时系统如何处理这些值。默认情况下,Java会替换?个字符来代替缺少的字符。其他运行时只会丢弃值,或者 - 当然 - 执行控制代码。有些终端可能会使用ESC控制代码来设置颜色或切换到另一个代码页(弄乱屏幕)。

这就是为什么要将密文转换为其他编码,例如十六进制或Base64。这些编码应确保结果是可读文本。这会处理密文。您还必须为纯文本选择一个字符集,例如只需在加密前执行ASCII或UTF-8编码。

答案 2 :(得分:1)

从加密中获取零值无关紧要,因为一旦使用相同的xor键重新xor,就会获得原始值。

value == value
value XOR value == 0 [encryption]
( value XOR value ) XOR value == value [decryption]

如果您使用的是零终止字符串机制,那么您有两种防止“字符降级”的主要策略

  • 在加密前存储字符串的长度,并确保在解密时解密至少该字符数
  • 在解码字符
  • 后检查零字符