了解rc4加密的小伙伴们来给点tips吧

2013-12-05 20:26:08 +08:00
 g0t3n
最近想了解下加密的东西,然后翻开py + google 直接改代码了,码如下

from M2Crypto.EVP import Cipher
from random import randint

def random_string(length):
import M2Crypto.Rand
return M2Crypto.Rand.rand_bytes(length)

def encrypt(buf, key, iv="123456"):
cipher = Cipher(alg='rc4', key= key, iv=iv, op=1)
cipher.set_padding(padding=0)
v = cipher.update(buf)
v = v+cipher.final()
out = ""
for i in v:
out += "%02x" % (ord(i))
if __DEBUG__:
print out
return v

def decrypt(buf, key, iv="123456"):
cipher = Cipher(alg="rc4",key=key, iv=iv,op=0)
cipher.set_padding(padding=0)
v = cipher.update(buf)
v = v+cipher.final()
if __DEBUG__:
print v
return v
##############################################
if __name__ == "__main__":
rnd_str = random_string(2000)
print rnd_str == decrypt(encrypt(rnd_str, key="this is test"), key='this is test')
rnd_str = random_string(3)
print rnd_str == decrypt(encrypt(rnd_str, key="this is test"), key='this is test')
rnd_str = random_string(2000)
print rnd_str == decrypt(encrypt(rnd_str, key="this is test"), key='this is test')
然后,在单机测试是通过的,可是,在不同的程序调用生成的密码不同。。。 起初我以为是iv的问题,所以把iv写死为 123456了。。可是,在不同程序算出来的还是不行 TAT
哪位了解的来给点tips吧,顺便来点加密方面的资料?
3622 次点击
所在节点    问与答
8 条回复
vcex
2013-12-06 00:54:48 +08:00
不懂py,我用过纯js的,你去我网站看看,那个交易—工具里面就是rc4
g0t3n
2013-12-06 10:29:51 +08:00
@vcex 主要是不了解为什么指定了iv后同一明文得出的结果还是不一样的~
zorceta
2013-12-06 11:00:34 +08:00
RSA的计算中有个量也不是必须固定的,导致加密结果不固定。

这个是由算法决定的。
g0t3n
2013-12-06 11:47:13 +08:00
@zorceta 我这是rc4不是rsa啊。。。
g0t3n
2013-12-06 14:28:57 +08:00
@clowwindy 亲,我也围观了你shadow socks 的encrypt代码发现也是m2crypto的,能帮忙解答下问题么~
clowwindy
2013-12-06 15:12:26 +08:00
RC4 本身就是流加密,不支持设置 IV。每次加密必须使用不同的 key。
g0t3n
2013-12-06 16:05:19 +08:00
@clowwindy 但是使用相同的key和plaintext,得到的密文在不同的环境都是不同的结果。。。就想到纠结了
结果如下
# cat test.py
import encrypt

print repr(encrypt.encrypt("\x05\x01\x00", key="123456"))

# python test.py
'\xf6\x1df'
# ipython

In [1]: import test
'0a/'

In [2]: import encrypt

In [3]: print repr(encrypt.encrypt("\x05\x01\x00", key="123456"))
'0a/'
encrypt的代码:
def encrypt(buf, key, iv="123456"):
cipher = Cipher(alg='rc4', key= key, iv=iv, op=1, d='md5', key_as_bytes=0)
cipher.set_padding(padding=0)
v = cipher.update(buf)
v = v+cipher.final()
out = ""
for i in v:
out += "%02x" % (ord(i))
#if __DEBUG__:
# print out
return v
zorceta
2013-12-06 18:47:39 +08:00
@g0t3n 我只是想表明加密结果不固定的算法不止rc4一个……只能说这个函数一个自变量有多个可能的函数值

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/91990

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX