SM4 暗号化 / 復号

SM4 — GB/T 32907-2016、中国国家規格の 128 ビットブロック暗号 — で暗号化・復号します。 PKCS#7 パディングつきの ECB と CBC モードに対応。 出力は openssl enc -sm4-ecb / -sm4-cbc とバイト単位で互換です。 すべてはブラウザー内で実行され、何もアップロードされません。
OpenSSL enc とまったく同様に、PKCS#7 パディングが常に適用されます。
入力の読み取り:
出力の書き込み:
OpenSSL 相互確認 — ここで暗号化してから openssl enc -d -sm4-cbc -K <hexkey> -iv <hexiv> -in file.sm4 -out file.txt (または -sm4-ecb で -iv なし)を実行してください:このページは OpenSSL と同じ PKCS#7 パディングを適用するため、バイトは正確に一致します。
セルフテスト
GB/T 32907-2016 附属書 A.1 の既知応答ベクトル、独立した Python リファレンス実装が生成した 6 本の決定論的 ECB/CBC 相互ベクトル、4 つのサンプルプールすべて、 およびネガティブパス(誤った鍵長、ブロック倍数でない暗号文、改ざんされたパディングの拒否)を再生します。
SM4 とは何か?
一文で言うと:SM4 は中国国家規格のブロック暗号です — 128 ビットブロック、128 ビット鍵、非平衡 Feistel 構造の 32 ラウンド暗号で、 GB/T 32907-2016(旧 GM/T 0002-2012)として制定され、中国の「SM」スイートにおいて NIST 世界における AES と同じ役割を果たします。
SM4 と AES の一目比較
観点SM4AES
ブロックサイズ128 ビット128 ビット
鍵サイズ128 ビットのみ128 / 192 / 256 ビット
ラウンド数3210 / 12 / 14
構造非平衡 Feistel(1 ラウンドで 1 つの 32 ビットワードを更新)置換・転置ネットワーク(毎ラウンドで状態全体)
S ボックス8×8 ボックス 1 個、1 ラウンドに 4 回8×8 ボックス 1 個、1 ラウンドに 16 回 + MixColumns
標準モードECB、CBC(このページ)。TLS スイートでは GCM/CTR(RFC 8998)ECB、CBC、CTR、GCM など
制定2012 年(GM/T 0002-2012。GB/T 32907-2016)。ISO/IEC 18033-3:2010 に収録2001 年(FIPS 197)

同じ仕事、違う設計:どちらも公開された 8×8 S ボックスを持つ 128 ビットブロック暗号ですが、SM4 は軽量な Feistel を 32 ラウンド反復し、AES はより重い状態全体のラウンドを 10〜14 回適用します。ソフトウェアでは、ハードウェア命令(AES-NI)により AES が通常高速です。SM4 は中国プラットフォームの専用 CPU 拡張で同等の地位に達しました。実用的な攻撃はどちらにもなく、128 ビット鍵は 128 ビット鍵です。

なぜ AES の代わりに SM4 を使うのか?

強度ではなくコンプライアンスと相互運用です:中国の商用暗号規制(商用密码)は認定分野で SM スイートを要求し、TLCP や RFC 8998 スイートの TLS 1.3 などのプロトコルは SM4 をネゴシエートします。相手・規制当局・ハードウェアが SM4 しか話さないなら SM4 を使います。自由に選べるなら、このサイトのAES ページの AES-256 が引き続きグローバルなデフォルトです。

よくある間違い
  • 構造化データへの ECB。 同じ平文ブロックは同じ暗号文ブロックを生みます — 古典的なペンギン。データが 1 ブロックを超えるなら、常に新しい IV で CBC(このページのデフォルト)を使ってください。
  • 鍵はちょうど 16 バイト。 AES と違い、SM4 には 192/256 ビット版がありません。「password」のようなパスフレーズは鍵ではありません — まず KDF で導出してください(パスワードハッシュ生成を参照)。
  • パディングを任意と仮定する。 このページは — OpenSSL enc と同様 — 常に PKCS#7 を適用するため、16 バイトの平文は 32 バイトに暗号化されます。パディングなしの生 SM4 は意図的に提供しません。
  • CBC で IV を再利用。 CBC で鍵 + IV の組が繰り返されると、メッセージ先頭の等しさが漏れます。メッセージごとにランダム IV を生成し、暗号文と一緒に送ってください。
よくある質問

OpenSSL と互換性はありますか? はい — バイト単位で。openssl enc -sm4-cbc -K 0011... -iv 4455... -in in.txt -out out.sm4(OpenSSL 1.1.1+)は、同じ鍵・IV・入力に対してこのページが出力する暗号文と正確に一致します。GmSSL も同じです。

なぜ SM4-GCM がないの? 標準周辺のライブラリエコシステムでは、SM4-GCM は主に TLS スタック内で公開されています。このページが合わせているファイル指向のコマンドライン規約(enc)は ECB/CBC をカバーします。認証付き SM4 はプロトコル層の仕事です。

SM4 は WebCrypto にありますか? いいえ — 実装しているブラウザーはありません。だからこのページは、規格自身のテストベクトルを上のセルフテストに組み込んだ、スクラッチからの JavaScript 実装で動きます。

他所で暗号化されたものを復号できますか? はい。モード、鍵、IV、PKCS#7 が使われたことが分かれば — 暗号文を 16 進または Base64 で貼り付け、復号に切り替えて実行するだけです。