玩蛇网提供最新Python编程技术信息以及Python资源下载!

分享webqq加密算法解析

python 培训

这是我几年前用python写的关于腾讯web产品通用的加密算法解析。代码思路不够完善,还有更多可以改进之处,也可能不适用如今的产品版本了,伙伴们将就看下喽。

class EncodePasswd(object):
    def __init__(self, passwd=None, verifycode=None):
        self.passwd = passwd
        self.verifycode = verifycode
        self.hexcase = 1
        self.b64pad = ''
        self.chrsz = 8
        self.mode = 32

    def str2binl(self, D):
        C = []
        A = (1<<self.chrsz) - 1
        for B in range(0, len(D)*self.chrsz, self.chrsz):
            if len(C) == (B>>5): C.append(0)
            C[B>>5] |= (ord(D[B/self.chrsz])&A)<<(B%32)
        return C

    def binl2hex(self, C):
        B = "0123456789abcdef"
        if self.hexcase: 
            B = "0123456789ABCDEF"
        D = ''
        for A in range(0, len(C)*4, 1):
            D += B[(C[A>>2]>>((A%4)*8+4))&15] + B[(C[A>>2]>>((A%4)*8))&15]
        return D
        
    def md5(self, A):
        return self.hex_md5(A)

    def hex_md5(self, A): 
        return self.binl2hex(self.core_md5(self.str2binl(A), len(A)*self.chrsz))
    
    def str_md5(self, A):
        return self.binl2str(self.core_md5(self.str2binl(A), len(A)*self.chrsz))
    
    def hex_hmac_md5(self, A, B):
        return self.binl2hex(self.core_hmac_md5(A, B))
        
    def b64_hmac_md5(self, A, B):
        return binl2b64(core_hmac_md5(A, B))
    
    def str_hmac_md5(self, A, B):
        return self.binl2str(self.core_hmac_md5(A, B))
       
    def md5_vm_test(self):
        return self.hex_md5('abc') == '900150983cd24fb0d6963f7d28e17f72'
    
    # this is equvalent of >>> in js
    def rsl(self, A, B):
        return (A & 0xFFFFFFFFL) >> B
    
    def jsArraySet(self, list, index, value):
        if index < 0: return
        if len(list) > index:
            list[index] = value
        else:
            for i in range(index-len(list)):
                list.append(0)
            list.append(value)
    def jsArrayGet(self, list, index):
        if len(list) > index:
            return list[index]
        else:
            return 0
    
    def core_md5(self, K, F):
        #K[F>>5] |= 128<<((F)%32)
        self.jsArraySet(K, F>>5, self.jsArrayGet(K, F>>5)|(128<<(F%32)))
        #K[(self.rsl(F+64, 9)<<4)+14] = F
        self.jsArraySet(K, (self.rsl(F+64, 9)<<4)+14, F)
        J=1732584193;
        I=-271733879;
        H=-1732584194;
        G=271733878;
        
        for C in range(0, len(K), 16):
            E=J;
            D=I;
            B=H;
            A=G;
            J=self.md5_ff(J,I,H,G,self.jsArrayGet(K, C+0),7,-680876936);
            G=self.md5_ff(G,J,I,H,self.jsArrayGet(K, C+1),12,-389564586);
            H=self.md5_ff(H,G,J,I,self.jsArrayGet(K, C+2),17,606105819);
            I=self.md5_ff(I,H,G,J,self.jsArrayGet(K, C+3),22,-1044525330);
            J=self.md5_ff(J,I,H,G,self.jsArrayGet(K, C+4),7,-176418897);
            G=self.md5_ff(G,J,I,H,self.jsArrayGet(K, C+5),12,1200080426);
            H=self.md5_ff(H,G,J,I,self.jsArrayGet(K, C+6),17,-1473231341);
            I=self.md5_ff(I,H,G,J,self.jsArrayGet(K, C+7),22,-45705983);
            J=self.md5_ff(J,I,H,G,self.jsArrayGet(K, C+8),7,1770035416);
            G=self.md5_ff(G,J,I,H,self.jsArrayGet(K, C+9),12,-1958414417);
            H=self.md5_ff(H,G,J,I,self.jsArrayGet(K, C+10),17,-42063);
            I=self.md5_ff(I,H,G,J,self.jsArrayGet(K, C+11),22,-1990404162);
            J=self.md5_ff(J,I,H,G,self.jsArrayGet(K, C+12),7,1804603682);
            G=self.md5_ff(G,J,I,H,self.jsArrayGet(K, C+13),12,-40341101);
            H=self.md5_ff(H,G,J,I,self.jsArrayGet(K, C+14),17,-1502002290);
            I=self.md5_ff(I,H,G,J,self.jsArrayGet(K, C+15),22,1236535329);
            J=self.md5_gg(J,I,H,G,self.jsArrayGet(K, C+1),5,-165796510);
            G=self.md5_gg(G,J,I,H,self.jsArrayGet(K, C+6),9,-1069501632);
            H=self.md5_gg(H,G,J,I,self.jsArrayGet(K, C+11),14,643717713);
            I=self.md5_gg(I,H,G,J,self.jsArrayGet(K, C+0),20,-373897302);
            J=self.md5_gg(J,I,H,G,self.jsArrayGet(K, C+5),5,-701558691);
            G=self.md5_gg(G,J,I,H,self.jsArrayGet(K, C+10),9,38016083);
            H=self.md5_gg(H,G,J,I,self.jsArrayGet(K, C+15),14,-660478335);
            I=self.md5_gg(I,H,G,J,self.jsArrayGet(K, C+4),20,-405537848);
            J=self.md5_gg(J,I,H,G,self.jsArrayGet(K, C+9),5,568446438);
            G=self.md5_gg(G,J,I,H,self.jsArrayGet(K, C+14),9,-1019803690);
            H=self.md5_gg(H,G,J,I,self.jsArrayGet(K, C+3),14,-187363961);
            I=self.md5_gg(I,H,G,J,self.jsArrayGet(K, C+8),20,1163531501);
            J=self.md5_gg(J,I,H,G,self.jsArrayGet(K, C+13),5,-1444681467);
            G=self.md5_gg(G,J,I,H,self.jsArrayGet(K, C+2),9,-51403784);
            H=self.md5_gg(H,G,J,I,self.jsArrayGet(K, C+7),14,1735328473);
            I=self.md5_gg(I,H,G,J,self.jsArrayGet(
369a
K, C+12),20,-1926607734);
            J=self.md5_hh(J,I,H,G,self.jsArrayGet(K, C+5),4,-378558);
            G=self.md5_hh(G,J,I,H,self.jsArrayGet(K, C+8),11,-2022574463);
            H=self.md5_hh(H,G,J,I,self.jsArrayGet(K, C+11),16,1839030562);
            I=self.md5_hh(I,H,G,J,self.jsArrayGet(K, C+14),23,-35309556);
            J=self.md5_hh(J,I,H,G,self.jsArrayGet(K, C+1),4,-1530992060);
            G=self.md5_hh(G,J,I,H,self.jsArrayGet(K, C+4),11,1272893353);
            H=self.md5_hh(H,G,J,I,self.jsArrayGet(K, C+7),16,-155497632);
            I=self.md5_hh(I,H,G,J,self.jsArrayGet(K, C+10),23,-1094730640);
            J=self.md5_hh(J,I,H,G,self.jsArrayGet(K, C+13),4,681279174);
            G=self.md5_hh(G,J,I,H,self.jsArrayGet(K, C+0),11,-358537222);
            H=self.md5_hh(H,G,J,I,self.jsArrayGet(K, C+3),16,-722521979);
            I=self.md5_hh(I,H,G,J,self.jsArrayGet(K, C+6),23,76029189);
            J=self.md5_hh(J,I,H,G,self.jsArrayGet(K, C+9),4,-640364487);
            G=self.md5_hh(G,J,I,H,self.jsArrayGet(K, C+12),11,-421815835);
            H=self.md5_hh(H,G,J,I,self.jsArrayGet(K, C+15),16,530742520);
            I=self.md5_hh(I,H,G,J,self.jsArrayGet(K, C+2),23,-995338651);
            J=self.md5_ii(J,I,H,G,self.jsArrayGet(K, C+0),6,-198630844);
            G=self.md5_ii(G,J,I,H,self.jsArrayGet(K, C+7),10,1126891415);
            H=self.md5_ii(H,G,J,I,self.jsArrayGet(K, C+14),15,-1416354905);
            I=self.md5_ii(I,H,G,J,self.jsArrayGet(K, C+5),21,-57434055);
            J=self.md5_ii(J,I,H,G,self.jsArrayGet(K, C+12),6,1700485571);
            G=self.md5_ii(G,J,I,H,self.jsArrayGet(K, C+3),10,-1894986606);
            H=self.md5_ii(H,G,J,I,self.jsArrayGet(K, C+10),15,-1051523);
            I=self.md5_ii(I,H,G,J,self.jsArrayGet(K, C+1),21,-2054922799);
            J=self.md5_ii(J,I,H,G,self.jsArrayGet(K, C+8),6,1873313359);
            G=self.md5_ii(G,J,I,H,self.jsArrayGet(K, C+15),10,-30611744);
            H=self.md5_ii(H,G,J,I,self.jsArrayGet(K, C+6),15,-1560198380);
            I=self.md5_ii(I,H,G,J,self.jsArrayGet(K, C+13),21,1309151649);
            J=self.md5_ii(J,I,H,G,self.jsArrayGet(K, C+4),6,-145523070);
            G=self.md5_ii(G,J,I,H,self.jsArrayGet(K, C+11),10,-1120210379);
            H=self.md5_ii(H,G,J,I,self.jsArrayGet(K, C+2),15,718787259);
            I=self.md5_ii(I,H,G,J,self.jsArrayGet(K, C+9),21,-343485551);
            J=self.safe_add(J,E);
            I=self.safe_add(I,D);
            H=self.safe_add(H,B);
            G=self.safe_add(G,A)
            
        if self.mode == 16:
            return [I, H]
        else:
            return [J, I, H, G]
            
    def md5_cmn(self, F, C, B, A, E, D):
        return self.safe_add(self.bit_rol(self.safe_add(self.safe_add(C, F), self.safe_add(A, D)), E), B)
        
    def md5_ff(self, C, B,G, F,A,E,D):
        return self.md5_cmn((B&G)|((~B)&F), C, B, A, E, D)
        
    def md5_gg(self, C,B,G,F,A,E,D):
        return self.md5_cmn((B&F)|(G&(~F)),C,B,A,E,D)
        
    def md5_hh(self, C,B,G,F,A,E,D):
        return self.md5_cmn(B^G^F, C,B,A,E,D)
        
    def md5_ii(self,C,B,G,F,A,E,D):
        return self.md5_cmn(G^(B|(~F)),C,B,A,E,D)
    
    def core_hmac_md5(self, C, F):
        E = self.str2binl(C)
        if len(E) > 16:
            E = self.core_md5(E,len(C)*self.chrsz)
        A = [None]*16
        D = [None]*16
        for B in range(0, 16):
            A[B] = E[B]^909522486
            D[B] = E[B]^1549556828
        G = self.core_md5(A+self.str2binl(F), 512+len(F)*self.chrsz)
        return self.core_md5(D+G, 512+128)    
    
    def safe_add(self, A,D):
        C = (A&65535)+(D&65535)
        B = (A>>16)+(D>>16)+(C>>16)
        return (B<<16)|(C&65535)

    def bit_rol(self, A, B):
        return (A<<B)|self.rsl(A, 32-B)
        
    def binl2str(self, C):
        D = ''
        A = (1<<self.chrsz)-1
        for B in range(0, len(C)*32, self.chrsz):
            D += chr(self.rsl(C[B>>5], B%32)&A)
        return D
        
    def binl2b64(self, D):
        C="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
        F = ''
        for B in range(0, len(D)*4, 3):
            E=(((D[B>>2]>>8*(B%4))&255)<<16)|(((D[B+1>>2]>>8*((B+1)%4))&255)<<8)|((D[B+2>>2]>>8*((B+2)%4))&255)
            for A in range(0, 4):
                if B*8+A*6>len(D)*32:
                    F += self.b64pad
                else:
                    F += C[(E>>6*(3-A))&63]
        return F

#www.iplaypython.com

    def hexchar2bin(self,str):
        arr = []
        for i in range(0, len(str) , 2):
            arr.append("\\x" + str[i:i+2])
        arr="".join(arr)
        exec("temp = '" + arr + "'");
        return temp

    def md5_3(self, B):
        hash = self.core_md5(self.str2binl(B), len(B)*self.chrsz)
        hash = self.core_md5(hash, 16*self.chrsz)
        hash = self.core_md5(hash, 16*self.chrsz)
        return self.binl2hex(hash)

玩蛇网原创,转载请注明文章出处和来源网址:http://www.iplaypython.com/code/algorithm/a2216.html



微信公众号搜索"玩蛇网Python之家"加关注,每日最新的Python资讯、图文视频教程可以让你一手全掌握。强烈推荐关注!

微信扫描下图可直接关注

玩蛇网Python新手QQ群,欢迎加入: ① 240764603 玩蛇网Python新手群
文章发布日期:2016-06-08 14:42 玩蛇网 www.iplaypython.com

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
相关文章推荐
别人正在看
特别推荐
去顶部去底部