i have no idea

I have no idea

bibouroku

やる気の出ない情報セキュリティ3 「暗号技術~共通鍵暗号化技術~」

会社で情報セキュリティをやることになったので、勉強がてらメモ
知識を詰め込んだところで、実践で使えないタイプですが、知識を詰め込むことしかできない。

共通鍵暗号化技術

共通鍵暗号化技術は大きく2つの方式に分けられます。

  • ストリーム暗号化
  • ブロック暗号化

ストリーム暗号化方式は、疑似乱数生成器が生成する乱数を使い、入力された平文をビット単位で暗号化します。(RC4など)

ブロック暗号化方式は、データ撹拌部と鍵生成部から構成されていて、暗号化をブロック単位で行います。(DES,AESなど)

f:id:yabicon:20210426222827p:plain
ブロック暗号方式とストリーム暗号化方式


代表的な共通鍵暗号化技術

以下、代表的な共通鍵暗号化技術の軽い説明です。。

  • DESと3DES
    DES(Data Encryption Standard)は、64ビットのブロック単位で平文を暗号化する手法です。
    有効な鍵の長さは56ビット(64ビット-8ビット(パリティビット))となっており、鍵の組み合わせの総数は256(約7.2京)個となります。
    すげぇ!と思いきや、1999年のセキュリティコンテストで22時間で破られてしまいました。そのため安全性の観点から今はあまり使われていません
    3DESは、DESを3回 (暗号化→復号→暗号化) 行うことで暗号強度を高めたものになります。

  • AES
    AES(Advanced Encryption Standard)は、128ビット長のブロック暗号化方式です。
    有効な鍵の長さは、128,192及び256ビットの3つがありまして、今のところ安全であるとされていて、利用が推奨されています。

  • RC4
    RC4はストリーム式暗号化方式の一つであり、鍵長が可変(40~256ビット)の暗号化方式となります。
    Web通信の暗号化のためのSSL/TLSや、無線LANの暗号化のためのWEPで使われます。
    演算が高速に処理できるので、多く使われていましたが、今はAESも結構高速らしく、なかなか使われることがなくなってきたみたいです。。。


DESの仕組み

ところで共通鍵暗号化方式ってどんな感じでやっているんですか?DESの仕組みを見ていきます。
DESは時代遅れですが、基本的な仕組みを理解するのにはいいみたいですよ。

共通鍵暗号化方式のブロック暗号化方式は、「データ撹拌部」と「鍵生成部」からなります。

ブロック暗号化方式では、入力とする平文を64ビットの単位で分割して暗号化を実施します。最後にはみ出た部分は、パディングを行い無理やり64ビットにします。

f:id:yabicon:20210426222910p:plain
64ビットで分割して、パディングします

以下の手順で暗号化をします。
① あらかじめ定めた対応表に基づいて、文字の並び替え(初期転置)を行い、32ビットずつ右(R_0)と左(L_0)に分けます。

f:id:yabicon:20210426222949p:plain

② R_0はそのまま次の入力となるL_1とします(L_(n+1)=R_n)

f:id:yabicon:20210426223007p:plain

③ R0とサブ鍵K_1(48ビット)に関数fを適用した値と、L_0との排他的論理和を計算して、その値をR_1とします。(R(n+1)=L_n⊕f(R_n,K(n+1)))

f:id:yabicon:20210426223024p:plain

④ ②と③をn=16迄繰り返します。

f:id:yabicon:20210426223102p:plain

⑤ L_16とR_16を連結して一つのブロックとします。またブロックに対して文字の並び替え(最終転置)を行い、終了します。

f:id:yabicon:20210426223118p:plain

[補足]

  • 初期転置、最終転置について
    初期転置の配置は、初期転置IPを使います。初期転置IPは以下のようになっていて、たとえば最初の「58」は「入力の58ビット目を1ビット目に移動すること」を指します。
58, 50, 42, 34, ......
62, 54, 46, 38, ......  
11, 12, 63,  5, ......  
61, 53, 45, 27, ......  
  • 関数fについて
    以下のような感じになるらしいです(詳細は省く)、Sボックスっていうのは6ビットの入力ビット列に対して、0~15の値の一意の値を決めるものになります。0~15は4ビットで表現できます。

f:id:yabicon:20210426223146p:plain
関数fとは

  • サブ鍵Kの生成方法
    f:id:yabicon:20210426223208p:plain
    サブ鍵K_nの生成方法


パディング方式

ブロック暗号等、決まった長さのブロック単位で暗号化する場合、平文がブロック長に足りない場合、足りない部分に特定のデータを埋め込む処理(パディング)を行う必要があります。
パディングは、暗号化と復号の処理で一意である必要があります。ので、暗号文の送信者と受信者に標準的なパディング方式が知らされます。
パディング方式には以下のものが代表的なものとして上げられます。

  • PKCS#5
  • PKCS#7
  • ISO10126-2
  • ISO9797
  • ANSIX923
  • Zeros


ブロックチェイニング

ブロック暗号化方式において、分割したブロックに対して個別に暗号化を行うと、特定のブロックのみを解読され、平文を推測される等の、危険性があります。

f:id:yabicon:20210426223237p:plain
ブロック暗号の一部が解読される

そこで、前のブロックの暗号化の結果を次のブロックの暗号化に使用するなど、各ブロックに相関関係を持たせ、平文と暗号文が1on1にならないようにすることで安全性を高めることができます。
これが巷で話題のブロックチェイニングと呼ばれる技術です。。。!

代表的なモードとして、以下のものがあります。また、チェイニングせずに個別で暗号化するものをECB(Electronic CodeBook)モードと言います。使用の推奨はされていません。

  • CBC(Cipher Block Chaining)モード
  • OFB(Output Feed Back)モード
  • CTR(CounTeR)モード

CBCモードでは、1つ前の暗号文ブロックとの排他的論理和をとり、その結果を暗号化する手法です。
最初の平文ブロックは、初期化ベクトルという乱数列を別途用意する必要があります。
各ブロックが連鎖的に処理されるので、特定のブロックのみの解読が困難になります

f:id:yabicon:20210426223334p:plain
CBC(Cipher Block Chaining)モード

OFBモードは、初期化ベクトルを次々に暗号化していったものと平文との排他的論理和をとって暗号化する手法です。

f:id:yabicon:20210426223405p:plain
OFBモード(Output Feed Back)

CTRモードは、初期化ベクトルを使わず、ブロック長のカウンタを用います。
この手法は並列化ができるため、高速化が期待できます。

f:id:yabicon:20210426223450p:plain
CTR(CounTeR)モード