メインコンテンツへスキップ

共通鍵暗号

このレッスンでは、その効率性によって保存中および転送中のデータの多くを保護する共通鍵暗号について学びます。

レッスンの終わりまでに、以下の内容を網羅します:

  • 共通鍵暗号とは何か
  • 共通鍵暗号の使用方法を示す Python コード例
  • 共通鍵暗号の応用例の概観
  • 共通鍵暗号のアプリケーション
  • 共通鍵暗号のセキュリティ
  • 古典コンピュータおよび量子コンピュータからのこれらのアルゴリズムへの脅威

共通鍵暗号の概要

共通鍵暗号(SKC) は、最も古く、最も直感的な暗号化の形式です。SKC では、機密情報は共通鍵暗号化(SKE)によって保護されます。すなわち、暗号化と復号の両方に 単一の秘密鍵 を用います。

SKC には以下が含まれます:

  • 秘密鍵を使用して与えられた平文を 暗号文 に変換する暗号化関数
  • 同じ秘密鍵を使用して暗号文を平文に戻すことで、その操作を逆にする復号関数

平文とは、自然言語テキストやバイナリコードなど、情報の内容に原則として直接アクセスできる、暗号化されていないあらゆる種類のデータを意味します。一方、暗号文 とは、復号前にその情報の内容へのアクセスが意図的に不可能にされている暗号化済みデータを指します。

共有秘密鍵を使用した暗号化・復号操作を記述するアルゴリズムは、対称暗号とも呼ばれます。

図1:同じ鍵を使用して与えられた平文を暗号文に共通鍵暗号化し、平文に復号する様子。

図1. 同じ鍵を使用して与えられた平文を暗号文に共通鍵暗号化し、平文に復号する様子。

共通鍵暗号システムの性質

共通鍵暗号システムは、静的に保存されたデータや何らかの伝送チャネルを通じた通信の両方において、メッセージを保護するために以下の性質を確保する必要があります:

  • 機密性(Confidentiality): 暗号化されたメッセージの情報の内容が、無断アクセスから保護されているという性質を指します。
  • 完全性(Integrity): 保存または転送中に暗号化されたメッセージへの改ざんを検出できるという性質を指します。
  • 真正性(Authenticity): メッセージの受信者が送信者の身元を確認し、権限のない第三者によるなりすましを検出できるという性質を指します。

さらに、これらの性質は、暗号化・復号に使用されるアルゴリズムや暗号が公開されている場合でも、暗号化されたメッセージの情報の内容へのアクセスが秘密鍵へのアクセスのみを通じて独占的に制御される設定で実現される必要があります。

したがって、安全な共通鍵暗号システムを実装するには、主に2つのタスクが必要です:

  1. 暗号解読攻撃に対して耐性のある堅牢な共通鍵暗号アルゴリズムを採用すること。
  2. 秘密鍵の配布と管理における機密性を確保すること。

このレッスンでは、SKC 技術の主な関心事である最初のタスクに関連する側面について説明します。ただし、2番目のタスクは SKC 自体の範囲外の解決策を必要とするため、後ほど紹介します。

Python を用いた共通鍵暗号化の実例

古典的な シーザーシフト暗号 と、2001年から共通鍵暗号の標準となっている現代の Advanced Encryption System(AES)を使用した暗号化・復号操作の簡単な例を示します。 まず、必要な共通鍵暗号化アルゴリズムを提供する Python ライブラリをセットアップし、暗号化したい平文を定義します。

# Added by doQumentation — required packages for this notebook
!pip install -q cryptography numpy secretpy
# Install the library if needed
# %pip install secretpy

# import the required crypto functions which will be demonstrated later
from secretpy import Caesar
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from functools import reduce
import numpy as np

# Set the plaintext we want to encrypt
plaintext = "this is a strict top secret message for intended recipients only"
print(f"\nGiven plaintext: {plaintext}")

2つの異なる共通鍵暗号化方式を使用して暗号化・復号する方法を示します:

  1. 古典的なシーザーシフト暗号
  2. 現代のAdvanced Encryption Standard AES-256 プロトコル

シーザーシフト暗号

シーザーシフト暗号化では以下を定義します:

  • エンコードする可能な文字のアルファベット
  • 0(暗号化なし)からアルファベットの長さまでのシフト値。これをとみなします。

平文の各文字が暗号文中の別の文字に置換されるため、単一換字式暗号と呼ばれます。

この例では、アルファベットの小文字を使用します。

まずセットアップを行いましょう。

# initialize the required python object for doing Caesar shift encryption
caesar_cipher = Caesar()

# Define the shift, ie the key
caesar_key = 5
print(f"Caesar shift secret key: {caesar_key}")

# Define the alphabet
alphabet = (
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s",
"t",
"u",
"v",
"w",
"x",
"y",
"z",
" ",
)
print(f"alphabet: {alphabet}")

平文を暗号化して、シーザー暗号の暗号文を得ます。

caeser_ciphertext = caesar_cipher.encrypt(plaintext, caesar_key, alphabet)
print(f"Encrypted caeser shift ciphertext: {caeser_ciphertext}")

暗号化に使用した同じ鍵を使用して、暗号文を元の平文に復号します。

caeser_plaintext = caesar_cipher.decrypt(caeser_ciphertext, caesar_key, alphabet)
print(f"Decrypted caeser shift plaintext: {caeser_plaintext}\n")

Advanced Encryption Standard(AES)暗号

次に、一般的な共通鍵暗号化アルゴリズムである AES を使用して平文を暗号化します。

まず、鍵を作成します。この場合はランダムな16文字の文字列です。

# lambda defines an inline function in this case that takes two values a,b with the resulting expression of a+b
# reduce uses a two-argument function(above), and applies this to all the entries in the list (random alphabet characters) cumulatively
aes_key = reduce(lambda a, b: a + b, [np.random.choice(alphabet) for i in range(16)])

print(f"AES secret key: {aes_key}")

AES は複数の動作モードをサポートしており、どれを使用するかを指定する必要があります。

cryptography ライブラリの modes.CBC クラスが提供する暗号ブロック連鎖(CBC)モードを選択します。AES の CBC モードは、追加のセキュリティのために乱数を使用します。これには、ランダムな初期化ベクトル(IV)、または ノンス とも呼ばれるものを指定する必要があります。鍵と同様に、ランダムな文字列を使用します。

aes_initialization_vector = reduce(
lambda a, b: a + b, [np.random.choice(alphabet) for i in range(16)]
)
print(f"AES initialization vector: {aes_initialization_vector}")

秘密メッセージの送信者のために AES 暗号を初期化できます。初期化ベクトルが CBC 動作モードのセットアップのために modes.CBC クラスに渡されていることに注目してください。

その後、送信する平文を暗号化します。

# The encryptor is setup using the key and CBC. In both cases we need to convert the string (utf-8) into bytes
sender_aes_cipher = Cipher(
algorithms.AES(bytes(aes_key, "utf-8")),
modes.CBC(bytes(aes_initialization_vector, "utf-8")),
)
aes_encryptor = sender_aes_cipher.encryptor()

# update can add text to encypt in chunks, and then finalize is needed to complete the encryption process
aes_ciphertext = (
aes_encryptor.update(bytes(plaintext, "utf-8")) + aes_encryptor.finalize()
)

# Note the output is a string of bytes
print(f"Encrypted AES ciphertext: {aes_ciphertext}")

復号するために、受信者のために AES 暗号を初期化します。意図された受信者は秘密鍵と初期化ベクトルの両方にアクセスできますが、後者は秘密にする必要はありません。

# Similar setup of AES to what we did for encryption, but this time, for decryption
receiver_aes_cipher = Cipher(
algorithms.AES(bytes(aes_key, "utf-8")),
modes.CBC(bytes(aes_initialization_vector, "utf-8")),
)
aes_decryptor = receiver_aes_cipher.decryptor()

# Do the decryption
aes_plaintext_bytes = aes_decryptor.update(aes_ciphertext) + aes_decryptor.finalize()

# convert back to a character string (we assume utf-8)
aes_plaintext = aes_plaintext_bytes.decode("utf-8")

print(f"Decrypted AES plaintext: {aes_plaintext}")

共通鍵暗号の応用

シーザー暗号 などの古典暗号はずいぶん前に廃れましたが、AES などの現代の共通暗号システムは、以下を含む幅広い応用分野で展開されています

  1. データの暗号化と復号: SKC は、デバイスに静的に保存されているか、ネットワーク上で転送されているかにかかわらず、機密データを保護するために広く使用されています。例としては、ユーザー認証情報の保護、メールメッセージの暗号化、金融取引のセキュリティ確保などがあります。

  2. 安全な通信: SSL/TLS などの一般的な通信プロトコルは、共通鍵暗号と公開鍵暗号の組み合わせを使用して、2者間で交換されるデータの機密性と完全性を確保します。これらのメッセージは、共有鍵を使用する共通鍵暗号化によって暗号化・復号されます。共通鍵暗号化に使用される鍵は、公開鍵と秘密鍵のペアを使用する公開鍵暗号化を使用して安全に交換されます。共通鍵暗号化はより高速であるため、大きなサイズのメッセージの暗号化に使用できます。

  3. 真正性の検証: 一部の設定では、SKC はメッセージ認証コード(MAC)や鍵付きハッシュ MAC(HMAC)などの技術を通じて採用され、メッセージの 真正性完全性 を検証し、改ざん耐性のある通信を確保します。

  4. ファイルおよびディスクの暗号化: フルディスク暗号化ソフトウェアやファイル暗号化ツールは、SKC を採用してハードディスクやポータブルストレージデバイスに保存された機密データを保護します。

  5. 仮想プライベートネットワーク: 盗聴から自由な機密通信チャネルを提供することを目的とした VPN 技術は、リモートユーザーや企業ネットワークを接続するために共通鍵暗号化または公開鍵暗号化を使用できます。

SKC が展開される多様な応用分野は、対称暗号システムが特定の基準を満たすことを求めます。

共通鍵暗号化の原則

このセクションでは、共通鍵暗号アルゴリズムのセキュリティを支える基本的な原則のいくつかについて説明します。

ブルートフォース攻撃への耐性: 暗号化アルゴリズムのセキュリティに対する最も基本的な要件は、鍵空間のサイズ—言い換えれば、そのアルゴリズムを使用した人が選択できる可能性のある異なる鍵の数—が非常に大きいことです。

暗号解読攻撃への耐性: 共通鍵か否かを問わず、暗号に対する2番目の基本的な要件は、情報的に 判読不能な 暗号文を生成できることです。この目的のために、情報理論の観点からは必要条件(十分条件ではない)として、暗号文は高エントロピーであることが特徴的でなければならず、識別可能なパターンや相関関係のないランダムなテキストと区別がつかないものでなければなりません。これにより、攻撃者は頻度解析やその他の統計的技術を使って暗号文を分析しようとしても、平文や秘密鍵に関する情報を得ることができません。

意味的安全性 を確保するのに十分な一般的な形の暗号解読攻撃への耐性は、識別不可能性 の概念によって形式化されます。識別不可能性にはいくつかの変形がありますが、共通暗号システムが選択平文攻撃下の識別不可能性(IND-CPA)の基準を満たす場合、意味的に安全と見なされます。これは、攻撃者が選択した複数の平文をアルゴリズムに送信して対応する暗号文を見ることができる場合でも、2つの異なるメッセージの暗号化を区別できないことを意味します。

後で検討するように、IND-CPA は通常、ランダム性の使用を必要とし、与えられた平文が与えられた秘密鍵で暗号化されるたびに、結果として生じる暗号文が各暗号化で予測不可能に異なることを確保します。

古典暗号の失敗モード: 1970年代の現代暗号の出現以前、実用的に使用されていたほとんどの古典暗号は、上記の要件の一方または両方を満たすことができませんでした。例えば、単一換字式のシーザーシフト暗号などの初期の換字式暗号は、小さな鍵空間サイズ(表1参照)と低エントロピーの暗号文の両方を特徴としており、ブルートフォース攻撃、頻度解析、既知平文(KPT)攻撃など、さまざまな暗号解読攻撃に対して脆弱でした。

その後の多アルファベット換字式暗号、例えばヴィジュネル暗号エニグマ機械暗号は、事実上大きな鍵空間サイズを特徴としており、ブルートフォース攻撃に対して耐性がありましたが、それぞれ頻度解析と KPT 攻撃に対して脆弱でした。換字式暗号と同様に、メッセージ内の文字を置換する代わりに並べ替える古典的な転置暗号も、アナグラム攻撃、統計解析、ブルートフォース、KPT 攻撃などさまざまな攻撃によって危殆化されます。

理論的には、ワンタイムパッド(OTP)と呼ばれる多アルファベット換字式暗号は暗号学的に安全であることが知られています。OTP は、(1)ランダムに選ばれた文字またはビットで構成され、(2)元の平文と少なくとも同じ長さで、(3)一度だけ使用される秘密鍵を特徴とします。OTP は実際のアプリケーションには実用的ではありません。なぜなら、平文と同じ長さで一度しか使用できない秘密鍵を安全に共有できるなら、元の平文も同様に共有できるからです。OTP は代わりに、安全な暗号文を生成するためのランダム性の有用性を示しています。

ブルートフォース検索を実装してメッセージを復号する鍵を見つけようとする攻撃者は、鍵空間サイズに比例した数の操作を実行しなければなりません。

したがって、大きな鍵空間サイズは、ブルートフォース攻撃を計算上実行不可能にすることで、それらへの耐性を提供します。表1 にいくつかのよく知られた暗号の鍵空間サイズを示します。

表1:いくつかの共通鍵暗号の鍵空間サイズ

暗号鍵の長さ鍵空間サイズ
Caeser shift1アルファベットサイズ
Vigenerenアルファベットサイズn^\mathrm{n}
One-time-pad平文の長さアルファベットサイズplaintextlength^\mathrm{plaintext-length}
DES56256^\mathrm{56}
AES-1281282128^\mathrm{128}
AES-1921922192^\mathrm{192}
AES-2562562256^\mathrm{256}
ChaCha202562256^\mathrm{256}
現代の共通鍵暗号方式は、古典暗号の限界をほぼ克服しています。これらは 暗号解読 に耐性のある暗号文を生成し、大きな鍵空間サイズを特徴とするとともに、OTP よりもはるかに実用的に効率的です。

ブロック暗号: 現代の暗号の一クラス — DESAES など — は、クロード・シャノンが最初に提唱した 攪拌と拡散の原則を組み合わせることでセキュリティを実現します。暗号化方式がメッセージの二進表現で動作する設定でこれらの概念を説明します:

  • 攪拌(Confusion): 攪拌とは、暗号文の各ビットが秘密鍵の複数のビットに依存するという特性です。秘密鍵のわずかな変化が暗号文のほぼすべてのビットを変更し、暗号文と秘密鍵の関係を不明確にします。

  • 拡散(Diffusion): 拡散とは、平文の1ビットを反転させると暗号文のほぼ半分のビットが変化し、その逆も同様であるという特性です。拡散は平文と暗号文の間の統計的関係を隠します。適切な拡散を持つ暗号は、暗号学のいわゆる アバランシェ基準 を満たします。

ブロック暗号は、離散的なデータブロックで動作する換字置換ネットワーク(SPN)として知られる暗号構造を使用して攪拌と拡散を実装します。SPN は平文のブロックと秘密鍵を入力として受け取り、暗号文ブロックを生成するために指定された数のラウンドの変換を実行します。各ラウンドは、換字ボックス (S-box) と置換ボックス (P-box) と呼ばれる交互の数学的構造、または等価な操作で構成されます。

これらはそれぞれ入力ブロックに対して複雑な非線形および線形変換を実装し、暗号文にアバランシェ効果をもたらします。

SPN は、ラウンド 数を増やすことが通常は暗号のセキュリティを高めるように設計されています。これがセキュリティマージンの概念につながります。 セキュリティマージン: 与えられた SPN ベースの暗号のセキュリティマージンは、暗号の完全な実装におけるラウンド数と、最もよく知られている現実世界の攻撃を使用して破ることができることが知られている最大ラウンド数との差です。

例えば、現在のところ標準モードである電子符号表(ECB)モードで使用した場合、AES-256 に対する現在最もよく知られた高速ブルートフォース攻撃は、完全な暗号の全14ラウンドのうち9ラウンドまでを破ることができます。したがって、現在のところ AES-256 のセキュリティマージンは5ラウンドです

ストリーム暗号: ブロック暗号の代替として、現代の暗号学者たちは Chacha20 などの実用的に安全なストリーム暗号も設計しています。これらの暗号はランダム性を設計の基本部分として活用し、離散的なデータブロックの代わりに疑似乱数 キーストリーム のビットで動作します。

したがって、ストリーム暗号は秘密鍵と初期化ベクトル(IV)を組み合わせて擬似乱数ジェネレータ(PRNG)をシードし、ランダムビットの キーストリーム を生成し、それが与えられた平文と組み合わされて暗号文が生成されます。この意味でストリーム暗号は ワンタイムパッド(OTP)に似ていますが、より短い秘密鍵の長さと再利用可能な鍵を特徴としており、より実用的です。ただし、同じ理由から、OTP とは異なり完全な秘密を保証しません。

意味的安全性: このサブセクションを締めくくるにあたり、上記で紹介した意味的安全性または IND-CPA レベルのセキュリティ の概念に戻ります。ブロック暗号が実装する S-box や P-box などの基本操作は決定論的です。これは、ECB などの標準動作モードでは、与えられた平文と鍵のペアが常に同じ暗号文を生成することを意味し、選択平文攻撃に対して脆弱な状況です。

IND-CPA レベルのセキュリティを達成するために、ブロック暗号は疑似乱数 初期化ベクトル(IV)を介して導入されたランダム性を活用するモードで動作する必要があり、2つの暗号化操作が同じ鍵と IV のペアを使用しないという追加の要件があります。AES は、IND-CPA に安全な暗号ブロック連鎖(CBC)などの複数の動作モードをサポートしています。同様の要件がストリーム暗号にも適用され、IND-CPA が望ましい場合は、同じ鍵と IV のペアを使用して PRNG を複数回シードするべきではありません。

SKC の基本原則をいくつか紹介したところで、現代の暗号システムで追求されているさまざまなアプローチを示すために、いくつかの一般的な共通鍵アルゴリズムを列挙します。現代のブロック暗号とストリーム暗号は、以下に示すように異なるコンテキストで使用されています。

  1. Advanced Encryption Standard(AES): 上記で既に紹介した AES は、そのセキュリティ、効率性、パフォーマンス特性により、現在 SKC の事実上の標準となっています。AES は128、192、256ビットの固定鍵サイズを特徴とし、マルチラウンドの 換字置換ネットワーク(SPN)を使用します。AES は幅広い暗号解読攻撃に対して耐性があることが知られています。AES は2001年に米国で共通鍵暗号化の連邦情報処理規格(FIPS)として発表されました。

  2. Data Encryption Standard(DES)および Triple Data Encryption Standard(3DES): DES は、1970年代に IBM® の Horst Feistel らによって最初に発明されたブロック暗号で、比較的短い56ビット鍵を持つ SPN を採用しました。DES は米国で共通鍵暗号化の FIPS として採用されましたが、1990年代後半にその小さな鍵空間サイズのため特殊なハードウェアを使用したブルートフォース攻撃で破ることができることが示されました。その後、3DES が代替として導入され、異なる鍵で DES アルゴリズムを3回適用し、鍵の長さを168ビットに増やしました。とはいえ、3DES は AES によってほぼ置き換えられています。

  3. Blowfish および Twofish: Blowfish とその後継である Twofish は、1990年代に暗号学者の Bruce Schneier によって提案されたブロック暗号です。Blowfish と Twofish はそれぞれ最大448ビットと256ビットの可変鍵長を許可し、セキュリティとパフォーマンスのトレードオフに柔軟性を提供します。AES とは異なり、鍵依存の S-box も特徴としています。Twofish は Advanced Encryption Standard を選定する NIST コンペティションの最終候補の1つでしたが、最終的には選ばれませんでした。両アルゴリズムは現在、安全とみなされています。

  4. Rivest Cipher(RC2、RC4、RC5、RC6): Rivest Cipher(RC)ファミリーの共通鍵アルゴリズムは、1980年代から Ron Rivest によって設計されました。RC2 は初期の64ビットブロック暗号で、RC4 はそのシンプルさと速度からウェブトラフィック関連のセキュリティプロトコルで広く使用されたストリーム暗号でした。どちらも現在では安全とはみなされていません。RC5 と RC6 はカスタマイズ可能なブロックサイズ、鍵サイズ、ラウンド数で設計された SPN ベースのブロック暗号です。上記の Twofish と同様に、RC6 は NIST AES コンペティションの最終候補であり、安全とみなされています。

  5. Salsa20 および ChaCha20: Salsa20 と ChaCha20 は、2000年代に暗号学者の Daniel Bernstein によって設計された関連するストリーム暗号ファミリーです。Salsa20 は eSTREAM 欧州連合暗号検証プロジェクトのプロフィール1ポートフォリオの一部です。Salsa20 の改良版である ChaCha20 は、拡散 特性とパフォーマンスを向上させるために設計されました。現在、ChaCha20 は安全とみなされており、専用の AES ハードウェアアクセラレーションがない場合に優れたパフォーマンスを提供します。そのため、ChaCha20 は QUIC などのネットワークプロトコルや ARM ベースの CPU を搭載したモバイルデバイスなどの特定の設定で使用されています。

共通鍵暗号の利点

共通鍵暗号システムの性質といくつかの原則を概説したところで、非対称鍵暗号に対する SKC の主な利点のいくつかを挙げます。後者については後続のレッスンで説明します。

  1. 速度と効率: 共通鍵アルゴリズムは、一般的に非対称の対応物よりも高速でリソース効率が高いため、大量のデータを暗号化したり、リアルタイム通信シナリオで使用したりするのに適しています。AES などの SKC アルゴリズムは平文のサイズに対して線形にスケールし、代数的に集中した数学演算を含みません。AES のパフォーマンス特性の詳細なレビューについては Tomoiaga et al. を参照してください。

  2. スケーラビリティ: 比較的低い計算オーバーヘッドのため、共通鍵アルゴリズムはユーザー数や暗号化されるデータ量に対してうまくスケールします。

  3. シンプルさ: 対称暗号化プロトコルは、非対称鍵アプローチと比較して実装と理解が容易なことが多く、開発者やユーザーにとって魅力的です。

共通鍵暗号の課題と限界

利点にもかかわらず、共通鍵暗号にはいくつかの課題と限界があります:

  1. 鍵の配布と管理: SKC では、メッセージの送信者と受信者の両方が同じ鍵にアクセスできる必要があり、その鍵は権限のない第三者から機密に保たれなければなりません。鍵が何らかの形で傍受されたり第三者によって危殆化された場合、暗号化されたデータのセキュリティも失われます。したがって、秘密鍵の安全な配布と管理は大きな課題です。ただし、この課題の解決策は SKC 自体の外にあります。

  2. 否認防止の欠如: 否認防止とは、特定の当事者がメッセージを送信したことを証明する能力を指します。SKC では、同じ鍵が暗号化と復号の両方に使用されるため、特定の暗号文をどの当事者が作成したかを判断することはできません。対照的に、非対称鍵暗号は デジタル署名 の使用によって否認防止を提供します。

これらの課題に対処するため、共通鍵暗号はしばしば非対称鍵暗号と組み合わせて使用されます。例えば、送信者と受信者の間で比較的短い共有秘密鍵を安全に伝送するために非対称鍵暗号化を使用することがよくあります。これにより、その後の共通鍵暗号化を使用してより大きなデータやメッセージを効率的に伝送することが可能になります。

量子コンピュータと共通鍵暗号:リスクと緩和策

量子暗号はデジタル時代のリスク緩和に有望な道を提供しており、量子安全製品の採用は量子コンピュータの進歩という迫り来る脅威から情報を保護する態勢を整えています。

以下では、前のセクションで紹介した共通鍵暗号方式に対して量子コンピュータがもたらすリスクについて説明し、リスクを緩和するためのいくつかの潜在的な道筋を概説します。

量子暗号解読攻撃

従来の暗号アルゴリズムに対する量子的脅威には2つの異なるクラスがあります:

  1. 量子ブルートフォース攻撃: 攻撃者が量子コンピュータを使用して特殊な量子アルゴリズムを実行し、対称暗号の鍵空間をブルートフォース探索する状況を指します。この種の攻撃を可能にする最も関連性の高い量子プリミティブはグローバーのアルゴリズムです。

  2. 量子暗号解読攻撃: ブルートフォース探索よりも効率的な方法で秘密鍵または平文を回復することを目的とした暗号解読攻撃を実行するために量子コンピュータが展開される状況を指します。成功した量子 暗号解読 攻撃を実行する可能性は、分析されている暗号の数学的構造や特定の実装における潜在的な弱点に関する多くの要因に依存します。

量子攻撃に対するリスク緩和戦略

量子攻撃に対するリスク緩和戦略を説明する前に、暗号アルゴリズムのセキュリティレベルの概念を紹介しましょう:

セキュリティレベル とは、暗号を破ることの難しさを、暗号を正常に破るために必要な計算操作の数という観点から測る指標です。

通常、セキュリティレベルはビットで表されます。つまり、一般的に、暗号を破るために O(2N)\mathcal{O}(2^{N}) 回の操作が必要であれば、その暗号は N ビットのセキュリティを提供します。古典コンピュータでは、対称暗号が他の面で暗号学的に安全であると仮定すると、セキュリティレベルはおよそ鍵の長さと同義です。

例えば、128ビット鍵を特徴とする AES-128 のセキュリティレベルは一般的に128ビットと見なされます。なぜなら、古典コンピュータを使用する攻撃者が鍵空間内のすべての可能な128ビット鍵を試すには、2128^{128} 程度の操作が必要となるからです。

ブルートフォース攻撃と緩和策

量子ブルートフォース攻撃のリスク: 量子ブルートフォース攻撃は上記の評価を変えます。なぜなら、グローバーのアルゴリズム は、適切な量子コンピュータを持つ攻撃者が、どの古典コンピュータよりも 二乗高速に 暗号の鍵空間を探索できるようにするからです。

例えば、グローバーのアルゴリズムを使用した AES-128 に対する同じブルートフォース攻撃は、わずか 264^{64} 回の操作で達成できる可能性があります。したがって、量子の敵がグローバー探索を実行する場合、AES-128 のセキュリティレベルは128ビットから64ビットに低下します。計算能力は伝統的に時間とともに指数関数的に成長してきたため、現在のところ64ビットのセキュリティレベルは安全でないと見なされており、つまり十分な能力を持つ量子コンピュータが実現されれば、AES-128 は廃棄しなければならないことになります。

同じ種類の計算が他の対称ブロック暗号またはストリーム暗号にも適用され、与えられた鍵の長さに対するセキュリティレベルはグローバーのアルゴリズムによって事実上半減します。

量子ブルートフォース攻撃のリスク緩和: 上記の考慮事項は、量子ブルートフォース攻撃に抵抗する明らかな方法が、共通鍵暗号に使用される最小鍵長を少なくとも2倍にすることであることを意味します。

したがって、量子ブルートフォース攻撃に関して128ビットのセキュリティを確保するには、256ビット鍵を採用する AES-256 や ChaCha20 などの暗号を単純に使用するだけです。これは安全と見なされています。なぜなら、量子コンピュータを使用しても、暗号を破るために 2128^{128} 回の操作を実行することは近い将来実行不可能だからです。

理論的にはシンプルですが、この鍵サイズを倍増させるという提案された解決策にはコストが伴います。長い鍵サイズは通常の暗号化・復号タスクのために追加の計算コストを意味し、パフォーマンスの低下、より多くのメモリ要件、および追加のエネルギー消費をもたらします。

暗号解読攻撃と緩和策

量子暗号解読攻撃のリスク: 量子暗号解読攻撃による共通鍵暗号システムへのリスクは、現在暗号学者によって活発に研究されています。古典的および量子的コンピューティングの組み合わせにより、攻撃者が暗号の数学的構造の弱点を調査するために利用できるツールが拡大する可能性があり、幅広い新しい 量子暗号解読攻撃 が現在提案されています。これらには、線形・差分暗号解読などの既知の古典的技法の 量子化 や、古典的な対応物を持たない新しい攻撃モードが含まれます。

Advanced Encryption Standard(AES)の最近の量子暗号解読研究では、この暗号がさまざまな既知の 量子暗号解読攻撃 に対して引き続き耐性を示し、適切なポスト量子 セキュリティマージン を示し続けていることがわかりました。しかし、いくつかの研究では、古典的に安全とみなされているさまざまな対称暗号が、いわゆる量子選択平文攻撃によって容易に危殆化されることが判明しています。そのため、ポスト量子時代に特化して設計された共通鍵暗号化の新しいプリミティブも提案されています。

量子暗号解読攻撃のリスク緩和: 量子暗号解析という学問分野がその黎明期にあることを考えると、新しい量子暗号解読攻撃が生まれ、それらに耐性のある新しい暗号が提案・評価されるにつれて、ポスト量子対称暗号が急速に進化する可能性があります。したがって、近い将来における量子暗号解読攻撃のリスクを緩和する最善の戦略は、暗号的敏捷性(クリプト・アジリティ)です。クリプト・アジリティとは、情報システムがシステムインフラへの大幅な変更なしに代替の暗号プリミティブを迅速かつ容易に採用する能力を指します。

クリプト・アジリティは、最小限の労力と混乱で暗号化、復号、デジタル署名、またはその他の暗号機能に使用される時代遅れのアルゴリズムを置き換える能力を必要とします。クリプト・アジャイルシステムは、ポスト量子共通鍵暗号への移行を管理するうえで有利な立場にあります。

まとめ

共通鍵暗号は、デジタル情報を保護するための堅牢で効率的なソリューションを提供します。暗号化と復号の両方に同じ鍵を使用するシンプルさにより、高いパフォーマンスとスケーラビリティが実現し、SKC は幅広い応用に適しています。

SKC のセキュリティは、暗号解読攻撃に対するアルゴリズム的な耐性と適切な秘密鍵管理に依存しています。現代の共通鍵暗号システムは、攪拌、拡散、ランダム性の原則を適切な鍵サイズと組み合わせて 意味的安全性 を達成します。秘密鍵管理は重要ですが、SKC 単独では達成できません。

SKC の性質と限界を理解することで、開発者はより長い鍵サイズの使用や新しいアルゴリズムの採用など、必要に応じたアプローチを含む安全な情報技術ソリューションを設計、実装、展開できるようになります。

量子コンピュータと量子学習の進歩は、共通鍵暗号に新たな次元をもたらします。量子コンピュータは古典的な共通鍵アルゴリズムが提供するセキュリティを解読する可能性を持ち、進化する技術的環境においてデータのプライバシーと保護を確保するために、量子耐性のある暗号アプローチの必要性を促しています。