[暗号技術入門] 現代の暗号技術の概要

目次の表示
  1. メッセージの暗号化/復号化
  2. 暗号化とは
  3. 暗号化と鍵
  4. デジタル署名とメッセージ認証
  5. 安全な乱数
  6. 鍵交換
  7. 暗号化ハッシュ関数とパスワードハッシュ
  8. 攪拌と拡散
  9. 暗号ライブラリ

暗号化は、数千年前から存在するもので、現在は廃止されている MD5 や DES などの暗号化アルゴリズムを経て、最新の暗号化アルゴリズム (SHA-3、Argon2、ChaCha20 など) まで進化してきました。 ここではまず、開発者が知っておくべき基本的な暗号技術の概念を紹介します。暗号技術には以下の技術があります。

  • ハッシュ関数 (SHA-256、SHA3、RIPEMD など)
  • HMAC (ハッシュ関数を使ったメッセージ認証コード)
  • 鍵導出関数 (PBKDF2 や scrypt など)
  • Diffie-Hellman鍵交換プロトコル
  • 対称鍵暗号 (AES暗号などや、CBCやCTRなどの暗号利用モード)
  • 非対称暗号 (RSA暗号、楕円曲線ベースの暗号化 ECC、secp256k1曲線、Ed25519 暗号システムなど)
  • デジタル署名 (ECDSA)
  • エントロピー、安全な乱数生成
  • 量子安全暗号

メッセージの暗号化/復号化

CyberChef というオンラインで文字列の変換ができるツールがあり、この中に AES による暗号化も含まれています。 次の「CyberChef」ではAES暗号化をオンラインで試すことできるので、適当な入力や鍵を入れて遊んでみてください。

AES暗号化は単純なように見えて、裏にはたくさんの暗号学的な背景があります。 具体的には、パスワードからキー導出関数とそのパラメータ、ブロック暗号モード、暗号初期ベクトル、メッセージ認証コードなど、多くのアルゴリズムと設定がAESの内部で使われています。

暗号化とは

暗号化は、情報のセキュリティと保護(機密性)を提供する技術です。 Webサイトを開いたり、メールを送信したり、Wi-Fiネットワークに接続したりするときなど、デジタル社会のあらゆる場所で使用されています。 システム開発者は、ハッシュ、対称および非対称暗号と暗号化スキーム、デジタル署名とその背後にある暗号システムとアルゴリズムを理解するために、少なくとも暗号化の基本的な理解と、暗号アルゴリズムと暗号ライブラリの使用方法を理解しておく必要があります。

暗号化と鍵

暗号化は、安全な方法でデータを保存および送信し、暗号化を意図した人だけがデータを読み取ったり処理したりできるようにすることを扱います。 これには、対称または非対称暗号化スキームを使用したデータの暗号化と復号が含まれる場合があり、1つ以上の鍵を使用して、データを平文形式から暗号化形式に変換したり、その逆に変換したりします。

対称鍵暗号 (AES、Twofish、ChaCha20 など) はメッセージの暗号化と復号化に同じ鍵を使用します。 一方で、非対称暗号化では公開鍵暗号システム (RSA や ECC など) と鍵ペア、つまり公開鍵 (暗号化鍵) と対応する秘密鍵 (復号化鍵) を使用します。 暗号化アルゴリズムは、多くの場合、暗号化方式 (AES-256-CTR-HMAC-SHA-256、ChaCha20-Poly1305、ECIES-secp256k1-AES-128-GCM など) の組み合わせで表現されています。

暗号化では (キー) が使われており、多くの場面では、これらの鍵は鍵導出アルゴリズム (PBKDF2 や Scrypt など) を使用してパスワード、またはパスフレーズから導出されます。

デジタル署名とメッセージ認証

暗号化は、メッセージの信頼性、完全性、および否認防止を保証するメッセージのデジタル署名の方法を提供しています。 ほとんどのデジタル署名アルゴリズム (DSA、ECDSA、EdDSA など) では、非対称鍵ペア (秘密鍵と公開鍵) を使用します。 メッセージは秘密鍵によって署名され、署名は対応する公開鍵によって検証されます。 例えば、銀行システムでは、支払いの署名と承認にデジタル署名が使用されます。 また、ブロックチェーンでは、署名されたトランザクションにより、ユーザーはブロックチェーン資産をあるアドレスから別のアドレスに転送できます。

暗号化では、メッセージ認証アルゴリズム (HMAC など) とメッセージ認証コード (MAC) を使って、メッセージの信頼性、整合性、作成者を証明します。 安全な通信を確保するために、認証は暗号化と並行して利用されています。

安全な乱数

暗号化では、乱数が使用され、エントロピー (予測不可能なランダム性) と乱数の安全な生成方法 (例: CSPRNG の使用) が必要になります。 安全な乱数は本質的に予測不可能になります。 乱数生成器が壊れていることは、システムやアプリが侵害またはハッキングされていることを意味するため、開発者は乱数に注意する必要があります。

鍵交換

暗号化では、鍵交換アルゴリズム (Diffie-Hellman 鍵交換や ECDH など) と、鍵確立スキームを定義します。 これらは、暗号化でメッセージを安全に送信することを目的とし、2者間で暗号化鍵を安全に共有するために使用されます。 このようなアルゴリズムは通常、最新のWebサイトを開いたときや、WiーFiネットワークに接続したときなどの、2者間で新しい安全な接続が確立されたときに実行されます。

暗号化ハッシュ関数とパスワードハッシュ

暗号化では、メッセージをメッセージダイジェスト (固定長のハッシュ) に変換する暗号ハッシュ関数 (SHA-2 や BLAKE2 など) が提供されます。 メッセージダイジェストは元のメッセージに戻すことができず、入力をほぼ一意に識別します。 例えば、ブロックチェーンシステムでは、ハッシュはブロックチェーンアドレス、トランザクションID、およびその他の多くのアルゴリズムやプロトコルの生成に使用されます。 また、Gitでは、ファイルとコミットの一意の ID を生成するために暗号化ハッシュが使用されます。

攪拌と拡散

暗号化では、ハッシュ、暗号化アルゴリズム、および乱数生成器は、シャノンの攪拌と拡散の原則に従います。 攪拌 (Confusion) とは、暗号の出力形式の各ビットがキーと入力データのいくつかの部分に依存する必要があり、入力と出力の直接的な対応関係(マッピング)を確立できないようにする処理のことです。 拡散 (Diffusion) とは、入力の1ビットを変更すると、出力のビットの約半分が変更される処理のことです。 これらの原則は、入力を攪拌して出力するアルゴリズムで使われている考え方で、ハッシュ関数、MAC アルゴリズム、乱数生成器、対称および非対称暗号に組み込まれています。

暗号ライブラリ

開発者は、自分のプログラミング言語とプラットフォームにおける最新の暗号ライブラリとその使用方法を知っておく必要があります。 暗号化を使用した開発には、暗号の概念を理解する必要があります。 インターネットからコードをコピぺしたり、ブログの例に従ったりすると、設計が安全でなくなり、セキュリティが脆弱になる可能性があります。 暗号化ライブラリは非常に便利ですが、最初に暗号技術の概念を理解し、次にアルゴリズムの適切な組み合わせを選択し、パラメータを慎重に調整する必要があります。