tgcrypto/README.rst

240 lines
6.5 KiB
ReStructuredText
Raw Normal View History

2018-02-17 14:19:02 +00:00
|header|
Table of Contents
=================
- `About`_
- `Installation`_
2018-02-19 13:48:05 +00:00
- `API`_
- `Usage`_
2018-02-17 14:19:02 +00:00
- `Contribution`_
- `Feedback`_
- `License`_
About
=====
2018-02-19 14:37:57 +00:00
**TgCrypto** is a high-performance, easy-to-install Telegram Crypto Library written in C as a Python extension.
TgCrypto is intended for Pyrogram [#f1]_ and implements the crypto algorithms Telegram requires, namely
**AES-IGE 256 bit** (used in MTProto v2.0) and **AES-CTR 256 bit** (used for CDN encrypted files).
2018-02-17 14:19:02 +00:00
Installation
============
.. code-block:: bash
2018-03-11 23:30:23 +00:00
  $ pip3 install --upgrade tgcrypto
2018-02-17 14:19:02 +00:00
2018-02-19 14:37:57 +00:00
**Note:** Being a C extension for Python, TgCrypto is an optional but *highly recommended* Pyrogram_ dependency;
if TgCrypto is not detected in your system, Pyrogram will automatically fall back to the much slower PyAES and will
show you a warning.
2018-02-17 14:19:02 +00:00
The reason about being an optional package is that TgCrypto requires some extra system tools in order to be compiled.
The errors you receive when trying to install TgCrypto are system dependent, but also descriptive enough to understand
what you should do next:
- **Windows**: Install `Visual C++ 2015 Build Tools <http://landinghub.visualstudio.com/visual-cpp-build-tools>`_.
- **macOS**: A pop-up will automatically ask you to install the command line developer tools.
- **Linux**: Install a proper C compiler (``gcc``, ``clang``) and the Python header files (``python3-dev``).
- **Termux (Android)**: Install ``clang`` and ``python-dev`` packages.
2018-02-19 13:48:05 +00:00
API
===
2018-09-19 14:10:16 +00:00
TgCrypto API consists of these four methods:
2018-02-19 13:48:05 +00:00
.. code-block:: python
2018-09-19 14:10:16 +00:00
def ige256_encrypt(data: bytes, key: bytes, iv: bytes) -> bytes:
2018-02-19 13:48:05 +00:00
.. code-block:: python
2018-09-19 14:10:16 +00:00
def ige256_decrypt(data: bytes, key: bytes, iv: bytes) -> bytes:
2018-02-19 13:48:05 +00:00
.. code-block:: python
2018-09-19 14:10:16 +00:00
def ctr256_encrypt(data: bytes, key: bytes, iv: bytes, state: bytes) -> bytes:
2018-02-19 13:48:05 +00:00
.. code-block:: python
2018-09-19 14:10:16 +00:00
def ctr256_decrypt(data: bytes, key: bytes, iv: bytes, state: bytes) -> bytes:
2018-02-19 13:48:05 +00:00
Usage
=====
2018-09-19 14:10:16 +00:00
IGE Mode:
---------
**Note**: Data must be padded to match a multiple of the block size (16 bytes).
2018-02-19 13:48:05 +00:00
.. code-block:: python
import os
import tgcrypto
2018-09-19 14:10:16 +00:00
data = os.urandom(10 * 1024 * 1024 + 7) # 10 MB of random data + 7 bytes to show padding
2018-02-19 13:48:05 +00:00
key = os.urandom(32) # Random Key
iv = os.urandom(32) # Random IV
2018-09-19 14:10:16 +00:00
# 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):
------------------------
.. code-block:: python
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):
------------------
.. code-block:: python
import os
import tgcrypto
from io import BytesIO
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
2018-02-19 13:48:05 +00:00
2018-09-19 14:10:16 +00:00
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
2018-02-19 13:48:05 +00:00
2018-02-17 14:19:02 +00:00
Contribution
============
**You are very welcome to contribute** by either submitting pull requests or
reporting issues/bugs as well as suggesting best practices, ideas, enhancements
on both code and documentation. Any help is appreciated!
Feedback
2018-01-27 16:15:32 +00:00
========
2018-02-17 14:19:02 +00:00
Means for getting in touch:
- `Community`_
- `Telegram`_
- `GitHub`_
- `Email`_
License
=======
- Copyright (C) 2017-2018 Dan Tès <https://github.com/delivrance>
- Licensed under the terms of the
`GNU Lesser General Public License v3 or later (LGPLv3+)`_
-----
.. [#f1] Although TgCrypto is intended for `Pyrogram`_, it is shipped as a standalone package and can thus be used for
2018-02-19 14:37:57 +00:00
any other Python project too.
2018-02-17 14:19:02 +00:00
.. _`Community`: https://t.me/PyrogramChat
.. _`Telegram`: https://t.me/haskell
.. _`GitHub`: https://github.com/pyrogram/tgcrypto/issues
.. _`Email`: admin@pyrogram.ml
.. _`GNU Lesser General Public License v3 or later (LGPLv3+)`: COPYING.lesser
.. _`Pyrogram`: https://github.com/pyrogram/pyrogram
.. |header| raw:: html
<h1 align="center">
<a href="https://github.com/pyrogram/tgcrypto">
2018-09-19 14:10:16 +00:00
<div><img src="https://raw.githubusercontent.com/pyrogram/logos/master/logos/tgcrypto_logo2.png" alt="TgCrypto Logo"></div>
2018-02-17 14:19:02 +00:00
</a>
</h1>
2018-02-19 13:48:05 +00:00
2018-02-17 14:19:02 +00:00
<p align="center">
2018-02-19 14:37:57 +00:00
<b>Fast Telegram Crypto Library for Python</b>
2018-02-19 13:48:05 +00:00
2018-02-17 14:19:02 +00:00
<br>
<a href="https://pypi.python.org/pypi/TgCrypto">
Download
</a>
<a href="https://docs.pyrogram.ml/resources/TgCrypto">
Documentation
</a>
<a href="https://t.me/PyrogramChat">
Community
</a>
2018-02-19 14:37:57 +00:00
<br><br>
2018-09-19 14:10:16 +00:00
<a href="https://github.com/pyrogram/pyrogram">
<img src="https://img.shields.io/badge/PYROGRAM-V0.8.0-eda738.svg?longCache=true&style=for-the-badge&colorA=262b30"
alt="TgCrypto">
</a>
2018-02-19 14:37:57 +00:00
<a href="https://github.com/pyrogram/tgcrypto">
2018-09-19 14:10:16 +00:00
<img src="https://img.shields.io/badge/TGCRYPTO-V1.1.1-eda738.svg?longCache=true&style=for-the-badge&colorA=262b30"
2018-02-19 14:37:57 +00:00
alt="TgCrypto">
</a>
2018-02-17 14:19:02 +00:00
</p>
2018-02-19 13:48:05 +00:00
2018-09-19 14:10:16 +00:00
.. |logo| image:: https://raw.githubusercontent.com/pyrogram/logos/master/logos/tgcrypto_logo2.png
2018-02-19 13:48:05 +00:00
:target: https://github.com/pyrogram/tgcrypto
:alt: TgCrypto
2018-03-11 23:30:23 +00:00
.. |description| replace:: **Fast Telegram Crypto Library for Python**