SC-exam

共通鍵暗号

現代の暗号方式は大きく分けて"共通鍵暗号方式"と"公開鍵暗号方式"があります。このページでは"共通鍵暗号方式"を解説します。公開鍵暗号についてはこちらをご覧くださいhttps://sc-exam.com/public-key/

共通鍵暗号とは

共通鍵暗号とは,暗号化と復号に同一の鍵を用いる方式のことです。
平文は暗号化していないデータを指します。

共通鍵暗号の特徴

共通鍵暗号は高速に暗号化,復号が行えます。公開鍵暗号方式と比べてとても高速に処理が行えるため,大きなデータの暗号化を行う際に向いています。
一方で,暗号化と復号に同じ鍵を使用するため,鍵を通信相手に渡す必要があるという問題があります。これを"鍵の配送問題"と言います。
共通鍵を平文のままインターネット経由で送ってしまえば悪意のある第三者に盗聴されて鍵を利用されてしまう可能性があります。それでは暗号化した意味がありません。この問題については,別のページで解説します。

共通鍵暗号で使用する鍵の数

共通鍵暗号では通信をする相手ごとに異なる鍵を使用します。同じ鍵を使用すると,同じ鍵を使っている人同士で復号できてしまうからです。
使用する鍵の数は n(n-1)/2 で計算できます。

図のように,2人の通信では1つ,3人の通信では3つとなります。
上記の計算式で100人で通信した場合の鍵の数を計算してみましょう。答えは100(100-1)/2で4950個となります。

ストリーム暗号とブロック暗号について

ストリーム暗号とブロック暗号はどちらも共通鍵暗号の方式です。
ストリーム暗号は,1ビット,1バイト単位で暗号化します。ブロック暗号の場合はブロックのサイズになるまで暗号化の処理が行えませんが,ストリーム暗号では平文と,共通鍵から作られる疑似乱数でXORを取り,暗号化と復号を行います。

まずXOR(排他的論理和)から説明します。ここは試験では問われませんので,時間のない方は飛ばしてください。原理が簡単にわかっていると理解しやすいと思いますので興味があればお読みください。
XORは,与えられたa,bの値のどちらも0もしくは1の場合は0,そうでなければ1となります。

平文をm,共通鍵から作られる疑似乱数をr,暗号文をcとします。c=m⊕rで暗号化,m'=c⊕rで復号が行えます。これを繰り返して,nビットの文字列の暗号化を行います。以下は4ビットの文字列を暗号化,復号する例です。

正しく暗号化,復号ができているのが分かるかと思います。3つの値のうち,2つが分かればもう1つも計算できますが,1つだけでは他の値が推測できません。
ストリーム暗号で重要になるのが疑似乱数生成器です。ストリーム暗号は平文と疑似乱数でXORを取っているだけです。ストリーム暗号の安全性,効率性は疑似乱数生成器に依存します。
代表的な方式はRC4,KCipher-2です。ただし,CRYPTREC暗号リスト(このページの下のほうで解説します)の電子政府推奨暗号リストに掲載されているのはKCipher-2のみとなっています。

ブロック暗号では,暗号化をブロックごとに行います。平文がブロック長ぴったりでない場合は,パディングで足りないビットを埋めます。代表的なものではAES,DES,Camelliaがあります。

DES

DESは64ビットごとに暗号化する方式です。鍵長は64ビット(内8ビットはパリティ用のため,実質56ビット)です。現在ではDESはCRYPTREC暗号リストの電子政府推奨暗号リストに載っていないように,推奨されなくなりました。高性能なコンピュータが開発され,とても短い時間で解読されてしまいます。このように時代が進むことによってその暗号方式が危険になってしまうことを危殆化といいます。
TripleDESという暗号方式もあります。これは,DESのアルゴリズムを利用して2つ(2-key-TripleDES)もしくは3つ(3-key-TripleDES)の鍵を利用して暗号化,復号を行う方式です。鍵長は,2-key-TripleDESの場合112ビット,3-key-TripleDESの場合168ビットとなります。(パリティを除く)

AES

AESは危殆化したDESの後継として,NISTに次世代の標準暗号として制定されました。2025年現在では,脆弱性などは見つかっておらず,量子コンピュータを用いた解析もまだ不可能と言われています。AESにはAES-128,AES-192,AES-256と3つのタイプがあります。

暗号化モード

ブロック暗号では,同じ鍵で同じ内容を暗号化した場合,暗号文も同じになってしまい,暗号化したのに内容が推測されてしまう可能性があります。そのため,適切な暗号化モードを選択することが重要です。

ECBモード

単純に各ブロックに対して同じ処理を行います。前述の通り,この方法では脆弱性が生まれてしまいます。この影響が顕著に表れるのが画像などのパターンが生まれやすいデータです。暗号化された画像であっても,内容が推測できるような画像が浮かび上がります。ただメリットとしては,前のブロックの影響を受けないので,ビット誤りがあっても影響がブロック内で収まることです。

CBCモード

CBCモードは一つ前の暗号化したブロックと,平文のブロックからXORを取り,それを暗号化するモードです。ECBモードと異なり,暗号化するデータが攪乱されるため,他のブロックと同じ内容でも異なる暗号文が出力されます。一つ前のブロックがない一番最初のブロックでは,IV(初期ベクトル)が使用されます。IVは復号にも必要です。IVは公開してもよい情報なので,暗号文に含めて送信されます。ただし,IVはランダムで予測不能である必要があります。

CFBモード

一つ前の暗号文を暗号化し,平文とXORを取り,それをそのまま暗号文とするモードです。最初のブロックはIVを暗号化して,それを平文とXORを取り最初の暗号文とします。このモードでもIVは公開しても問題はありませんが,ランダムで予測不能であることが求められます。応用することでブロック暗号をストリーム暗号とすることも可能です。(k-CFB)

OFBモード

こちらも暗号化したIVと平文からXORを取る点では同じですが,前の暗号文を暗号化するのではなく,前のXORを取る前の暗号化したビットを暗号化します。このモードでもk-OFBモードを使用することでストリーム暗号に応用できます。IVは公開しても問題はありませんが,ランダムで予測不能であることが求められます。また,前の暗号文から次の暗号文を計算しないので,ビット誤りがあっても影響を及ぼすのがそのブロックに限られます。ただし,暗号文を消失するとそのあとのブロックで正しく復号できません。

CTRモード

このモードではカウンタを使用します。カウンタの初期値を入力し,それをブロックごとに+1します。カウンタの値が固定であると,ECBモードのような脆弱性が生まれてしまうため,注意が必要です。その値を暗号化して平文とXORを取ります。ブロックごとに独立しているため,並列処理が可能であったり,ビット誤りの影響が極めて限定的であり,安全性も高いなどとても理想的なモードです。

CRYPTREC暗号リスト

CRYPTREC暗号リストは"電子政府推奨暗号リスト","推奨候補暗号リスト","運用監視暗号リスト"から構成されています。こちらから閲覧できますので,目を通しておくことをおすすめします。https://www.cryptrec.go.jp/list.html更新されますので実際に暗号やハッシュ関数を選択する際にもリストを参照してください。

電子政府推奨暗号リストは,安全性及び実装性能が確認された暗号技術について,市場における利用実績が十分であるか今後の普及が見込まれると判断され,当該技術の利用を推奨するもののリストです。基本的にはこの中から選ぶことになります。

推奨候補暗号リストはCRYPTRECにより安全性及び実装性能が確認され,今後,電子政府推奨暗号リストに掲載される可能性のある暗号技術のリストです。安全が確認されていて,これから推奨になるかもしれない"候補"段階の暗号です。

運用監視暗号リストは実際に解読されるリスクが高まるなど,推奨すべき状態ではなくなったとCRYPTRECにより確認された暗号技術のうち,互換性維持のために継続利用を容認するもののリスト。新規で開発する場合は推奨暗号リストの中から選ぶべきです。あくまで,その暗号を使わないと互換性が維持できない場合などで容認されているだけです。

暗号鍵の選定をする際はCRYPTRECが制作した"暗号鍵管理システム設計方針"と"暗号鍵管理ガイダンス"も役立ちます。https://www.ipa.go.jp/security/crypto/guideline/ckms.html

おすすめコンテンツ!

現在作成中