热度 8 ||
最近在做一个项目的时候,偶然想换加密算法的想法,现在大家都在用md5,但是这个算法是不可逆的。于是google了一些加密算法,最终发现了RC4加密算法。但是网上都是C语言版的代码,我就写了一个php版的RC4加密算法。
下面是算法的一个介绍:
RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。RC4也被叫做ARC4(Alleged RC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法。
<?php
class Encrypt{
//公钥
var $public_key = 'afggthhjdhrdh';
/*
功能说明:对明文或密文进行加密或解密。
参数说明:
$secret_str:明文或解密。
*/
function encrypt_decrypt($secret_str)
{
$secret_key = $this->make_secret_key($this->public_key);
$x = $secret_key['x'];
$y = $secret_key['y'];
$secret_number = '';
$secret_str_len = strlen($secret_str);
for($counter = 0; $counter < $secret_str_len; $counter++)
{
$x = ($x + 1) % 256;
$y = ($secret_key['state'][$x] + $y) % 256;
$xy = $this->xor_byte($secret_key['state'][$x], $secret_key['state'][$y]);
$secret_key['state'][$x] = $xy['x'];
$secret_key['state'][$y] = $xy['y'];
$xorIndex = ($secret_key['state'][$x] + $secret_key['state'][$y]) % 256;
$temp_str = ord($secret_str[$counter]) ^ $secret_key['state'][$xorIndex];
$secret_number .= chr($temp_str);
}
return $secret_number;
}
/*
功能说明:生成动态子密钥。
参数说明:
$public_key:公钥。
*/
function make_secret_key($public_key)
{
$secret_key = array('x'=>0,'y'=>0,'state'=>array());
for($counter = 0; $counter < 256; $counter++)
{
$secret_key['state'][$counter] = $counter;
}
$public_key_len = strlen($public_key);
$secret_key['x'] = 0;
$secret_key['y'] = 0;
$index_x = 0;
$index_y = 0;
for($counter = 0; $counter < 256; $counter++)
{
$index_y = (ord($public_key[$index_x]) + $secret_key['state'][$counter] + $index_y) % 256;
$xy = $this->xor_byte($secret_key['state'][$counter], $secret_key['state'][$index_y]);
$secret_key['state'][$counter] = $xy['x'];
$secret_key['state'][$index_y] = $xy['y'];
$index_x = ($index_x + 1) % $public_key_len;
}
return $secret_key;
}
/*
功能说明:进行异或运算。
*/
function xor_byte($x,$y)
{
$x=$x^$y;
$y=$x^$y;
$x=$x^$y;
return array('x'=>$x,'y'=>$y);
}
}
?>