プログラミング
Decayfmt – 開くたびに少しずつ自己破壊するファイルフォーマット
Decayfmt – a file format that corrupts itself a little every time you open it (github.com)
要約
Decayfmtは、ファイルを開くたびにその内容が不可逆的に少しずつ破損していくというユニークなファイルフォーマットです。ファイル名に含まれる「不安定性パラメータ」によって破損の度合いが決まり、画像(.idcy<x>)とテキスト(.tdcy<x>)に対応しています。これは暗号化やDRMではなく、あくまで「社会契約」として機能し、バックアップがあれば元の状態に戻せるため、機密性の保護には向きません。
全文翻訳
decayfmt が This Week in Rust #660 で紹介されました。
これは、ファイルを開くたびに少しずつ自己破壊するファイルフォーマットです。
開くたびに、ファイルはディスク上で永続的に損傷を受けます。その損傷量はファイル名に焼き付けられており、表示される前に発生します。ファイル単体での回復は不可能です。ファイルは唯一のコピーであり、すべての読み取りはその一部をさらに破壊します。
二つのファイルタイプがあります。
* 画像用: .idcy<x> (例: photo.idcy3)
* テキスト用: .tdcy<x> (例: note.tdcy7)
x はファイル名に含まれる正の整数で、不安定性パラメータです。x が大きいほど、開くたびに破損が大きくなります。
その崩壊を見る
上のグリッドは、x=1、x=3、x=8、x=15 でエンコードされた一つの画像で、それぞれ同じ回数だけ開かれました。同じ画像ですが、4つの異なる崩壊率です。
単一の不安定性値を個々のオープンを通して追跡するには、各オープンがファイルが表示される前にディスク上のファイルをさらに破損させ、戻る方法はありません。
クリーンなオリジナル:
不安定性 | 1回オープン後 | 3回オープン後
x=3 (穏やか)
x=10 (深刻)
x=3 では、画像は多くのオープンを経て穏やかに劣化します。x=10 では、一度開いただけでほとんど失われ、3回開くと純粋なノイズになります。
x は、ゆっくりとしたフェードアウトとほぼ瞬時の破壊の間のダイヤルです。
テキストも同様に崩壊します。
数回開いた後に表示される、x=1(ゆっくりとした燃焼)でエンコードされた文:
オリジナル : This sentence is dying, and every time you read it you kill it a little more.
1回オープン : This sgntence is d+ingd !nd every time you re&p it P~u kiKl it a little more}
3回オープン : This sgfxFn0e is d+ingd 3D6 every tibe you re&" it P~u kiKl it a 1ittl> m1re}
6回オープン : TIbm sgf}Fn0e ts d+iqgd yD6 ev*ry tibe you re&" )t Pnu kiKB )t aC1it"l> m1^e}
9回オープン : T/Sm sgf}Fk0- ts d|iqgd HD6 e@*rV tiFe you re&" )t Pnu kiKB )tpaC1it"lYMm1^>}
12回オープン : h/Sm hgf}Nk0-'ts?K|iqgd HD6 e@`~V}t&Fe y%u re&" )2 Pnu kiKB )6UaC1it1lYMm1]b!
破損は常に表示可能な文字に置き換わるため、テキストはバイナリノイズではなく、読めるように見えるナンセンスにぐちゃぐちゃになります。
これは何であり、何ではないか
decayfmt は暗号ではなく、数学によって強制される社会契約です。暗号化、DRM、安全な削除ツールではありません。破損は正直であり、ファイル単体では回復不可能ですが、バックアップや16進エディタを持っている人なら誰でもこれを破ることができます。元の状態が必要なら、バックアップを保持してください。誰にも回復されたくないなら、バックアップを作成しないでください。
インストール
cargo を使用する場合
Rustツールチェーンをお持ちの場合、最も簡単なインストール方法は公開されているクレートです。
cargo install decayfmt
リリースからダウンロード
お使いのプラットフォーム用のバイナリをリリースページからダウンロードし、PATH に配置してください。インストールする必要のあるランタイム依存関係はありません。macOS ではバイナリは署名されていないため、初回実行時に Gatekeeper によってブロックされる場合があります。右クリックして「開く」を選択するか、xattr -d com.apple.quarantine decayfmt でクォーラムフラグをクリアしてください。
ソースから
Rustツールチェーンが必要です。
cargo build --release
バイナリは target/release/decayfmt に生成されます。
クイックスタート
画像やサンプルファイルなしで、ターミナルでその崩壊を見てみましょう。
echo "this sentence is about to start dying" > note.txt
decayfmt encode --input note.txt --output note.tdcy8
decayfmt open note.tdcy8
不安定性 x は出力名から取得されます(note.tdcy8 は x=8 で崩壊します)。最後の行を数回実行して、開くたびに文がさらに腐っていくのを見てください。破損は表示前にディスクに書き込まれるため、戻る方法はありません。8のような高い x は急速にぐちゃぐちゃにし、1のような低い x は多くのオープンにわたるゆっくりとした燃焼です。
Windows PowerShell では、> リダイレクトは UTF-16 を書き込むため、decayfmt は拒否します。代わりに Set-Content note.txt "this sentence is about to start dying" を使用してファイルを作成してください。cmd.exe と PowerShell 7 は上記の行で問題ありません。
使用法
エンコード
ソースの画像またはテキストファイルを decayfmt ファイルに変換します。エンコードは決して破損させず、新しいファイルはクリーンです。
decayfmt encode --input photo.png --output photo.idcy3
decayfmt encode --input note.txt --output note.tdcy7
ファイルタイプと不安定性 x は出力名から取得されます。idcy は画像用、tdcy はテキスト用で、その後に x が正の整数として続きます(photo.idcy3 は x=3 の画像です)。開くことができない出力名は、書き込まずに拒否されます。画像は生の RGBA にデコードされ、テキストは有効な UTF-8 である必要があります。
オープン
decayfmt ファイルを開きます。これはディスク上でインプレースで破損させ、結果を表示します。画像はシステムのデフォルトの画像ビューアで開かれます。テキストはターミナルに出力され、ターミナルがない場合(例えばファイルマネージャーから起動された場合)はデフォルトのテキストエディタでも開かれます。
decayfmt open photo.idcy3
decayfmt open note.tdcy7
x はファイル名から読み取られるため、ファイルをリネームすると、次のオープンがどれだけ強くヒットするかが変わります。
破損の仕組み
オープンごとに、バイトごとの破損確率が x から導出されます。
p = 1 - exp(-x / 10)
したがって、x = 1 は約 9.5% の対象バイトをオープンごとに破損させ、x = 5 は約 39%、x = 10 は約 63% を破損させます。ランダム性は、オペレーティングシステムのエンロピーからシードされた暗号学的に安全なジェネレーターから来ており、固定シードからは来ないため、同じ状態の2つのオープンは異なって見え、破損シーケンスを再現することはできません。
画像: 赤、緑、青の各チャンネルは、確率 p で独立に破損します。アルファチャンネルは決して触れられないため、破損は透明性の穴ではなく、色のノイズとして現れます。
テキスト: 各バイトは、確率 p でランダムな表示可能な ASCII バイトに置き換えられます。これはバイト単位で動作し、文字単位ではないため、高い x では UTF-8 を壊す可能性があります。ビューアは表示できるものを表示し、残りの部分を置換文字に置き換えます。破損はバイトをインプレースで置き換え、挿入または削除は行わないため、ファイル長と変更されないバイトの位置は保持されます。コンテンツは崩壊しますが、構造は崩壊しません。元のバイト長は常に回復可能であり、低い x では単語の長さとレイアウトはほとんど維持されます。スペースは保護されていません。それらは他のバイトと同じ率で置き換えられ、x が上昇するとともに崩壊します。
契約
破損はオープン時にディスクに書き込まれ、その後表示されます。書き込み後のクラッシュやキルは元に戻しません。オープンは常に破損を伴います。読み取り専用ファイルはエラーで拒否され、表示されません。無料の読み取りは契約を破ります。ヘッダーはエンコード後に変更されることはありません。ペイロードのみが崩壊します。ファイル内に状態はありません。読み取りカウンター、タイムスタンプ、誰が開いたか、いつ開いたかの記録はありません。回復メカニズムは一切ありません。
制限事項
これは暗号ではなく、社会契約です。バックアップはそれを完全に無効にします。決意のある人は16進エディタでファイルを改ざんできます。これは安全な削除ツールではなく、暗号学的な保証も行いません。ファイルを表示すると、システムビューア用に一時ファイルに破損した結果が書き込まれます。最新のものは、次のオープンでスイープされるまで、または次のオープンがない場合は無期限に残るため、最後に表示された状態のスナップショットは、それまで回復可能です。同時に実行される2つのオープンは競合する可能性があります。両方とも同じ開始状態を読み取り、最後の書き込みが勝ちます。したがって、同時オープンは逐次オープンよりも少ない破損で済む可能性があります。v1 は画像とテキストのみをサポートします。オーディオ、ビデオ、その他のバイナリ形式はありません。
ライセンス
decayfmt は MIT ライセンスの下でリリースされています。LICENSE を参照してください。