41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
import secrets
|
|
import struct
|
|
|
|
from cryptography.hazmat.primitives import padding
|
|
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
|
|
|
|
|
|
def as_signed(val: int):
|
|
# converts an integer to a signed int
|
|
return struct.unpack('<i', struct.pack('<I', val & 0xFFFFFFFF))[0]
|
|
|
|
|
|
def aes_cbc_decrypt(key, data, iv, use_padding=True):
|
|
cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
|
|
decryptor = cipher.decryptor()
|
|
plaintext = decryptor.update(data) + decryptor.finalize()
|
|
|
|
if use_padding:
|
|
unpadder = padding.PKCS7(128).unpadder()
|
|
return unpadder.update(plaintext) + unpadder.finalize()
|
|
else:
|
|
return plaintext
|
|
|
|
|
|
def aes_cbc_encrypt(key, data, iv, use_padding=True):
|
|
if iv is None:
|
|
iv = secrets.token_bytes(16)
|
|
cipher = Cipher(algorithms.AES(key), modes.CBC(iv))
|
|
encryptor = cipher.encryptor()
|
|
if use_padding:
|
|
padder = padding.PKCS7(128).padder()
|
|
data = padder.update(data) + padder.finalize()
|
|
return iv, encryptor.update(data) + encryptor.finalize()
|
|
|
|
|
|
def rc4_encrypt(key, data):
|
|
cipher = Cipher(algorithms.ARC4(key), mode=None)
|
|
encryptor = cipher.encryptor()
|
|
# NOTE: Suppress LGTM warning here, we have to do what the spec says
|
|
return encryptor.update(data) + encryptor.finalize() # lgtm
|