使用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是运算符?
最后,如果它没有得到补偿,除了猜测和检查之外,还有一个真实的解密策略来填空吗?
答案 0 :(得分:6)
'k'
具有ASCII值107 = 0x6B
。 20
是0x14
,所以
'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]
如果您使用的是零终止字符串机制,那么您有两种防止“字符降级”的主要策略