V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
g0t3n
V2EX  ›  问与答

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

  •  
  •   g0t3n · 2013-12-05 20:26:08 +08:00 · 3589 次点击
    这是一个创建于 3996 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近想了解下加密的东西,然后翻开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吧,顺便来点加密方面的资料?
    第 1 条附言  ·  2013-12-06 10:30:07 +08:00
    [*] 主要是不了解为什么指定了iv后同一明文得出的结果还是不一样的 TAT~
    8 条回复    1970-01-01 08:00:00 +08:00
    vcex
        1
    vcex  
       2013-12-06 00:54:48 +08:00 via Android
    不懂py,我用过纯js的,你去我网站看看,那个交易—工具里面就是rc4
    g0t3n
        2
    g0t3n  
    OP
       2013-12-06 10:29:51 +08:00
    @vcex 主要是不了解为什么指定了iv后同一明文得出的结果还是不一样的~
    zorceta
        3
    zorceta  
       2013-12-06 11:00:34 +08:00 via Android
    RSA的计算中有个量也不是必须固定的,导致加密结果不固定。

    这个是由算法决定的。
    g0t3n
        4
    g0t3n  
    OP
       2013-12-06 11:47:13 +08:00
    @zorceta 我这是rc4不是rsa啊。。。
    g0t3n
        5
    g0t3n  
    OP
       2013-12-06 14:28:57 +08:00
    @clowwindy 亲,我也围观了你shadow socks 的encrypt代码发现也是m2crypto的,能帮忙解答下问题么~
    clowwindy
        6
    clowwindy  
       2013-12-06 15:12:26 +08:00
    RC4 本身就是流加密,不支持设置 IV。每次加密必须使用不同的 key。
    g0t3n
        7
    g0t3n  
    OP
       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
        8
    zorceta  
       2013-12-06 18:47:39 +08:00 via Android
    @g0t3n 我只是想表明加密结果不固定的算法不止rc4一个……只能说这个函数一个自变量有多个可能的函数值
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5850 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 03:00 · PVG 11:00 · LAX 19:00 · JFK 22:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.