加密算法-流密码加密
程序员文章站
2024-03-16 18:20:34
...
什么是流密码
流密码是一种常见的加密算法,基于异或(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个字的**大概几十秒就给**出来了!因此**的随机性对于流密码至关重要!!
上一篇: RSA之超过128个字节的加密
下一篇: 凯撒密码加密