Note
The project is no longer maintained or supported. Thanks for appreciating it.
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.