Skip to main content

Fast and Portable Cryptography Extension Library for Pyrogram

Project description

TgCrypto

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 Distribution

TgCrypto-1.2.5.tar.gz (37.3 kB view hashes)

Uploaded Source

Built Distributions

TgCrypto-1.2.5-pp39-pypy39_pp73-win_amd64.whl (45.2 kB view hashes)

Uploaded PyPy Windows x86-64

TgCrypto-1.2.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (43.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

TgCrypto-1.2.5-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (43.9 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

TgCrypto-1.2.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl (42.9 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

TgCrypto-1.2.5-pp38-pypy38_pp73-win_amd64.whl (45.2 kB view hashes)

Uploaded PyPy Windows x86-64

TgCrypto-1.2.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (43.3 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

TgCrypto-1.2.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (43.9 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

TgCrypto-1.2.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl (42.8 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

TgCrypto-1.2.5-pp37-pypy37_pp73-win_amd64.whl (45.2 kB view hashes)

Uploaded PyPy Windows x86-64

TgCrypto-1.2.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (43.4 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

TgCrypto-1.2.5-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (44.0 kB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

TgCrypto-1.2.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl (42.8 kB view hashes)

Uploaded PyPy macOS 10.9+ x86-64

TgCrypto-1.2.5-cp311-cp311-win_amd64.whl (45.1 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

TgCrypto-1.2.5-cp311-cp311-win32.whl (44.7 kB view hashes)

Uploaded CPython 3.11 Windows x86

TgCrypto-1.2.5-cp311-cp311-musllinux_1_1_x86_64.whl (64.4 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ x86-64

TgCrypto-1.2.5-cp311-cp311-musllinux_1_1_i686.whl (64.4 kB view hashes)

Uploaded CPython 3.11 musllinux: musl 1.1+ i686

TgCrypto-1.2.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (60.7 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

TgCrypto-1.2.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (60.4 kB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

TgCrypto-1.2.5-cp311-cp311-macosx_11_0_arm64.whl (43.1 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

TgCrypto-1.2.5-cp311-cp311-macosx_10_9_x86_64.whl (43.3 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ x86-64

TgCrypto-1.2.5-cp311-cp311-macosx_10_9_universal2.whl (59.0 kB view hashes)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

TgCrypto-1.2.5-cp310-cp310-win_amd64.whl (45.1 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

TgCrypto-1.2.5-cp310-cp310-win32.whl (44.7 kB view hashes)

Uploaded CPython 3.10 Windows x86

TgCrypto-1.2.5-cp310-cp310-musllinux_1_1_x86_64.whl (63.6 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ x86-64

TgCrypto-1.2.5-cp310-cp310-musllinux_1_1_i686.whl (63.6 kB view hashes)

Uploaded CPython 3.10 musllinux: musl 1.1+ i686

TgCrypto-1.2.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (59.9 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

TgCrypto-1.2.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (59.7 kB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

TgCrypto-1.2.5-cp310-cp310-macosx_11_0_arm64.whl (43.1 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

TgCrypto-1.2.5-cp310-cp310-macosx_10_9_x86_64.whl (43.3 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ x86-64

TgCrypto-1.2.5-cp310-cp310-macosx_10_9_universal2.whl (59.0 kB view hashes)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

TgCrypto-1.2.5-cp39-cp39-win_amd64.whl (45.1 kB view hashes)

Uploaded CPython 3.9 Windows x86-64

TgCrypto-1.2.5-cp39-cp39-win32.whl (44.7 kB view hashes)

Uploaded CPython 3.9 Windows x86

TgCrypto-1.2.5-cp39-cp39-musllinux_1_1_x86_64.whl (63.4 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ x86-64

TgCrypto-1.2.5-cp39-cp39-musllinux_1_1_i686.whl (63.4 kB view hashes)

Uploaded CPython 3.9 musllinux: musl 1.1+ i686

TgCrypto-1.2.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (59.7 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

TgCrypto-1.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (59.5 kB view hashes)

Uploaded CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

TgCrypto-1.2.5-cp39-cp39-macosx_11_0_arm64.whl (43.1 kB view hashes)

Uploaded CPython 3.9 macOS 11.0+ ARM64

TgCrypto-1.2.5-cp39-cp39-macosx_10_9_x86_64.whl (43.3 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ x86-64

TgCrypto-1.2.5-cp39-cp39-macosx_10_9_universal2.whl (59.0 kB view hashes)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

TgCrypto-1.2.5-cp38-cp38-win_amd64.whl (45.1 kB view hashes)

Uploaded CPython 3.8 Windows x86-64

TgCrypto-1.2.5-cp38-cp38-win32.whl (44.7 kB view hashes)

Uploaded CPython 3.8 Windows x86

TgCrypto-1.2.5-cp38-cp38-musllinux_1_1_x86_64.whl (63.7 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ x86-64

TgCrypto-1.2.5-cp38-cp38-musllinux_1_1_i686.whl (63.6 kB view hashes)

Uploaded CPython 3.8 musllinux: musl 1.1+ i686

TgCrypto-1.2.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (60.2 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

TgCrypto-1.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (60.0 kB view hashes)

Uploaded CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

TgCrypto-1.2.5-cp38-cp38-macosx_11_0_arm64.whl (43.1 kB view hashes)

Uploaded CPython 3.8 macOS 11.0+ ARM64

TgCrypto-1.2.5-cp38-cp38-macosx_10_9_x86_64.whl (43.3 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ x86-64

TgCrypto-1.2.5-cp38-cp38-macosx_10_9_universal2.whl (59.0 kB view hashes)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

TgCrypto-1.2.5-cp37-cp37m-win_amd64.whl (45.1 kB view hashes)

Uploaded CPython 3.7m Windows x86-64

TgCrypto-1.2.5-cp37-cp37m-win32.whl (44.7 kB view hashes)

Uploaded CPython 3.7m Windows x86

TgCrypto-1.2.5-cp37-cp37m-musllinux_1_1_x86_64.whl (64.7 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ x86-64

TgCrypto-1.2.5-cp37-cp37m-musllinux_1_1_i686.whl (64.7 kB view hashes)

Uploaded CPython 3.7m musllinux: musl 1.1+ i686

TgCrypto-1.2.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (61.4 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ x86-64

TgCrypto-1.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (61.2 kB view hashes)

Uploaded CPython 3.7m manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

TgCrypto-1.2.5-cp37-cp37m-macosx_10_9_x86_64.whl (43.4 kB view hashes)

Uploaded CPython 3.7m macOS 10.9+ x86-64

Supported by

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