Skip to main content

Fast and Portable Cryptography Extension Library for Pyrofork

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/pyrogram/tgcrypto.
  2. Enter the directory: cd tgcrypto.
  3. Install tox: pip3 install tox
  4. Run tests: tox.

License

LGPLv3+ © 2017-present Dan

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.

memoalloce-1.2.9-cp313-cp313-musllinux_1_2_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

memoalloce-1.2.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

memoalloce-1.2.9-cp312-cp312-musllinux_1_2_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

memoalloce-1.2.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

memoalloce-1.2.9-cp311-cp311-musllinux_1_2_x86_64.whl (2.0 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

memoalloce-1.2.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (1.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

File details

Details for the file memoalloce-1.2.9-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for memoalloce-1.2.9-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 9a69e84affa74442100f3128aa98d675c9fd0ec0398726aae967f586d27849df
MD5 fe69bce7b40d39e098fa4a5c4e5d4a52
BLAKE2b-256 be4068dd30932febff1005e75fd90c26fa32145f15d938016225924a19ffd0d6

See more details on using hashes here.

File details

Details for the file memoalloce-1.2.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for memoalloce-1.2.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 b084fbb4b502381c8feef7196b04644c691f44d8ac7e8ee28fecdd3f1a947c70
MD5 1927506029ddedf5cfa9bc7b549fccca
BLAKE2b-256 096ac2d49066e5c8c3ad400311337d0128eef8131c0a675197198e893a7b136e

See more details on using hashes here.

File details

Details for the file memoalloce-1.2.9-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for memoalloce-1.2.9-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 afbadc1b431eb3506a05866fba81a09648b6b28bdf5d911e9bcae3b5f2d43255
MD5 6dca936a9be60f55379b5faf33293b6e
BLAKE2b-256 68c1539c7c4eae7570d1c54a8f62c286ce3b4916ea1fc2ac5dfd35626b2ae65d

See more details on using hashes here.

File details

Details for the file memoalloce-1.2.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for memoalloce-1.2.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e695c039071f8a9552379528d6bf463255dd452b63415d90b86f0aca6a614a5d
MD5 5cffc982d93466d411492a7a0571007e
BLAKE2b-256 073ad9a9b0e4876bc151a2311bcea350e8ce094a3f43fc44f11477a9c991c999

See more details on using hashes here.

File details

Details for the file memoalloce-1.2.9-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for memoalloce-1.2.9-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 6d29938bfaf8e9ddbf77fb1f25ade0025111e5f70c65207ae8f9be67c157bb04
MD5 dbf0c1673ae67bfc5458bf89857b800d
BLAKE2b-256 737b65ff6a535e095a84708d22b29bda9bf51f062481a866268311828a1b2a4d

See more details on using hashes here.

File details

Details for the file memoalloce-1.2.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for memoalloce-1.2.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 825ce32f7ff8ffd888463598fa45042e96632c706fe1d274f0d7cb986cab2f68
MD5 fe3faf7512466e2a803597b900181e6c
BLAKE2b-256 387372aa5385eef0077cb7272d7430358e707b0d31113bdd9c15057d389792d2

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