Skip to content
This repository was archived by the owner on Dec 23, 2024. It is now read-only.

Repository files navigation

TgCrypto

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:

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

Topics

Resources

Stars

211 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages