Mpj ddlZddlZddlZddlmZddlmZddlmZddl m Z  ddl m Z ejeZej%ej&dZGdd Zy#e $r ddlm Z YMwxYw) N)md5)pack)default_backend)Cipher)ARC4c |jd}t|j}|dd}||zdz}t|j}|dd}td|}t||zj}|dd} | S)a( Return a intermediate key. >>> password = 'password1' >>> salt = b'\xe8w,\x1d\x91\xc5j7\x96Ga\xb2\x80\x182\x17' >>> block = 0 >>> expected = b' \xbf2\xdd\xf5@\x85\x8cQ7D\xaf\x0f$\xe0<' >>> _makekey(password, salt, block) == expected True zUTF-16LENz>> password = 'password1' >>> salt = b'\xe8w,\x1d\x91\xc5j7\x96Ga\xb2\x80\x182\x17' >>> encryptedVerifier = b'\xc9\xe9\x97\xd4T\x97=1\x0b\xb1\xbap\x14&\x83~' >>> encryptedVerifierHash = b'\xb1\xde\x17\x8f\x07\xe9\x89\xc4M\xae^L\xf9j\xc4\x07' >>> DocumentRC4.verifypw(password, salt, encryptedVerifier, encryptedVerifierHash) True rNmodebackend) rrrr decryptorupdaterr loggingdebug) r rencryptedVerifierencryptedVerifierHashrrcipherr$verifier verfiferHashhashs rverifypwzDocumentRC4.verifypw1sxu-S o6GH$$& ##$56 ''(=> 8}##% |T*+|##rctj}d}t|||}tt t j |j|dD]y\}}tt|dt} | j} | j|| jz} |j| |dz }t|||}{|jd|S)z( Return decrypted data. rrNr!)ioBytesIOr enumerateiter functoolspartialreadrrrr$r%finalizewriteseek) r ribuf blocksizeobufrrcbufr*r$decs rdecryptzDocumentRC4.decryptHs zz|xu-Y%6%6tyy)%Lc RS 2FAsDID/:KLF((*I""3')*<*<*>>C JJsO QJE8T51C 2 !  rN)i)__name__ __module__ __qualname__r staticmethodr.rArrrrr-s/ $$,rr)r5r1r&hashlibrstructrcryptography.hazmat.backendsr&cryptography.hazmat.primitives.ciphersr/cryptography.hazmat.decrepit.ciphers.algorithmsr ImportError1cryptography.hazmat.primitives.ciphers.algorithms getLoggerrBlogger addHandler NullHandlerrrrrrrQsy 89GE   8 $%'%%'(044?GFGsA,, A:9A: