Python implementation of DataDome's client-side encryption and decryption.
Project description
DataDome Encryption System: Python Implementation
A clean Python implementation of DataDome's client-side encryption and decryption, with a simple classes and practical usage examples.
Table of Contents
Need DataDome Bypass Solutions?
If you need a reliable DataDome bypass solution for your project, turn to the experts who truly understand the technology. My company, TakionAPI, offers professional anti-bot bypass APIs with proven effectiveness against DataDome and other bot-defense systems.
No more worrying about understanding, reversing, and solving the challenge yourself, or about keeping it up to date every day. One simple API call does it all.
We provide free trials, example implementations, and setup assistance to make the entire process easy and smooth.
- 📄 Check our straightforward documentation
- 🚀 Start your trial
- 💬 Contact us on Discord for custom development and support.
Visit TakionAPI.tech for real, high-quality anti-bot bypass solutions — we know what we're doing.
Installation & Quick Start
Install the module from PyPI:
pip install datadome-encryption
Basic Usage Example
import json
from datadome_encryption import DataDomeDecryptor, DataDomeEncryptor
cid = "YOUR_CLIENT_ID"
hash_str = "YOUR_HASH_STRING"
signals = [
["key1", "value1"],
["key2", 123],
# ... more key-value pairs
]
# Encryption
encryptor = DataDomeEncryptor(hash_str, cid, ctype="captcha")
for key, value in signals:
encryptor.add(key, value)
encrypted = encryptor.encrypt()
print('Encrypted:', encrypted)
# Decryption
decryptor = DataDomeDecryptor(hash_str, cid, ctype="captcha")
decrypted = decryptor.decrypt(encrypted)
print('Decrypted:', decrypted)
Replace YOUR_CLIENT_ID and YOUR_HASH_STRING with your actual values. The signals list should contain your key-value pairs to encrypt.
Full Example: Encryption/Decryption Validity Check
import json
from datadome_encryption import DataDomeDecryptor, DataDomeEncryptor
if __name__ == "__main__":
cid = "k6~sz7a9PBeHLjcxOOWjR162xQq2Uxsx6wLzxeGlO7~6k3JVwDkwAaQ04wdFEMm2Jt2s0y61mLfJdhWuqtqeJzFMuo7Lf8P5btYX0K4EeoLRcNAtNW04rGhTE3nKpMxi"
hash_str = "14D062F60A4BDE8CE8647DFC720349"
excepted_encrypted = open("excepted.txt", "r", encoding="utf-8").read()
original_signals = json.loads(open("original.json", "r", encoding="utf-8").read())
decryptor = DataDomeEncryptor(hash_str, cid, ctype="captcha")
for key, value in original_signals:
decryptor.add(key, value)
encrypted = decryptor.encrypt()
# We ignore the last char on compilation due to the
# fact that is salt based, so unless you pass
# the same salt it will be a different char based
# on the timestamp
print(f"Encryption matches expected? {encrypted[:-1] == excepted_encrypted[:-1]}")
decryptor = DataDomeDecryptor(hash_str, cid, ctype="captcha")
rebuild_decrypted = decryptor.decrypt(encrypted)
original_decrypted = decryptor.decrypt(excepted_encrypted)
mismatch = False
for rebuild, original in zip(rebuild_decrypted, original_decrypted):
rebuild_key, rebuil_value = rebuild[0], rebuild[1]
original_key, original_value = original[0], original[1]
if rebuild_key != original_key or \
rebuil_value != original_value:
mismatch = True
print(f"(ORIGINAL) Mismatch {original_key} {original_value=}")
print(f"(REBUILD ) Mismatch {rebuild_key} {rebuil_value=}")
print("*"*20)
print(f"Got any mismatch on decryption? {mismatch}")
About This Project
This repository provides a clean, well-documented Python implementation of DataDome's client-side encryption and decryption logic. It is designed for:
- Security researchers
- Developers integrating with DataDome-protected endpoints
- Anyone interested in reverse engineering or cryptography
For a full technical analysis, reverse engineering details, and a Node.js implementation, see the Node.js version and the Medium article.
Converting from NodeJS
The hardest part of converting the module from NodeJS to Python was ensuring that all calculations were correctly translated and still executed as 32-bit operations, just as NodeJS/JavaScript does—whereas Python uses 64-bit integers by default.
Author
If you found this project helpful or interesting, consider starring the repo and following me for more security research and tools, or buy me a coffee to keep me up
Development
Running Tests
Install development dependencies:
pip install -r requirements-dev.txt
Run tests with:
pytest
Contributing
Pull requests are welcome! For major changes, please open an issue first to discuss what you would like to change.
Please make sure to update tests as appropriate.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file datadome_encryption-1.1.1.tar.gz.
File metadata
- Download URL: datadome_encryption-1.1.1.tar.gz
- Upload date:
- Size: 12.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
80daf0a7e04a35cd133e6d61879ade67cd13994177678f82ad43e8c4fb7520ca
|
|
| MD5 |
03f1f4e6e89e4ec8464a94f8455a95f5
|
|
| BLAKE2b-256 |
e6a0483a8eb03336678e30f118d939f2ed81666a611b6d8c8ebb9aa0ed412ec8
|
File details
Details for the file datadome_encryption-1.1.1-py3-none-any.whl.
File metadata
- Download URL: datadome_encryption-1.1.1-py3-none-any.whl
- Upload date:
- Size: 10.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3beeb2cf21e35ce6f50c7c9a1656c8c68d4b385ee037d935d00e91d5942d8bbb
|
|
| MD5 |
b7fb5e44a14ed765f42ff2e7b6b08229
|
|
| BLAKE2b-256 |
d4419a252536752d053a80487549ee6b382cbdf21b9261d5941b982e540077d8
|