欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

加密算法-流密码加密

程序员文章站 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个字的**大概几十秒就给**出来了!因此**的随机性对于流密码至关重要!!

相关标签: 流加密 安全