Skip to main content

Fast and Portable Cryptography Extension Library for Pyrogram

Project description

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:

def ige256_encrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...
def ige256_decrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...

def ctr256_encrypt(data: bytes, key: bytes, iv: bytes, state: bytes) -> bytes: ...
def ctr256_decrypt(data: bytes, key: bytes, iv: bytes, state: bytes) -> bytes: ...

def cbc256_encrypt(data: bytes, key: bytes, iv: bytes) -> bytes: ...
def cbc256_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).

import os

import tgcrypto

data = os.urandom(10 * 1024 * 1024 + 7)  # 10 MB of random data + 7 bytes to show padding
key = os.urandom(32)  # Random Key
iv = os.urandom(32)  # Random IV

# Pad with zeroes: -7 % 16 = 9
data += 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)

import os

import tgcrypto

data = os.urandom(10 * 1024 * 1024)  # 10 MB of random data

key = os.urandom(32)  # Random Key

enc_iv = bytearray(os.urandom(16))  # Random IV
dec_iv = enc_iv.copy()  # Keep a copy for decryption

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

import os
from io import BytesIO

import tgcrypto

data = BytesIO(os.urandom(10 * 1024 * 1024))  # 10 MB of random data

key = os.urandom(32)  # Random Key

enc_iv = bytearray(os.urandom(16))  # Random IV
dec_iv = enc_iv.copy()  # Keep a copy for decryption

enc_state = bytes(1)  # Encryption state, starts from 0
dec_state = bytes(1)  # Decryption state, starts from 0

encrypted_data = BytesIO()  # Encrypted data buffer
decrypted_data = BytesIO()  # Decrypted data buffer

while True:
    chunk = data.read(1024)

    if not chunk:
        break

    # Write 1K encrypted bytes into the encrypted data buffer
    encrypted_data.write(tgcrypto.ctr256_encrypt(chunk, key, enc_iv, enc_state))

# Reset position. We need to read it now
encrypted_data.seek(0)

while True:
    chunk = encrypted_data.read(1024)

    if not chunk:
        break

    # Write 1K decrypted bytes into the decrypted data buffer
    decrypted_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).

import os

import tgcrypto

data = os.urandom(10 * 1024 * 1024 + 7)  # 10 MB of random data + 7 bytes to show padding
key = os.urandom(32)  # Random Key

enc_iv = bytearray(os.urandom(16))  # Random IV
dec_iv = enc_iv.copy()  # Keep a copy for decryption

# Pad with zeroes: -7 % 16 = 9
data += 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/Sanji78/stefano-tgcrypto.
  2. Enter the directory: cd tgcrypto.
  3. Install tox: pip3 install tox
  4. Run tests: tox.

❤️ Donate

If this project helps you, consider buying me a coffee:
PayPal.

..and yes... 😊 the paypal account is correct. Thank you so much!


📜 License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

stefano_tgcrypto-1.4.4-cp314-cp314-musllinux_1_2_x86_64.whl (64.8 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

stefano_tgcrypto-1.4.4-cp314-cp314-musllinux_1_2_aarch64.whl (65.3 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

stefano_tgcrypto-1.4.4-cp313-cp313-musllinux_1_2_x86_64.whl (64.7 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

stefano_tgcrypto-1.4.4-cp313-cp313-musllinux_1_2_aarch64.whl (65.2 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

File details

Details for the file stefano_tgcrypto-1.4.4-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for stefano_tgcrypto-1.4.4-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a0dd183535c5c29f481f3f0ad8ac6428eed51a4d1020239d9d9eb3b0dda7851d
MD5 cf6da0d4fc89b4a4248b3f30880f12b6
BLAKE2b-256 4bb890e609c6a8696db9331506762ec94c1e8c88f0d4a9662deb87a10e720037

See more details on using hashes here.

File details

Details for the file stefano_tgcrypto-1.4.4-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for stefano_tgcrypto-1.4.4-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 23049597f55e1d93ee252b8fb3bc3c0f056ecad0b7992c6032fbd8d4035369a1
MD5 e73bdeed871071bfd1e41fa4e224975b
BLAKE2b-256 a51c282b63df59c0b0912049bce9ceda5837dd07cd7a370ae5519d2c6c5f52f1

See more details on using hashes here.

File details

Details for the file stefano_tgcrypto-1.4.4-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for stefano_tgcrypto-1.4.4-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 ad1d0f7f71db5c4692346e72f70fbcd181e69c5741600f0348e9b1fa57c9c3bc
MD5 4eecf8c60c7ab868718b9066d3b19bbd
BLAKE2b-256 5c2550135c50783e4b0a50b42b57ffcfc94a72768d2fe8aa835e3bcc39504fec

See more details on using hashes here.

File details

Details for the file stefano_tgcrypto-1.4.4-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for stefano_tgcrypto-1.4.4-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0bdd4499965d4c474a849f221725fdab50eb80ba8bc0a23c5f48ee463aaa9f31
MD5 556cb422cdaa6a6957634a6d546086a6
BLAKE2b-256 86f23dd8a63fb310f3b5efdadc3ff0b149e41c124c1d80e1ba6bc09cee9fcce5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page