php如何对文件进行RC4加密

php如何对文件进行RC4加密,第1张

1.原始钥匙 key

2.md5(md5+常量) 加密原始key =>mkey

3.mkey 作为AC4的密匙 ac_mkey

4.ac_mkey 对加密数据 进行 AC4 加密 得到AC4密码

5.AC4密码 在进行一次 AC4加密可还原 加密数据

简单来说,一句话,用md5 做AC4的密匙

以下是代码

<?php

/*

* rc4加密算法

* $pwd 密钥

* $data 要加密的数据

*/

function rc4 ($pwd, $data)//$pwd密钥 $data需加密字符串

{

$key[] =""

$box[] =""

$pwd_length = strlen($pwd)

$data_length = strlen($data)

for ($i = 0$i <256$i++)

{

$key[$i] = ord($pwd[$i % $pwd_length])

$box[$i] = $i

}

for ($j = $i = 0$i <256$i++)

{

$j = ($j + $box[$i] + $key[$i]) % 256

$tmp = $box[$i]

$box[$i] = $box[$j]

$box[$j] = $tmp

}

for ($a = $j = $i = 0$i <$data_length$i++)

{

$a = ($a + 1) % 256

$j = ($j + $box[$a]) % 256

$tmp = $box[$a]

$box[$a] = $box[$j]

$box[$j] = $tmp

$k = $box[(($box[$a] + $box[$j]) % 256)]

$cipher .= chr(ord($data[$i]) ^ $k)

}

return $cipher

}

$key = '5201314' //原始KEY

$pwd = md5(md5($key).'我是常量')//md5+常量

$data = '我爱北京天安门' //要加密的数据

$cipher = rc4($pwd, $data) //AC4 加密算法

$c = rc4($pwd, $cipher) //AC4 加密算法还原 (还原只需要重新加密一次)

echo '<pre>'

var_dump($key)

var_dump($pwd)

var_dump($data)

var_dump($cipher)

var_dump($c)

?>

刚对RC4算法进行了学习,网上发现mory.cn/entry/46753 中作者展示了RC4的python实现,但代码缺乏注释,较为晦涩,因此本文对部分代码进行了注释,希望能对学习RC4算法的pythoner有所帮助。

1 #/usr/bin/python 2 #coding=utf-8 3 import sys,os,hashlib,time,base64 4 def rc4(string, op = 'encode', public_key = 'ddd', expirytime = 0): 5 ckey_lenth = 4 #定义IV的长度 6 public_key = public_key and public_key or '' 7 key = hashlib.md5(public_key).hexdigest() #将密码public_key进行md5,返回32字节的key 8 keya = hashlib.md5(key[0:16]).hexdigest() #将Key的前16字节md5,返回32字节的keya 9 keyb = hashlib.md5(key[16:32]).hexdigest() #将key的后16字节md5,返回32字节的keyb10 11 #当加密时,keyc取time.time()的md5前4字节,用作IV12 #当解密时,从密文的前4字节取出IV13 keyc = ckey_lenth and (op == 'decode' and string[0:ckey_lenth] or hashlib.md5(str(time.time())).hexdigest()[32 - ckey_lenth:32]) or ''14 15 #真正的密钥cryptkey是由keya拼接keya以及keyc的md5得来的共64字节的字符串16 cryptkey = keya + hashlib.md5(keya + keyc).hexdigest()17 key_lenth = len(cryptkey) #6418 19 #当加密时,待加密的明文是由10字节的0以及待加密的明文string与keyb的md5值的前前16字节以及明文string拼接而成20 #当解密时,密文即为传入的string的前4字节以后的内容并解码21 string = op == 'decode' and base64.b64decode(string[4:]) or '0000000000' + hashlib.md5(string + keyb).hexdigest()[0:16] + string22 string_lenth = len(string)23 24 result = ''25 box = list(range(256))26 randkey = []27 28 for i in xrange(255):29 #随机填充cryptokey中字符的ascii码值,会出现4轮的重复,randkey[0]~randkey[63],randkey[64]~randkey[127],……30 randkey.append(ord(cryptkey[i % key_lenth]))31 32 #随机打乱box列表33 #cryptkey的真正目的是生成伪随机的box34 for i in xrange(255):35 j = 036 j = (j + box[i] + randkey[i]) % 25637 tmp = box[i]38 box[i] = box[j]39 box[j] = tmp40 41 for i in xrange(string_lenth):42 a = j = 043 a = (a + 1) % 25644 j = (j + box[a]) % 25645 tmp = box[a]46 box[a] = box[j]47 box[j] = tmp48 #以上再次进行了打乱49 50 #真正的明文string逐字节与box中的随机值异或生成加密的result51 #不管怎么随机打乱,由于cryptkey以及string_length总是一样的,因此box最终也一样52 result += chr(ord(string[i]) ^ (box[(box[a] + box[j]) % 256]))53 #解密时,密文在与box异或则返回明文54 55 if op == 'decode':56 #result[10:26] == hashlib.md5(result[26:] + keyb).hexdigest()[0:16],用来验证string的完整性57 if (result[0:10] == '0000000000' or int(result[0:10]) - int(time.time()) >0) and result[10:26] == hashlib.md5(result[26:] + keyb).hexdigest()[0:16]:58 return result[26:] #前十字节是0,再16字节是明文string与keyb的md5前16字节,最后的则是string59 else:60 return None61 else:62 #加密,返回IV+result的base64编码63 return keyc + base64.b64encode(result)64 65 if __name__ == '__main__':66 #print rc4('我们','encode','98765')67 print rc4('fd09GMhYylNXC5t550VwC5oX9WS4zrB0bI9rs6kvTAMoiGI=','decode','98765')


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7084835.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-01
下一篇 2023-04-01

发表评论

登录后才能评论

评论列表(0条)

保存