Skip to content

Repository files navigation

TgCrypto

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:

Requirements

  • Python 3.7 or higher.

Installation

$ pip3 install -U tgcrypto

API

TgCrypto 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: ...

Usage

IGE Mode

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) # True

CTR Mode (single chunk)

importosimporttgcryptodata=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) # True

CTR Mode (stream)

importosfromioimportBytesIOimporttgcryptodata=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()) # True

CBC Mode

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 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

Testing

  1. Clone this repository: git clone https://github.com/pyrogram/tgcrypto.
  2. Enter the directory: cd tgcrypto.
  3. Install tox: pip3 install tox
  4. Run tests: tox.

License

LGPLv3+ © 2017-present Dan

About

Fast and Portable Cryptography Extension Library for Pyrogram

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages