本页使用了标题或全文手工转换

异或密码

维基百科,自由的百科全书
跳转至: 导航搜索

简单异或密码(simple XOR cipher)是密码学中一种简单的加密算法,它按照如下原则进行运算:

A \oplus 0 = A
A \oplus A = 0
(A \oplus B) \oplus C = A \oplus (B \oplus C)
(B \oplus A) \oplus A = B \oplus 0 = B

其中\oplus逻辑异或(XOR)运算的符号。按这种逻辑,文本序列的每个字符可以通过与给定的密钥进行按位异或运算来加密。如果要解密,只需要将加密後的结果与密钥再次进行按位异或运算即可。

例如,字符串“Wiki”(8位ASCII:01010111 01101001 01101011 01101001) 可以按如下的方式用密钥11110011进行加密:

01010111 01101001 01101011 01101001
\oplus 11110011 11110011 11110011 11110011
= 10100100 10011010 10011000 10011010

此種加密方法類似對稱加密,故解密的方式如下:

10100100 10011010 10011000 10011010
\oplus 11110011 11110011 11110011 11110011
= 01010111 01101001 01101011 01101001

异或运算符常作为更为复杂的加密算法的组成部分。对於其本身来说,如果使用不断重复的密钥,利用频率分析就可以破解这种简单的异或密码。如果消息的内容被猜出或知道,密钥就会泄露。异或密码值得使用的原因主要是其易於实现,而且计算成本小。简单重复异或加密有时用於不需要特别安全的情况下来隐藏信息。

如果密钥是随机的(不重复),而且与消息长度相同,异或密码就会更为安全。当密钥流由伪随机数发生器英语pseudo-random number generator生成时,结果就是流密码。若密钥是真正随机的,结果就是一次性密碼本,這種密码在理论上是不可破解的。

在这些密码的任何部分中,密钥运算符在已知明文攻击下都是脆弱的,这是因为明文 \oplus 密文 = 密钥

伪代码[编辑]

加密:

 while(done < len) {
        tmp_ch = *buffer;
        for(int i = 0; i < key_len; i++)
                tmp_ch ^= key[i];
        *crypted = tmp_ch;
        crypted++; buffer++; done++;
 }

解密:

 while (done <= len) {
        tmp_ch = *buffer;
        for(int i = key_len-1; i >= 0; i--) {
                tmp_ch ^= key[i];
        }
        *decrypted = tmp_ch;
        decrypted++; buffer++; done++;
 }

参见[编辑]

外部链接[编辑]