o
    i4	                     @  s  U d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ edd	Zed
ddZedddZdaded< d)ddZd*d+ddZd,ddZd-d d!Zed"krd#ZeeZed$e  ed%e  ed&ee  eeeksJ d'ed( dS dS ).a  
Port de SuiteClientes.ReglasNegocio.General.Encrypt/Decrypt (C#) a Python.

Algoritmo: AES-256-CBC con clave derivada por PBKDF2-SHA1 (Rfc2898DeriveBytes,
1000 iteraciones por defecto). El IV es ASCII fijo de 16 bytes.

Padding: el codigo C# usa PaddingMode.Zeros al cifrar y PaddingMode.None al
descifrar (recortando \0 al final). Replicamos exactamente eso para que el
texto cifrado sea bit-a-bit identico al que produce el cliente MIG.
    )annotationsN)Optional)AES)PBKDF2)SHA1AES_PASSWORDzluc1an@1210AES_SALTr1b1s0f7asciiAES_IVz@1B2c3D4e5F6g7H8zOptional[bytes]
_KEY_CACHEreturnbytesc                   C  s   t d u rtttddtda t S )N    i  )dkLencounthmac_hash_module)r   r   PASSWORDSALTr    r   r   $/var/www/html/LicenciasMIG/crypto.py_key   s   r      datablockintc                 C  s(   t | | }|dkr| S | d||   S )Nr       )len)r   r   remr   r   r   
_pad_zeros$   s   r   
plain_textstrc                 C  sF   | du rd} t t t jt}t| d}||}t	|
dS )z>Cifra plain_text como Base64 (compatible con Encrypt() de C#).N utf-8r
   )r   newr   MODE_CBCIVr   encodeencryptbase64	b64encodedecode)r    cipherr   	encryptedr   r   r   r(   +   s   
r(   encrypted_textc                 C  sB   | sdS t t t jt}t| }||}|jddd	dS )z1Descifra el Base64 producido por Encrypt() de C#.r"   r#   ignore)errors )
r   r$   r   r%   r&   r)   	b64decodedecryptr+   rstrip)r.   r,   r   	decryptedr   r   r   r3   5   s   

r3   __main__900123456712z
plain   : z
encrypt : z
decrypt : zroundtrip fallaOK)r   r   )r   )r   r   r   r   r   r   )r    r!   r   r!   )r.   r!   r   r!   )__doc__
__future__r   r)   ostypingr   Crypto.Cipherr   Crypto.Protocol.KDFr   Crypto.Hashr   getenvr   r'   r   r&   r   __annotations__r   r   r(   r3   __name__plainencprintr   r   r   r   <module>   s2    




