加密算法-流密码加密

什么是流密码

流密码是一种常见的加密算法,基于异或(XOR)操作,每次只操作一个字节,常见的流密码加密算法有:RC4、ORYX、SEAL。

流密码隐藏的问题

因为异或加密的本质,最常见的错误就是多次使用同一个密钥进行加解密。攻击者甚至不需要知道密钥就能成功破解密文。原理如下:

缺陷

/* A、B为明文,C为密钥 */

E(A) = A XOR C ;

E(B) = B XOR C ;

/* 相同的值想异或结果为0 */

E(A) XOR E(B) = (A XOR C) XOR (B XOR C) = A XOR B XOR (C XOR C) = A XOR B ;

E(A) XOR E(B) XOR B = A XOR B XOR B = A;

因此我们只要构建一个明文B并获得他的密文,通过其他途径获得A的密文(密文一般容易得到),通过这三个值就能获取到A的明文!这里的前提是两次加密的密钥是一致的

因此对于流密码方式的加密,密钥的随机性就至关重要了!!

在Ucenter中,有一个加密算法,他是如何获取密钥的呢。

$ckey_length = 4; /* 密钥的长度默认为4 !*/

$keyc = substr(md5(microtime()),-$ckey_length);

这里密钥是随机生成的,具有一定随机性,这样导致相同的字符串每次加密后的结果一般都不相同,那不同的密文算法又是如何解密的呢,原因就是需要将每次使用的密钥添加到加密后的密文中,形成最终的密文。

流加密返回的密文内容

$result = decrypt($keyc,$string);

return $keyc.$result;

 

这样如果密钥随机性不高,就给了攻击者暴力破解的机会,比如说上面的密钥长度为4,完成可以通过暴力破解。

流密码暴力破解

$A_crypt = $A XOR $C;

/* 密文前4位就是密钥 */

$c_private = substr($A_crypt,0,3);

for(;;){

$keyc = substr(md5(microtime()),-4);

if($c_private == $keyc){

$B_crypt = decrypt($keyc,$B);

$A = $B_crypt XOR $A_crypt XOR $B;

return $A;

}

}

经测算,4个字的密钥大概几十秒就给破解出来了!因此密钥的随机性对于流密码至关重要!!

猜你喜欢

转载自blog.csdn.net/github_38392025/article/details/81708236