tird


Nametird JSON
Version 0.12.0 PyPI version JSON
download
home_pagehttps://github.com/hakavlad/tird
SummaryA tool for writing random bytes, encrypting file contents, and hiding encrypted data
upload_time2024-05-02 11:53:14
maintainerNone
docs_urlNone
authorAlexey Avramov
requires_python>=3.6
licenseCC0
keywords encryption hiding
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ![Logo: random data visualization](https://raw.githubusercontent.com/hakavlad/tird/main/images/logo.png)

# tird

`tird` *(an acronym for "this is random data")* is a tool for writing random bytes, encrypting file contents, and hiding encrypted data.

> [!NOTE]
> Further "cryptoblob" implies `tird` encryption format.

Using `tird` you can:

1. Create files with random data. Use them as containers or keyfiles.
2. Overwrite the contents of devices and regular files with random data. This can be used to destroy residual data and prepare containers.
3. Encrypt file contents and comments with modern cryptographic primitives. The encrypted file format is [padded uniform random blob (PURB)](https://en.wikipedia.org/wiki/PURB_(cryptography)): it looks like random data and has randomized size. This reduces metadata leakage through file format and length, and also allows cryptoblobs to be hidden among random data.
4. Create [steganographic](https://en.wikipedia.org/wiki/Steganography) (hidden, undetectable) user-driven file systems inside container files and devices. Unlike [Veracrypt](https://veracrypt.fr) containers, `tird` containers do not contain headers at all: the user specifies the location of the data in the container and is responsible for ensuring that this location is separated from the container.
5. Resist [coercive](https://en.wikipedia.org/wiki/Coercion) attacks (keywords: [key disclosure law](https://en.wikipedia.org/wiki/Key_disclosure_law), [rubber-hose cryptanalysis](https://en.wikipedia.org/wiki/Deniable_encryption)). `tird` provides some forms of [plausible deniability](https://en.wikipedia.org/wiki/Plausible_deniability) out of the box even if you encrypt files without hiding them in containers.

## Goals

- Providing protection for individual files, including:
  - symmetric encryption;
  - reducing metadata leakage;
  - hiding encrypted data;
  - plausible deniability.
- Providing a stable encryption format with no [cryptographic agility](https://en.wikipedia.org/wiki/Cryptographic_agility) for long-term data storage.
- Simplicity and no [feature creep](https://en.wikipedia.org/wiki/Feature_creep): refusal to implement features that are not directly related to primary security goals.

## Cryptographic primitives

`tird` uses the following cryptographic primitives:

- `BLAKE2` ([RFC 7693](https://datatracker.ietf.org/doc/html/rfc7693.html)):
  - salted and personalized `BLAKE2b-512` for hashing keyfiles and passphrases;
  - keyed `BLAKE2b-512` for creating message authentication codes;
  - `BLAKE2b-256` for creating message checksums.
- `Argon2` memory-hard function ([RFC 9106](https://datatracker.ietf.org/doc/html/rfc9106/)) for key stretching and key derivation.
- `ChaCha20` cipher ([RFC 7539](https://datatracker.ietf.org/doc/html/rfc7539)) for data encryption.

## Encrypted file format

`tird` encrypted files (cryptoblobs) are indistinguishable from uniform random data and have no identifiable headers. `tird` produces cryptoblobs contain bilateral [randomized padding](https://en.wikipedia.org/wiki/Padding_(cryptography)#Randomized_padding) with uniform random data ([PURBs](https://en.wikipedia.org/wiki/PURB_(cryptography))). This minimizes metadata leaks from the file format and makes it possible to hide cryptoblobs among other random data.

Cryptoblob structure:

```
                     512 B        0+ B
                 +——————————+———————————————+
                 | Comments | File contents |
                 +——————————+———————————————+
  16 B    0+ B   |     Plaintext/Payload    |  64 B      0+ B     16 B
+——————+—————————+——————————————————————————+—————————+—————————+——————+
| Salt | Padding |        Ciphertext        | MAC tag | Padding | Salt |
+——————+—————————+——————————————————————————+—————————+—————————+——————+
|  Random bytes  |     Random-looking bytes           |  Random bytes  |
+————————————————+————————————————————————————————————+————————————————+
```

Alternative scheme:

```
+——————————————————————————————+—————————+
| Salt header: 16 B, 2 parts:  |         |
| BLAKE2b salt[:8] +           |         |
| Argon2 salt[:8]              | Random  |
+——————————————————————————————+ data    |
| Randomized padding: 0-20%    |         |
| of the ciphertext size       |         |
| by default                   |         |
+——————————————————————————————+—————————+
| Ciphertext: 512+ B consist   |         |
| of encrypted comments        |         |
| (always 512 B) and encryped  | Random- |
| payload file contents (0+ B) | looking |
+——————————————————————————————+ data    |
| MAC tag: 64 B                |         |
+——————————————————————————————+—————————+
| Randomized padding: 0-20%    |         |
| of the ciphertext size       |         |
| by default                   | Random  |
+——————————————————————————————+ data    |
| Salt footer: 16 B, 2 parts:  |         |
| BLAKE2b salt[-8:] +          |         |
| Argon2 salt[-8:]             |         |
+——————————————————————————————+—————————+
```

## Hidden user-driven file system and container file format

You can encrypt files and write cryptoblobs over containers starting with arbitary positions.
After finishing writing the cryptoblob, you will be asked to remember the location of the cryptoblob in the container (positions of the beginning and end of the cryptoblob), which can be used in the future to extract the cryptoblob. In this way, you can create a **hidden user-driven file system** inside a container.

It is **hidden** because it is impossible to distinguish between random container data and random cryptoblob data, and it is impossible to determine the location of written cryptoblobs without knowing the positions and keys.

Containers do not contain *any* headers, all data about cryptoblob locations must be stored separately by the user.

The location of the start of the cryptoblob in the container is user-defined, and the location of the start and end positions of the cryptoblob must be stored by the user separately from the container. This is why this "file system" is called a **user-driven file system**.

Container structure (as an example):

```
+—————————————+ Position 0
|             |
| Random data |
|             |
+—————————————+ Cryptoblob1 initial position
|             |
| Cryptoblob1 |
|             |
+—————————————+ Cryptoblob1 final position
|             |
| Random data |
|             |
+—————————————+ Cryptoblob2 initial position
|             |
|             |
| Cryptoblob2 |
|             |
|             |
+—————————————+ Cryptoblob2 final position
| Random data |
+—————————————+
```

## Tradeoffs and limitations

- `tird` does not support public-key cryptography.
- `tird` does not support file compression.
- `tird` does not support ASCII armored output.
- `tird` does not support Reed–Solomon error correction.
- `tird` does not support splitting the output into chunks.
- `tird` does not support low-level device reading and writing when used on MS Windows (devices cannot be used as keyfiles, cannot be overwritten, cannot be encrypted or hidden).
- `tird` does not provide a graphical user interface.
- `tird` does not provide a password generator.
- `tird` can only encrypt one file per iteration. Encryption of directories and multiple files is not supported.
- `tird` does not fake file timestamps (atime, mtime, ctime).
- `tird` encryption speed is not very fast: up to 180 MiB/s (in my tests).

## Warnings

- ⚠️ The author is not a cryptographer.
- ⚠️ `tird` has not been independently audited.
- ⚠️ `tird` probably won't help much when used in a compromised environment.
- ⚠️ `tird` probably won't help much when used with short and predictable keys.
- ⚠️ Sensitive data may leak into the swap space.
- ⚠️ `tird` does not erase sensitive data from memory after use.
- ⚠️ `tird` always releases unverified plaintext (violates [The Cryptographic Doom Principle](https://moxie.org/2011/12/13/the-cryptographic-doom-principle.html)).
- ⚠️ `tird` does not sort digests of keyfiles and passphrases in constant time.
- ⚠️ Overwriting file contents does not mean securely destroying the data on the media.
- ⚠️ Development is not complete, there may be backward compatibility issues in the future.

## Usage

You don't need to remember command line options to use `tird`.

Just start `tird`, select a menu option, and then answer the questions that `tird` will ask:

```bash
$ tird
```

![screenshot: MENU](https://i.imgur.com/h2KG9iy.png)

## Debug

Start `tird` with the option `--debug` or `-d` to look under the hood while the program is running:

```bash
$ tird -d
```

Enabling debug messages additionally shows:

- opening and closing file descriptors;
- real paths to opened files;
- moving file pointers using the seek() method;
- salts, passphrases, digests, keys, nonces, tags;
- some other info.

## Tutorial

See [here](https://github.com/hakavlad/tird/blob/main/docs/tutorial/README.md).

## Requirements

- Python >= 3.6
- [PyNaCl](https://pypi.org/project/PyNaCl/) >= 1.2.0 (provides `Argon2`)
- [PyCryptodomex](https://pypi.org/project/pycryptodomex/) >= 3.6.2 (provides `ChaCha20`)

## Install

Install `python3` and `python3-pip` (or `python-pip`), then run

```bash
$ pip install tird
```

Standalone executables (made with [PyInstaller](https://pyinstaller.org/en/stable/)) are also available (see [Releases](https://github.com/hakavlad/tird/releases)).

![tird.exe](https://i.imgur.com/hjnarbH.png)

## TODO

Write documentation:

- Features;
- User guide;
- Specification;
- Design rationale.

## Feedback

Feel free to post any questions, feedback or criticisms to the [Discussions](https://github.com/hakavlad/tird/discussions).

## License

This project is licensed under the terms of the [Creative Commons Zero v1.0 Universal License](https://github.com/hakavlad/tird/blob/main/LICENSE) (Public Domain Dedication).



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/hakavlad/tird",
    "name": "tird",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.6",
    "maintainer_email": null,
    "keywords": "encryption hiding",
    "author": "Alexey Avramov",
    "author_email": "hakavlad@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/d3/9b/9c067667a847a6db4ef8f00901109bc8533a3d8ddde49ca7273b3806b1d6/tird-0.12.0.tar.gz",
    "platform": null,
    "description": "![Logo: random data visualization](https://raw.githubusercontent.com/hakavlad/tird/main/images/logo.png)\n\n# tird\n\n`tird` *(an acronym for \"this is random data\")* is a tool for writing random bytes, encrypting file contents, and hiding encrypted data.\n\n> [!NOTE]\n> Further \"cryptoblob\" implies `tird` encryption format.\n\nUsing `tird` you can:\n\n1. Create files with random data. Use them as containers or keyfiles.\n2. Overwrite the contents of devices and regular files with random data. This can be used to destroy residual data and prepare containers.\n3. Encrypt file contents and comments with modern cryptographic primitives. The encrypted file format is [padded uniform random blob (PURB)](https://en.wikipedia.org/wiki/PURB_(cryptography)): it looks like random data and has randomized size. This reduces metadata leakage through file format and length, and also allows cryptoblobs to be hidden among random data.\n4. Create [steganographic](https://en.wikipedia.org/wiki/Steganography) (hidden, undetectable) user-driven file systems inside container files and devices. Unlike [Veracrypt](https://veracrypt.fr) containers, `tird` containers do not contain headers at all: the user specifies the location of the data in the container and is responsible for ensuring that this location is separated from the container.\n5. Resist [coercive](https://en.wikipedia.org/wiki/Coercion) attacks (keywords: [key disclosure law](https://en.wikipedia.org/wiki/Key_disclosure_law), [rubber-hose cryptanalysis](https://en.wikipedia.org/wiki/Deniable_encryption)). `tird` provides some forms of [plausible deniability](https://en.wikipedia.org/wiki/Plausible_deniability) out of the box even if you encrypt files without hiding them in containers.\n\n## Goals\n\n- Providing protection for individual files, including:\n  - symmetric encryption;\n  - reducing metadata leakage;\n  - hiding encrypted data;\n  - plausible deniability.\n- Providing a stable encryption format with no [cryptographic agility](https://en.wikipedia.org/wiki/Cryptographic_agility) for long-term data storage.\n- Simplicity and no [feature creep](https://en.wikipedia.org/wiki/Feature_creep): refusal to implement features that are not directly related to primary security goals.\n\n## Cryptographic primitives\n\n`tird` uses the following cryptographic primitives:\n\n- `BLAKE2` ([RFC 7693](https://datatracker.ietf.org/doc/html/rfc7693.html)):\n  - salted and personalized `BLAKE2b-512` for hashing keyfiles and passphrases;\n  - keyed `BLAKE2b-512` for creating message authentication codes;\n  - `BLAKE2b-256` for creating message checksums.\n- `Argon2` memory-hard function ([RFC 9106](https://datatracker.ietf.org/doc/html/rfc9106/)) for key stretching and key derivation.\n- `ChaCha20` cipher ([RFC 7539](https://datatracker.ietf.org/doc/html/rfc7539)) for data encryption.\n\n## Encrypted file format\n\n`tird` encrypted files (cryptoblobs) are indistinguishable from uniform random data and have no identifiable headers. `tird` produces cryptoblobs contain bilateral [randomized padding](https://en.wikipedia.org/wiki/Padding_(cryptography)#Randomized_padding) with uniform random data ([PURBs](https://en.wikipedia.org/wiki/PURB_(cryptography))). This minimizes metadata leaks from the file format and makes it possible to hide cryptoblobs among other random data.\n\nCryptoblob structure:\n\n```\n                     512 B        0+ B\n                 +\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\n                 | Comments | File contents |\n                 +\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\n  16 B    0+ B   |     Plaintext/Payload    |  64 B      0+ B     16 B\n+\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014+\n| Salt | Padding |        Ciphertext        | MAC tag | Padding | Salt |\n+\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014+\n|  Random bytes  |     Random-looking bytes           |  Random bytes  |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\n```\n\nAlternative scheme:\n\n```\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\n| Salt header: 16 B, 2 parts:  |         |\n| BLAKE2b salt[:8] +           |         |\n| Argon2 salt[:8]              | Random  |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+ data    |\n| Randomized padding: 0-20%    |         |\n| of the ciphertext size       |         |\n| by default                   |         |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\n| Ciphertext: 512+ B consist   |         |\n| of encrypted comments        |         |\n| (always 512 B) and encryped  | Random- |\n| payload file contents (0+ B) | looking |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+ data    |\n| MAC tag: 64 B                |         |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\n| Randomized padding: 0-20%    |         |\n| of the ciphertext size       |         |\n| by default                   | Random  |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+ data    |\n| Salt footer: 16 B, 2 parts:  |         |\n| BLAKE2b salt[-8:] +          |         |\n| Argon2 salt[-8:]             |         |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\n```\n\n## Hidden user-driven file system and container file format\n\nYou can encrypt files and write cryptoblobs over containers starting with arbitary positions.\nAfter finishing writing the cryptoblob, you will be asked to remember the location of the cryptoblob in the container (positions of the beginning and end of the cryptoblob), which can be used in the future to extract the cryptoblob. In this way, you can create a **hidden user-driven file system** inside a container.\n\nIt is **hidden** because it is impossible to distinguish between random container data and random cryptoblob data, and it is impossible to determine the location of written cryptoblobs without knowing the positions and keys.\n\nContainers do not contain *any* headers, all data about cryptoblob locations must be stored separately by the user.\n\nThe location of the start of the cryptoblob in the container is user-defined, and the location of the start and end positions of the cryptoblob must be stored by the user separately from the container. This is why this \"file system\" is called a **user-driven file system**.\n\nContainer structure (as an example):\n\n```\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+ Position 0\n|             |\n| Random data |\n|             |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+ Cryptoblob1 initial position\n|             |\n| Cryptoblob1 |\n|             |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+ Cryptoblob1 final position\n|             |\n| Random data |\n|             |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+ Cryptoblob2 initial position\n|             |\n|             |\n| Cryptoblob2 |\n|             |\n|             |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+ Cryptoblob2 final position\n| Random data |\n+\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014+\n```\n\n## Tradeoffs and limitations\n\n- `tird` does not support public-key cryptography.\n- `tird` does not support file compression.\n- `tird` does not support ASCII armored output.\n- `tird` does not support Reed\u2013Solomon error correction.\n- `tird` does not support splitting the output into chunks.\n- `tird` does not support low-level device reading and writing when used on MS Windows (devices cannot be used as keyfiles, cannot be overwritten, cannot be encrypted or hidden).\n- `tird` does not provide a graphical user interface.\n- `tird` does not provide a password generator.\n- `tird` can only encrypt one file per iteration. Encryption of directories and multiple files is not supported.\n- `tird` does not fake file timestamps (atime, mtime, ctime).\n- `tird` encryption speed is not very fast: up to 180 MiB/s (in my tests).\n\n## Warnings\n\n- \u26a0\ufe0f The author is not a cryptographer.\n- \u26a0\ufe0f `tird` has not been independently audited.\n- \u26a0\ufe0f `tird` probably won't help much when used in a compromised environment.\n- \u26a0\ufe0f `tird` probably won't help much when used with short and predictable keys.\n- \u26a0\ufe0f Sensitive data may leak into the swap space.\n- \u26a0\ufe0f `tird` does not erase sensitive data from memory after use.\n- \u26a0\ufe0f `tird` always releases unverified plaintext (violates [The Cryptographic Doom Principle](https://moxie.org/2011/12/13/the-cryptographic-doom-principle.html)).\n- \u26a0\ufe0f `tird` does not sort digests of keyfiles and passphrases in constant time.\n- \u26a0\ufe0f Overwriting file contents does not mean securely destroying the data on the media.\n- \u26a0\ufe0f Development is not complete, there may be backward compatibility issues in the future.\n\n## Usage\n\nYou don't need to remember command line options to use `tird`.\n\nJust start `tird`, select a menu option, and then answer the questions that `tird` will ask:\n\n```bash\n$ tird\n```\n\n![screenshot: MENU](https://i.imgur.com/h2KG9iy.png)\n\n## Debug\n\nStart `tird` with the option `--debug` or `-d` to look under the hood while the program is running:\n\n```bash\n$ tird -d\n```\n\nEnabling debug messages additionally shows:\n\n- opening and closing file descriptors;\n- real paths to opened files;\n- moving file pointers using the seek() method;\n- salts, passphrases, digests, keys, nonces, tags;\n- some other info.\n\n## Tutorial\n\nSee [here](https://github.com/hakavlad/tird/blob/main/docs/tutorial/README.md).\n\n## Requirements\n\n- Python >= 3.6\n- [PyNaCl](https://pypi.org/project/PyNaCl/) >= 1.2.0 (provides `Argon2`)\n- [PyCryptodomex](https://pypi.org/project/pycryptodomex/) >= 3.6.2 (provides `ChaCha20`)\n\n## Install\n\nInstall `python3` and `python3-pip` (or `python-pip`), then run\n\n```bash\n$ pip install tird\n```\n\nStandalone executables (made with [PyInstaller](https://pyinstaller.org/en/stable/)) are also available (see [Releases](https://github.com/hakavlad/tird/releases)).\n\n![tird.exe](https://i.imgur.com/hjnarbH.png)\n\n## TODO\n\nWrite documentation:\n\n- Features;\n- User guide;\n- Specification;\n- Design rationale.\n\n## Feedback\n\nFeel free to post any questions, feedback or criticisms to the [Discussions](https://github.com/hakavlad/tird/discussions).\n\n## License\n\nThis project is licensed under the terms of the [Creative Commons Zero v1.0 Universal License](https://github.com/hakavlad/tird/blob/main/LICENSE) (Public Domain Dedication).\n\n\n",
    "bugtrack_url": null,
    "license": "CC0",
    "summary": "A tool for writing random bytes, encrypting file contents, and hiding encrypted data",
    "version": "0.12.0",
    "project_urls": {
        "Bug Tracker": "https://github.com/hakavlad/tird/issues",
        "Documentation": "https://github.com/hakavlad/tird/blob/main/README.md",
        "Homepage": "https://github.com/hakavlad/tird"
    },
    "split_keywords": [
        "encryption",
        "hiding"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2db2c948f452c724b4baae1f56b30dac82a09345bca4e369d855e69775ad3da3",
                "md5": "797f8a5b2d5c8400a71e195783627850",
                "sha256": "1390a34b8f05427e0b992b1d905dd81476ce0bb0d6a646b44bdfaf9e01dd7e53"
            },
            "downloads": -1,
            "filename": "tird-0.12.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "797f8a5b2d5c8400a71e195783627850",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.6",
            "size": 15940,
            "upload_time": "2024-05-02T11:53:11",
            "upload_time_iso_8601": "2024-05-02T11:53:11.760066Z",
            "url": "https://files.pythonhosted.org/packages/2d/b2/c948f452c724b4baae1f56b30dac82a09345bca4e369d855e69775ad3da3/tird-0.12.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d39b9c067667a847a6db4ef8f00901109bc8533a3d8ddde49ca7273b3806b1d6",
                "md5": "2564f61f9b6bad94752179c3350fc5aa",
                "sha256": "2074f7258a1d2f1e7e6fb6762f98a8a85c3940286841471ab85b039ce13fcc9c"
            },
            "downloads": -1,
            "filename": "tird-0.12.0.tar.gz",
            "has_sig": false,
            "md5_digest": "2564f61f9b6bad94752179c3350fc5aa",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.6",
            "size": 19911,
            "upload_time": "2024-05-02T11:53:14",
            "upload_time_iso_8601": "2024-05-02T11:53:14.839523Z",
            "url": "https://files.pythonhosted.org/packages/d3/9b/9c067667a847a6db4ef8f00901109bc8533a3d8ddde49ca7273b3806b1d6/tird-0.12.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-02 11:53:14",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "hakavlad",
    "github_project": "tird",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "tird"
}
        
Elapsed time: 0.25857s