Note
The implementations of the algorithms presented in this repository are to be considered for educational purposes only.
Fast and Portable Cryptography Extension Library for Pyrogram
TgCrypto is a Cryptography Library written in C as a Python extension. It is designed to be portable, fast, easy to install and use. TgCrypto is intended for Pyrogram and implements the cryptographic algorithms Telegram requires, namely:
AES-256-IGE- used in MTProto v2.0.AES-256-CTR- used for CDN encrypted files.AES-256-CBC- used for encrypted passport credentials.
- Python 3.7 or higher.
$ pip3 install -U tgcryptoTgCrypto API consists of these six methods:
defige256_encrypt(data: bytes, key: bytes, iv: bytes) ->bytes: ...
defige256_decrypt(data: bytes, key: bytes, iv: bytes) ->bytes: ...
defctr256_encrypt(data: bytes, key: bytes, iv: bytes, state: bytes) ->bytes: ...
defctr256_decrypt(data: bytes, key: bytes, iv: bytes, state: bytes) ->bytes: ...
defcbc256_encrypt(data: bytes, key: bytes, iv: bytes) ->bytes: ...
defcbc256_decrypt(data: bytes, key: bytes, iv: bytes) ->bytes: ...Note: Data must be padded to match a multiple of the block size (16 bytes).
importosimporttgcryptodata=os.urandom(10*1024*1024+7) # 10 MB of random data + 7 bytes to show paddingkey=os.urandom(32) # Random Keyiv=os.urandom(32) # Random IV# Pad with zeroes: -7 % 16 = 9data+=bytes(-len(data) %16)
ige_encrypted=tgcrypto.ige256_encrypt(data, key, iv)
ige_decrypted=tgcrypto.ige256_decrypt(ige_encrypted, key, iv)
print(data==ige_decrypted) # Trueimportosimporttgcryptodata=os.urandom(10*1024*1024) # 10 MB of random datakey=os.urandom(32) # Random Keyenc_iv=bytearray(os.urandom(16)) # Random IVdec_iv=enc_iv.copy() # Keep a copy for decryptionctr_encrypted=tgcrypto.ctr256_encrypt(data, key, enc_iv, bytes(1))
ctr_decrypted=tgcrypto.ctr256_decrypt(ctr_encrypted, key, dec_iv, bytes(1))
print(data==ctr_decrypted) # TrueimportosfromioimportBytesIOimporttgcryptodata=BytesIO(os.urandom(10*1024*1024)) # 10 MB of random datakey=os.urandom(32) # Random Keyenc_iv=bytearray(os.urandom(16)) # Random IVdec_iv=enc_iv.copy() # Keep a copy for decryptionenc_state=bytes(1) # Encryption state, starts from 0dec_state=bytes(1) # Decryption state, starts from 0encrypted_data=BytesIO() # Encrypted data bufferdecrypted_data=BytesIO() # Decrypted data bufferwhileTrue:
chunk=data.read(1024)
ifnotchunk:
break# Write 1K encrypted bytes into the encrypted data bufferencrypted_data.write(tgcrypto.ctr256_encrypt(chunk, key, enc_iv, enc_state))
# Reset position. We need to read it nowencrypted_data.seek(0)
whileTrue:
chunk=encrypted_data.read(1024)
ifnotchunk:
break# Write 1K decrypted bytes into the decrypted data bufferdecrypted_data.write(tgcrypto.ctr256_decrypt(chunk, key, dec_iv, dec_state))
print(data.getvalue() ==decrypted_data.getvalue()) # TrueNote: Data must be padded to match a multiple of the block size (16 bytes).
importosimporttgcryptodata=os.urandom(10*1024*1024+7) # 10 MB of random data + 7 bytes to show paddingkey=os.urandom(32) # Random Keyenc_iv=bytearray(os.urandom(16)) # Random IVdec_iv=enc_iv.copy() # Keep a copy for decryption# Pad with zeroes: -7 % 16 = 9data+=bytes(-len(data) %16)
cbc_encrypted=tgcrypto.cbc256_encrypt(data, key, enc_iv)
cbc_decrypted=tgcrypto.cbc256_decrypt(cbc_encrypted, key, dec_iv)
print(data==cbc_decrypted) # True- Clone this repository:
git clone https://github.com/pyrogram/tgcrypto. - Enter the directory:
cd tgcrypto. - Install
tox:pip3 install tox - Run tests:
tox.