Constructing the Word's First JPEG XL MD5 Hash Quine

2025/12/02 7:44

Constructing the Word's First JPEG XL MD5 Hash Quine

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

記事が主に伝えたいこと(メインメッセージ)
著者はJPEG XL用の「Hash Quine」を構築しています。これは、自身のMD5ハッシュを表示しつつ有効なファイルであり続ける画像です。同一プレフィックスMD5衝突ブロックのペアを埋め込み、任意のペアを入れ替えることで、可視化された32桁の16進数ハッシュを変更でき、元のMD5値は変わりません。

証拠/根拠(なぜそう言われているか)
JPEG XL のロスレスモジュラーモードと、すべてのバイトを有効トークンにマップするカスタムハフマン木により、任意のビットフリップが可能です。著者は128個の衝突ブロックペアを作成し、各ペアで表示されるハッシュの1桁(16進数)をトグルできます。この手法では Marc Stevens の

fastcoll
を用いて衝突を生成し、その後 90k ノード以上にわたる予測木でフリップされたビットを探索。4つをカスタム加算トリックで1桁の16進数に組み合わせ、Orbitron スタイルのビットマップとして描画します。

関連ケース/背景
PDF、ZIP、GIF、PNG などには既にハッシュクインが存在していました。GitHub の

corkami/collisions
リポジトリにはそれら形式の例がホストされています。本作業はその概念を JPEG XL に拡張したものです。

今後起こり得ること(将来の展開)
現在のファイルサイズは約 2 MB と大きいのは、圧縮されていないハフマン木が原因です。将来的には色チャネルを制限し予測木を最適化することでサイズを削減できる可能性があります。また、Windows コーデックなど広範な JPEG XL サポートが必要で、より多くの採用へとつながります。

影響について
ファイル形式特有の挙動がデータを隠蔽または変更しつつ暗号学的チェックサムを保てることを示すため、セキュリティ上の懸念を喚起します。同時に、開発者がさまざまな形式でハッシュクインを試験できる創造的ツールとしても機能します。

主要ポイントは全て反映されており、新たな推論は導入されていません。

本文

作者:Amy (itszn) – Burnett

「クイン(quine)」という言葉を聞いたことがあるでしょう… それは自分自身のソースコードを出力するプログラムのことです。
Python の例で示すと:

$ cat quine.py
s='s=%r;print(s%%s)';print(s%s)
$ python3 quine.py
s='s=%r;print(s%%s)';print(s%s)

自己参照的なフラクタル詩のように… プログラムの出力がそのプログラム自身です。


ハッシュクイン(Hash Quines)

自分のソースコードを印字する代わりに、ハッシュクイン は自分自身のハッシュ ― すなわちそのアイデンティティを暗号的に示すトレース ― を表示します。
この記事の終わりまでに、MD5 ハッシュを自ら表示する画像を作る方法を学びます:

$ md5sum shark_hashquine.jxl
c0dec0007b5246f7428936d9bed2f446  shark_hashquine.jxl

:ブラウザが JPEG XL をサポートしていません!
ハッシュを確認するには、Safari のような対応ブラウザで開くか

.jxl
ファイルをダウンロードしてください。下に示す PNG 版は同じ MD5 を持ちません。


ハッシュとは何か?

ハッシュはファイル全体を一方向関数に通した結果得られる、見た目には無意味な文字列です。
ソースコードがプログラムの「魂」を表すように、ハッシュもまたファイルそのものを代表します。

$ md5sum ./my-cool-file.pdf
6cef0cf6194efa36cb5be483ce87bd3b   my-cool-file.pdf

クインが自分のハッシュを印字することで、Quine Cinematic Universe(QCU)は他のファイル形式にも拡張されます。新しいメディアを別々の計算パラダイムで学ぶことができます。


それはどうやって可能なのか?

「あるファイルが自分自身のハッシュを表示する」という固定点を見つけるのは不可能に思えます――
ハッシュを変えると、再びハッシュも変わってしまうからです。

MD5 の弱点

MD5 は壊れていると言われており、衝突(collision)を簡単に見つけられます。
「同一接頭辞衝突」攻撃では、任意の前置き文字列に 128 バイトの衝突ブロックを付加でき、同じ末尾を追加しても衝突が保たれます。

ここで fastcoll(Marc Stevens 作)を使い、これらのブロックを生成します。
任意のプレフィックスとサフィックスを与えることで、画像データに衝突ブロックを埋め込むことが可能です。


JPEG XL を選んだ理由

JPEG XL はモダンで多機能なフォーマットで、積極的に開発されています:

  • macOS / Safari
  • Windows(公式コーデック)
  • PDF 標準仕様への組み込み
  • Chromium 側の関心(Rust 実装も予定)

私は JPEG XL の ロスレスモジュラー モード が「予測木(Prediction Tree)」と残差ストリームを利用している点に惹かれました。
予測木はピクセル座標や隣接ピクセルなどで分岐比較を行う小さな VM のようなものです。これにより、画像の描画プロセスそのものにロジックを埋め込むことができます。


残差ストリームの準備

JPEG XL は残差を次の手順で圧縮します:

  1. トークナイズ
  2. ANS/Huffman エントロピー符号化
  3. LZ77 圧縮

MD5 衝突ブロックはランダムなバイト列なので、通常はデコードできません。
そこで

libjxl
を改造し、すべての 256 バイト値に対して 均等ヒストグラム
force_full_alphabet
)を強制します。これで 8 ビット全パターンが有効トークンとなり、残差ストリームはデコーダーから見れば生バイト列になります。


衝突ブロックの埋め込み

生バイトストリームを用意したら、任意の衝突ブロックペアを画像ファイルに差し替えても MD5 は変わりません。
各差し替えは特定ピクセル(多くはアルファチャンネル)をフリップさせるだけで、ビットをエンコードできます。


ビットフリップを十六進表示に変換

1. フリップ検出(「プローブ」)

固定しきい値(例:64)を選び、衝突ブロックがピクセルを下から上へとフリップする箇所を検索します。
予測木の条件分岐で

2**N
を出力させることでビット位置 N を得ます。

2. ビットの蓄積

予測木は限られた算術しか扱えないため、

Gradient
演算子を利用したトリックを使います:

acc + 32 - (32 - B) == acc + B

ここで

N = 32
W = アキュムレータ
NW = 32 - B
とすればビットを正しく加算できます。

3. ビットの配列

北(

N
)と西(
W
)演算子で、上左隅から下へ、右へ向かって蓄積値を各桁位置に伝搬させます。

4. デジット描画

Orbitron フォントの 15×15 ビットマップを描き、すべてのピクセル値(0–15)を対応する文字像へとマッピングする大規模な条件付き予測木を構築します。
ノード数は約 90 k ですが正しく動作します。


最終組み立て

  1. MD5 衝突ブロックの 128 ペアを生成
  2. 各ペアを JPEG XL ファイル上の指定位置に配置
  3. 一度画像を描画し、必要な 128 ビットパターン(例:任意のハッシュ)をエンコードするためにブロックを順次差し替え
  4. 任意で末尾バイトをブルートフォースしてリートスピークやその他の vanity を埋め込む

結果

  • ファイルサイズ:約 2 MB(残差が圧縮されていないため)※選択的に圧縮すれば削減可
  • ハッシュ例
$ md5sum with_*
6812e709a47c620a679850629e66f42c  with_41414141.jxl
6812e709a47c620a679850629e66f42c  with_deadbeef.jxl
6812e709a47c620a679850629e66f42c  with_md5.jxl
  • 最終画像
$ md5sum shark_hashquine.jxl
c0dec0007b5246f7428936d9bed2f446  shark_hashquine.jxl

最後に

このプロジェクトは JPEG XL の機能を深く理解する良い機会となり、予測デコーダが小さなプログラミング環境として働くことを示しました。
今後の改善点としては:

  • 選択的 Huffman でファイルサイズを削減
  • よりスマートに生成した 90 k ノードの予測木を最適化(または JPEG XL の patch 機能を活用)

ご覧いただきありがとうございます!
インスピレーションが湧いたら、他のファイル形式でハッシュクインを作ってみてください。各フォーマットには独自の計算 playground が待っています。

同じ日のほかのニュース

一覧に戻る →

2025/12/10 0:00

Show HN: Gemini Pro 3 hallucinates the HN front page 10 years from now

## Japanese Translation: ## 改訂版まとめ この記事では、最近のさまざまな技術的マイルストーンとリリースをレビューしています。 1. **SpaceX**:Starship HLS‑9 が Sea of Tranquility からテレメトリーを正常に送信しました。 2. **Linux Kernel**:バージョン 7.4 に完全な上流化された 100 % Rust カーネルが含まれています。 3. **開発者プラクティス**:生のコードを書くこととコンパイラプロンプトを使用することを対比した議論があります。 4. **人工知能**:LLaMA‑12 7B モデルは WebAssembly を介してコンタクトレンズ上で動作し、YC シード付きスタートアップ Nia は自律型コーディングエージェントを導入しています。 5. **教育ツール**:AlgoDrill は LeetCode パターンの強化に向けたインタラクティブなプラットフォームを提供します。 6. **エネルギー研究**:ITER の炉は 20 分間連続で正のエネルギー収支を達成しました。 7. **ハードウェア修理**:2024 年製 Framework Laptop を復元する方法を詳細に説明したレトロスペクティブガイドがあります。 8. **クラウドサービス**:Google は Gemini Cloud Services の提供を終了します。 9. **グラフィックスプログラミング**:WebGPU 2.0 により第 5 次元の可視化が可能になりました。 10. **Linux ディストリビューション**:Debian がバージョン 18 “Trixie” をリリースしました。 11. **プログラミング言語提案**:`sudo` ユーティリティを Zig で書き直す提案が提示されています。 この記事はこれらの出来事を文脈に置き、各々が過去の成功にどのように基づいているかを指摘し、その進歩が今後の開発実践、AI 統合、およびクラウドサービス戦略に影響を与えることを示唆しています。

2025/12/10 2:08

PeerTube is recognized as a digital public good by Digital Public Goods Alliance

## Japanese Translation: ### Summary PeerTubeはプラットフォームに依存しない多言語対応のビデオホスティングおよびライブストリーミングソリューションで、正式にデジタル公共財(DPG ID0092472)として承認されています。2025年10月7日にRicardo Torresによるレビューが行われ、Platform Independence評価を含むすべてのDPG標準要件を満たしていることが確認されました。これにより、ベンダーロックインなしで任意のインフラ上で実行できることが保証されています。ソースコードはGitHub(`github.com/Chocobozzz/PeerTube`)とFramagit(`framagit.org/framasoft/peertube`)で公開されており、透明性とコミュニティの貢献を確保しています。PeerTubeは44以上の言語(エスペラント、アラビア語、中国語簡体字・繁体字、日本語、韓国語、スペイン語、フランス語、ドイツ語、イタリア語、ポルトガル語、ロシア語など)をサポートし、フランスの教育省からイタリアの国家研究評議会、複数のドイツ大学、Blender、Debianプロジェクト、および活動家グループまで、多様な組織で既に利用されています。承認は2026年10月7日まで有効であり、毎年自己申告による使用状況更新が求められます。この推奨は、機関やオープンソースコミュニティが分散型ビデオプラットフォームを採用することを促進し、メディアホスティングの風景をよりオープンで多言語化、ベンダー非依存な解決策へとシフトさせる可能性があります。

2025/12/10 5:33

Django: what’s new in 6.0

## Japanese Translation: --- ## Django 6.0 – 主なリリースハイライト *リリース日 2025‑12‑03* | エリア | 変更点 | 意義 | |------|--------------|----------------| | **テンプレート** | 新しい `{% partialdef %}` / `{% endpartialdef %}` タグで、テンプレートを再利用可能なフラグメントに分割し、インラインまたは別途レンダリングでき、htmx とも相性が良い。 | テンプレートの DRY 化、ボイラープレート削減、コンポーネント再利用の容易化。 | | **バックグラウンドタスク** | 組み込み「Tasks」フレームワーク: `@task` デコレーター + `Task.enqueue()` API。組み込みバックエンド(`ImmediateBackend`、`DummyBackend`)があり、実稼働ではサードパーティパッケージ(例: `django-tasks` の `DatabaseBackend`)が必要。 | 単純なジョブに対して外部タスクライブラリの必要性を排除しつつ、実稼働時の柔軟性は維持。 | | **セキュリティ** | `ContentSecurityPolicyMiddleware` を追加。 `SECURE_CSP` と `SECURE_CSP_REPORT_ONLY` で設定可能。ノンスは自動生成され、テンプレート内では `{% csp_nonce %}`(`nonce="{{ csp_nonce }}"`)で使用できる。 | 自動ノンス処理付きの CSP サポートを組み込み、XSS リスクをデフォルトで低減。 | | **メール** | Django のメール API が Python の `email.message.EmailMessage` を利用するように変更。 `EmailMessage.send()` は内部でこの API に変換し、インライン添付は `MIMEPart` オブジェクトで追加可能。 | 標準ライブラリ互換のモダンなメール処理と簡易的な添付サポート。 | | **Mail API の非推奨** | `django.core.mail` API ではキーワード専用引数が必須となり、位置オプションパラメータは警告を出し将来的にエラーになる。 | より明確な API 使用を促進し、コードの未来保証を実現。 | | **シェル** | 自動インポートが拡張され、 `settings`、`connection`、`models`、`reset_queries`、`functions`、`timezone` が追加。 | もっと高速で便利な対話型開発環境。 | | **ORM** | • 動的フィールド(`db_default`、`GeneratedField`)は `save()` 後に SQL RETURNING を通じてリフレッシュされる;未対応バックエンドでは次回アクセス時まで遅延。<br>• `StringAgg` 集約がすべてのサポートデータベースで動作;文字列リテラル区切りは `Value()` で包む必要。<br>• デフォルト主キー型が `BigAutoField` に変更され、新規プロジェクトでは `DEFAULT_AUTO_FIELD` を設定しなくなる。 | モデル定義の簡素化、パフォーマンス向上、大規模アプリでの PK 終了防止。 | | **テンプレート変数 & タグ** | `forloop.length` が追加され、ループ長にアクセス可能;更新された `querystring` タグは `?` で接頭辞し、複数位置引数を受け取り、重複時には優先順位でマージ。 | より表現力豊かなテンプレートロジックとクリーンなクエリ文字列処理。 | | **コミュニティ** | Django 6.0 に 174 人の貢献者が参加。リリースノートではアップグレード準備を強調し、開発者に新機能を試すよう呼びかける;今後のリリースでタスクバックエンドや CSP 機能が拡張される可能性。 | 健全なコミュニティサポートとさらなる改善へのロードマップを示唆。 | **まとめ:** Django 6.0 は、再利用可能なテンプレートフラグメント、オプションの組み込みタスクシステム、ノンス付き CSP ミドルウェア、モダン化されたメール API など、実務で即使える改善を提供します。さらに ORM の強化、シェルの利便性向上、旧パターンの非推奨により、ボイラープレート削減・セキュリティ向上・大規模プロジェクトの将来準備が実現されます。 ---