# YUA Compressor (`yua-compressor`)
> 自作フォーマット + 可逆圧縮 (zlib / zstd) + **AES-GCM暗号化(任意)** のPythonライブラリ & CLI。
- 拡張子: 推奨 `*.yuac`
- 形式: ヘッダー(固定長+可変) + ペイロード
- 暗号化: AES-256-GCM(`cryptography`)/ PBKDF: scrypt(塩付き)
- 圧縮: zlib(標準)/ zstd(オプション依存 `pip install yua-compressor[zstd]`)
## インストール
```bash
pip install .
# もしくは zstd有効化
pip install .[zstd]
```
## 使い方(Python API)
```python
from yua_compressor import compress_bytes, decompress_bytes
data = b"Hello YUA!" * 1000
blob = compress_bytes(data, algo="zstd", level=3, password="secret") # bytes -> .yuac相当
plain = decompress_bytes(blob, password="secret")
assert plain == data
```
## CLI
```bash
# 圧縮
yuac c input.bin -o output.yuac -a zstd -l 6 -p "pass"
# 展開
yuac x output.yuac -o restored.bin -p "pass"
```
## ヘッダー仕様(v1)
```
offset size desc
0 4 magic = "YUAC"
4 1 version = 1
5 1 flags: bit0 = encrypted(1/0)
6 1 algo: 0=store 1=zlib 2=zstd
7 1 reserved
8 8 original_size (little endian, uint64)
16 16 checksum = blake2s(original, 16 bytes)
32 16 salt (present if encrypted)
48 12 nonce (present if encrypted)
# 以降 payload:
# encrypted ? AES-GCM(ciphertext) : compressed-bytes
```
検証は復号→伸長→チェックサム照合の順で行います。
## ライセンス
MIT
Raw data
{
"_id": null,
"home_page": null,
"name": "yua-compressor",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "compression, zstd, zlib, encryption, AES-GCM, archive, cli",
"author": null,
"author_email": "\u7d50\u611b\u3061\u3083\u3093 <nakamurakensuke5@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/a2/0d/8c431d4556546e8fe76fa5a561a2f0122abbd16a7394ffd9e7e13d73e3e9/yua_compressor-0.1.3.tar.gz",
"platform": null,
"description": "# YUA Compressor (`yua-compressor`)\r\n\r\n> \u81ea\u4f5c\u30d5\u30a9\u30fc\u30de\u30c3\u30c8 + \u53ef\u9006\u5727\u7e2e (zlib / zstd) + **AES-GCM\u6697\u53f7\u5316\uff08\u4efb\u610f\uff09** \u306ePython\u30e9\u30a4\u30d6\u30e9\u30ea & CLI\u3002\r\n\r\n- \u62e1\u5f35\u5b50: \u63a8\u5968 `*.yuac`\r\n- \u5f62\u5f0f: \u30d8\u30c3\u30c0\u30fc\uff08\u56fa\u5b9a\u9577+\u53ef\u5909\uff09 + \u30da\u30a4\u30ed\u30fc\u30c9\r\n- \u6697\u53f7\u5316: AES-256-GCM\uff08`cryptography`\uff09/ PBKDF: scrypt\uff08\u5869\u4ed8\u304d\uff09\r\n- \u5727\u7e2e: zlib\uff08\u6a19\u6e96\uff09/ zstd\uff08\u30aa\u30d7\u30b7\u30e7\u30f3\u4f9d\u5b58 `pip install yua-compressor[zstd]`\uff09\r\n\r\n## \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\r\n```bash\r\npip install .\r\n# \u3082\u3057\u304f\u306f zstd\u6709\u52b9\u5316\r\npip install .[zstd]\r\n```\r\n\r\n## \u4f7f\u3044\u65b9\uff08Python API\uff09\r\n```python\r\nfrom yua_compressor import compress_bytes, decompress_bytes\r\n\r\ndata = b\"Hello YUA!\" * 1000\r\nblob = compress_bytes(data, algo=\"zstd\", level=3, password=\"secret\") # bytes -> .yuac\u76f8\u5f53\r\nplain = decompress_bytes(blob, password=\"secret\")\r\nassert plain == data\r\n```\r\n\r\n## CLI\r\n```bash\r\n# \u5727\u7e2e\r\nyuac c input.bin -o output.yuac -a zstd -l 6 -p \"pass\"\r\n# \u5c55\u958b\r\nyuac x output.yuac -o restored.bin -p \"pass\"\r\n```\r\n\r\n## \u30d8\u30c3\u30c0\u30fc\u4ed5\u69d8\uff08v1\uff09\r\n```\r\noffset size desc\r\n0 4 magic = \"YUAC\"\r\n4 1 version = 1\r\n5 1 flags: bit0 = encrypted(1/0)\r\n6 1 algo: 0=store 1=zlib 2=zstd\r\n7 1 reserved\r\n8 8 original_size (little endian, uint64)\r\n16 16 checksum = blake2s(original, 16 bytes)\r\n32 16 salt (present if encrypted)\r\n48 12 nonce (present if encrypted)\r\n# \u4ee5\u964d payload:\r\n# encrypted ? AES-GCM(ciphertext) : compressed-bytes\r\n```\r\n\u691c\u8a3c\u306f\u5fa9\u53f7\u2192\u4f38\u9577\u2192\u30c1\u30a7\u30c3\u30af\u30b5\u30e0\u7167\u5408\u306e\u9806\u3067\u884c\u3044\u307e\u3059\u3002\r\n\r\n## \u30e9\u30a4\u30bb\u30f3\u30b9\r\nMIT\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "YUA Compressor: custom compression format with optional AES-GCM encryption (zlib/zstd)",
"version": "0.1.3",
"project_urls": {
"Homepage": "https://example.com/yua-compressor",
"Repository": "https://example.com/yua-compressor"
},
"split_keywords": [
"compression",
" zstd",
" zlib",
" encryption",
" aes-gcm",
" archive",
" cli"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "b43f3155406d9e1c7160e754d35d4d8311b3d4a2ddc6e98c57ec3639459940bc",
"md5": "329fbc97c6d5323502ec81f6f030aa0e",
"sha256": "c1efc800456925e7f6bfe72a1db79d71511df5d8a141f4fcc5b2685db44799f1"
},
"downloads": -1,
"filename": "yua_compressor-0.1.3-py3-none-any.whl",
"has_sig": false,
"md5_digest": "329fbc97c6d5323502ec81f6f030aa0e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 6644,
"upload_time": "2025-08-13T02:36:59",
"upload_time_iso_8601": "2025-08-13T02:36:59.537048Z",
"url": "https://files.pythonhosted.org/packages/b4/3f/3155406d9e1c7160e754d35d4d8311b3d4a2ddc6e98c57ec3639459940bc/yua_compressor-0.1.3-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a20d8c431d4556546e8fe76fa5a561a2f0122abbd16a7394ffd9e7e13d73e3e9",
"md5": "024bda27fb6110b6e0be6d1f529e5062",
"sha256": "dffb38b691941d0a60fecae838655c16ec0a7fe2ed0cc94788f08dc5f526cf71"
},
"downloads": -1,
"filename": "yua_compressor-0.1.3.tar.gz",
"has_sig": false,
"md5_digest": "024bda27fb6110b6e0be6d1f529e5062",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 6291,
"upload_time": "2025-08-13T02:37:01",
"upload_time_iso_8601": "2025-08-13T02:37:01.564860Z",
"url": "https://files.pythonhosted.org/packages/a2/0d/8c431d4556546e8fe76fa5a561a2f0122abbd16a7394ffd9e7e13d73e3e9/yua_compressor-0.1.3.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-13 02:37:01",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "yua-compressor"
}