SSL/TLS暗号通信 共通鍵暗号方式

スポンサーリンク

難しい計算とかは割愛して、ざっくりと概要だけと記載しました
ざっくりで見て下さい

各図で表しているデータサイズは4分割するために、それぞれのサイズで記載していて特に深い意味は無いです

共通鍵暗号方式 (Symmetric Key Encryption) 

作成した共通鍵でデータをどうやって暗号化・復号化するかの方式 (暗号アルゴリズム)です

アルゴリズムの種類が複数ありますが、いくつかで記載します

項目 3DES AES-CBC AES-GCM Chacha20
分類 ブロック(64bit) ブロック(128bit) ブロック(128bit) ストリーム
鍵長 112・168 128・192.・256 128・192.・256 256
安全性 現在は非推奨 TLS1.2まで
TLS1.3は非推奨
TLS1.3でも使用可
最も利用されている
TLS1.3で使用可

ブロック暗号
 データを固定長のブロック(AESだと128ビット)に分割し、ブロックごとに暗号化・復号を行います。
ストリーム暗号
 平文データと同じサイズの擬似乱数(キーストリーム)を生成し、キーストリームと平文をXOR演算することで暗号化を行います。

暗号化の時に共通鍵とは別にナンス値とカウンタ値を加えてますが、メリットは同じ平文データを暗号化しても同じ暗号文にならないようにするものです

AES (Advanced Encryption Standard):

AES-CBC

AESのCBC(Cipher Block Chaining)モード
TLS1.2では使用されているが、TLS1.3では非推奨
CBCは認証が付いていない

流れ
1  データをAESが処理できる固定長のブロックサイズ(データの大きさ)128ビットに分割
2  ランダムな初期ベクトル値 (128bit) の生成する
3  分割した最初の平文データ①と初期ベクトル値をXOR計算する
4  XOR計算したデータを共通鍵で暗号化する
5  初期ベクトル値と暗号化データ①を相手に送信する
6  暗号化データ①と分割した平文データ②とXOR計算する
7  XOR計算したデータ②を共通鍵で暗号化する
8  データサイズ分7・8を繰り返す
※最後のデータが128bitに足りない時はパディング(詰め物)をして、きっちり128ビットにします

AES-GCM

GCM (Galois/Counter Mode) はTLS 1.3で推奨。
認証付きなので、暗号化と同時に改ざん検知が出来て完全性も提供。

流れ
1  データをAESが処理できる固定長のブロックサイズ(データの大きさ)128ビットに分割
2  ランダムなナンス値「固定」 (96bit) とカウンタ値「0」(32bit)を生成する
3  【ナンス値「固定」+カウンタ値「0」】を共通鍵で暗号化してキーストリーム①を作成する
4  分割した平文データ①とキーストリーム①をXOR計算して、暗号データ①を作成する
5  データサイズ分2~4を繰り返す(ナンス値(固定) | カウンタ値(1、2・・32) )
6  暗号データ(①②③・・全データ分)・ナンス・TLSヘッダー情報をまとめてGHASHという特別な関数で
  ハッシュ化(認証データ)します
7  暗号データ(全データ)・ナンス・認証①データ相手に送信する
  ナンスはファイル/メッセージの暗号化中: Nonceは固定となり、異なるファイル/メッセージの暗号化時に
  ナンス値は新しく生成され、カウンタは0から開始
  カウンタ値(0, 1, 2, … (32bit))と増加するルールで、受信者も認識してるので送らなくても共有できる
  キーストリームでサイズを128bitに合わせるので、CBCと違いパディング(穴埋め)は不要になった

ChaCha20-POLY1305

ストリーム暗号タイプ
TLS 1.3でも利用可能で高速でモバイルデバイスなどで使われることがある。
POLY1305と組み合わせて、暗号化と同時に改ざん検知が出来て完全性も提供。

流れ
1  固定値 (128ビット)・共通鍵 (256ビット)・Nonce (96ビット)・カウンタ (32ビット)を使いキーストリームを平文のデータサイズ分作成
  固定値 (固定) | 共通鍵 (固定) | (ナンス値(固定) | カウンタ値(1、2・・32)
  ※2000bitとすると、「512bit×3 ・ 464bit×1」を準備
  キーストリーム⓪(512bit) = ChaCha20(固定値, 共通鍵, Nonce, カウンタ=0)
   ※カウンタ0は後でPoly1305の処理で使う
  キーストリーム①(512bit) = ChaCha20(固定値, 共通鍵, Nonce, カウンタ=1)
  キーストリーム②(512bit) = ChaCha20(固定値, 共通鍵, Nonce, カウンタ=2)
  キーストリーム③(512bit) = ChaCha20(固定値, 共通鍵, Nonce, カウンタ=3)
  キーストリーム④(512bit) = ChaCha20(固定値, 共通鍵, Nonce, カウンタ=4)
  ※下記の図の例だと平文が2000bitでキーストリーム(連結:2048bit)なので、キーストリームの最後の48bit分は使用しない。
2  キーストリーム①~④を連結
3  平文データ(2000bit)とキーストリーム(2000bit:連結)をXOR計算して暗号データを作成
4  暗号データ・TLSヘッダー・合計データサイズをキーストリーム⓪でまとめて認証タグ(128bit)を作成する
5  暗号データと認証タグを相手に送信する

3DES(Triple DES)

以前使われたが、現在では安全性が低いとされ、非推奨。
DES暗号方式を3回繰り返すので3DES

コメント

タイトルとURLをコピーしました