[暗号化]ブロック暗号とは(AES/DES/Blowfish PKCS5Padding ECB/CBC IV)

ブロック暗号とは共通鍵暗号の一種で、ブロックと呼ばれる固定長のデータ単位で暗号化を行います。
(ビット単位やバイト単位で暗号化をするものはストリーム暗号です。)

[参考記事] PHPで暗号化・複合化を行う ブロック暗号
[参考記事] Javaで暗号化・複合化を行う ブロック暗号
[参考記事] Perlで暗号化・複合化を行う ブロック暗号
[参考記事] Rubyで暗号化・複合化を行う ブロック暗号

平文データ(生データ)から暗号化されたデータを作成することを暗号化(encryption、encrypt)、暗号化されたデータから元の平文データに戻すことを復号(decryption、decrypt)といいます。
プログラム言語の暗号化ではencryptやdecryptなどの関数名・メソッド名になっていることが多いです。

もちろん元に戻せる(可逆変換)ことが前提で、md5やshaなどはハッシュ化といって不可逆変換です。
またデータから誰でも元に戻せてしまうと暗号化にはならないので、暗号化鍵がないと元に戻せないことも重要です。
base64などは鍵がなくても元に戻せるので、符号化と呼ばれます。
符号化の場合は平文データから符号化されたデータを作成することをエンコード(encode)、符号化されたデータから元の平文データに戻すことをデコード(decode)といいます。
ハッシュ化も符号化も広義には暗号化です。

暗号化方式(暗号化アルゴリズム)
パディング方式
暗号利用モード(ブロック処理の種類)
初期化ベクトル
暗号化前後の長さ(サイズ)
安全性

スポンサーリンク

暗号化の流れ
(1) ブロック長に満たない部分をパディング方式で補完する。
(2) アルゴリズムに対応したブロック長に分割する。
 このときの分割ルールを決めるのが暗号利用モード
 分割モードによっては初期値が必要で、これがIV(初期化ベクトル)
(3) 暗号鍵を用いてアルゴリズムで暗号化する。
(4) 分割されたデータを結合する。

復号化の流れ
(1) アルゴリズムに対応したブロック長に分割する。
(2) 暗号鍵を用いてアルゴリズムで復号化する。
(3) 暗号利用モードを元に分割されたデータを結合する。
 分割モードによっては初期値が必要で、これがIV(初期化ベクトル)
(4) 補完されたパディングをパディング方式で除去する。

暗号化方式(暗号化アルゴリズム)

暗号化の種類にはいくつかあります。

ブロック長

ブロック長暗号化名特徴
Lucifer1971年頃にIBMでHorst Feistelにより開発された
56bitDES
Data Encryption Standard
FIPS 46
IBM社が開発した
安全性から推奨されない(差分解読法には対応)
1977年にLuciferをベースにして、DESが制定された
コンピュータの性能の向上により1997年にRSAセキュリティ社がDESチャレンジを企画、全数探索により96日後に鍵が発見された
1998年にはハードウェアによる鍵探索専用機 DES cracker が開発され、鍵を56時間で探索した。
FEAL1987年にNTTの清水明宏と宮口庄司により発表された。
1991年にEli Bihamとアディ・シャミアにより差分解読法が発表され、差分解読法によって効率的に解読できることが判明した
TripleDES
DESede
FIPS PUB 46-3
トリプル DES 暗号化 (DES-EDE)
DESの代替の制定の必要性に迫られ、1999年にAESができるまでの中継ぎとしてTripleDESが制定された
暗号化、復号化、暗号化とDESを3重に施す方式
3倍に拡張したキーの中に3つのサブキーが含まれる
全て同じサブキーを使用すればDESと互換性のある暗号化/復号化を行うことができる
64bitBlowfishブルース・シュナイアーによって開発された対称ブロック暗号
公式サイト
鍵長は32ビットから448ビットまで可変
DESやIDEAよりも高速とされています。
特許が取得されていためライセンスフリーな暗号化方式として広く使用されています。
64bitTDEAISO/IEC_18033、CRYPTREC
64bitMISTY1ISO/IEC_18033、CRYPTREC, NESSIE
日本製
1995年に線形攻撃法と差分攻撃法に対して証明可能安全性を有する暗号として発表された
64bitCAST-128ISO/IEC_18033
64bitCIPHERUNICORN-ECRYPTREC
64bitHierocrypt-L1CRYPTREC
64bitMULTI2ARIB限定受信方式
64bitKASUMI3GPP W-CDMAおよびGSM用の暗号
復号が定義されていないブロック暗号
128bit 192bit 256bitRijndaelベルギーの数学者Joan Daemen氏とVincent Rijmen氏によって開発された
2000年10月に、アメリカ政府標準技術局(NIST)によって次世代の暗号化標準AESに選定された。ブロック長は可変で128bitから256bitまでの32bitの倍数
128bitAES
Advanced Encryption Standard
FIPS PUB 197
ISO/IEC_18033、CRYPTREC、NESSIE
2001年11月に米NISTが制定
Rijndaelが元になっているが、NISTが公募した際のスペックに従いブロック長は固定
128bitCamelliaISO/IEC_18033、CRYPTREC、NESSIE
日本製
128bitSEEDISO/IEC_18033
128bitCIPHERUNICORN-ACRYPTREC
128bitHierocrypt-3CRYPTREC
128bitSC2000CRYPTREC
256bitSHACAL-2NESSIE
AESWrapAES鍵ラッピングアルゴリズム
DESedeWrapDESede鍵ラッピングアルゴリズム
ECIESElliptic Curve Integrated Encryption Scheme
RC2RSA Data Security, Inc の Ron Rivest により開発された可変キーサイズ暗号
RC4RSA Data Security, Inc の Ron Rivest により開発された可変キーサイズ暗号
RC5RSA Data Security, Inc の Ron Rivest により開発された可変キーサイズ暗号
RSAPKCS #1 で定義されている RSA 暗号
IDEA非フリー
CLEFIAFPGA(プログラム可能な集積回路)やICチップで実装した際に回路規模や実行速度が最適化されることを意図して設計された

RijndaelはAESに採用された暗号化方式ですが、Rijndaelは128bitから256bitの可変ブロック長、AESは128bit固定ブロック長で異なります。
Blowfishの開発者ブルース・シュナイアーはAES公募の際の最終候補Twofishの開発者でもある。

鍵長 キー長

暗号化名キー長
DES56bit
DESede168bit
Rijindael128bit、192bit、256bit
AES128bit、192bit、256bit
Blowfish32bitから448bit
CAST51bitから128bit
CAST61bitから256bit
IDEA1bitから128bit
RC21bitから1024bit
RC440bitから2048bit
RC51bitから128bit
RC61bitから256bit
Skipjack1bitから128bit
Twofish128bit、192bit、256bit
Serpent128bit、192bit、256bit

標準化プロジェクト

NESSIE ヨーロッパ
CRYPTREC 日本

パディング方式

ブロック長に満たない場合の補完方式です。

NoPadding

パディングしない

ZeroBytePadding

ブロック長に満たない場合はNULLバイト(0x00)で埋められる
ブロック長ぴったりな場合はパディングされない
このため末尾の0x00が本来生成された値の末尾なのかパディングされた値なのかを判断できない
暗号化するデータにNULLバイト(0x00)が含まれていないことが保障されていないと使えない

PKCS#5 Padding

ブロック長に満たないサイズ(=埋めるサイズ)の値を表すバイト値で足りない分を埋める
ブロック長が8バイトでデータサイズが3バイトなら0x05で足りない5バイト分埋める
ブロック長ぴったりな場合は1ブロック分丸ごとパディングされる
RFC1423
「PKCS #5: Password-Based Encryption Standard」バージョン 1.5 (RSA Laboratories、1993 年 11 月) で規定されたパディング方式

ISO10126Padding

W3C の「XML Encryption Syntax and Processing」ドキュメントの 5.2 Block Encryption Algorithms に記載されている

SSL3Padding

SSL Protocol バージョン 3.0 のセクション 5.2.3.2 (CBC ブロック暗号) で規定されたパディング方式

Optimal Asymmetric Encryption Padding

PKCS #1 に定義されている
OAEPWith<digest>And<mgf>Padding

その他

ISO10126d2Padding
ISO7816d4Padding
PKCS7Padding
TBCPadding
X9.23Padding

暗号利用モード(ブロック処理の種類)

Block cipher modes of operation
ブロック長よりも長い場合のデータ分割メカニズムです。
秘匿用の利用モードと、認証用の利用モードとがあります。

秘匿用の利用モード

ECBElectronic CodeBook
暗号ブックモード
1ブロックずつ単純に処理するため、暗号文一致攻撃をに弱い欠点があります
ブロック単位の差し替えなど、暗号文改ざん攻撃にも弱いという問題があります
暗号化も復号化もランダムアクセスに適しています
初期化ベクトルを必要としません
CBCCipher Block Chaining
暗号文ブロック連鎖モード
FIPS PUB 81 で規定
前の平文ブロックを暗号化した結果を次の平文に XOR 演算によって重ね合わせ、その結果に対して暗号化処理を行います。最初のブロックを暗号化する場合は、前の暗号文の最後のブロックを利用するか、または外部から与えた初期ベクトル(initial vector) を利用します。
OFBOutput FeedBack
出力フィードバックモード
初期ベクトル(initial vector) を暗号化し、それをまた暗号化し、次々と乱数を生成します。その乱数列を XOR 演算によって平文に重ね合わせ暗号化処理を行います。従って、ブロック暗号をストリーム暗号のように利用します。
KAKkey auto-keyOFBの別名
NOFBNビット形式Output FeedBackOFBと互換ですが、アルゴリズムのブロックサイズを変更可能なため、より安全です。
CFBCipher FeedBack
暗号フィードバックモード
1バイト毎に暗号化する必要があるバイトストリームを暗号化する際に適したモードです。
CTAKciphertext auto-keyCFBの別名
k-CFBk-bit CFB
CTRCounTeRAES暗号制定の際に追加されたモード
CTSCipherText Stealing
2DEM2D Encryption Mode
ABCAccumlated Block Chaining
IGEInfinite Garble Extension
F8@3GPP

ECB, CBC, OFB, CFBの4つは、FIPS, ANSIのほか、ISO、JISで規格化されている。

認証用の利用モード

CCMCounter with CBC-MAC
OCBOffset CodeBook
XCBCeXtended Ciphertext Block Chaining
XCBC-MAC

初期化ベクトル

IV(Initialization Vector)
暗号利用モードでブロックを分割する際に、前の平文ブロックの結果を次の平文に使用する。このときの最初のブロックに使用されるベクトル値です。
ECB(Electronic CodeBook)では単純にブロック長で分割するため、初期化ベクトルは不要です。

暗号化前後の長さ(サイズ)

ブロック暗号では、暗号化を行っても元データと暗号データで長さはアルゴリズム部分では変わりません。 128bitのデータを暗号化すると128bitになります。
ただパディング方式がNoPaddingの場合またはブロック長ぴったりでZeroBytePaddingの場合以外はパディングされたサイズ分ほど大きくなります。

安全性

暗号化のアルゴリズムなどを選定する上で重要なのは解析されないことです。
ただ一般に暗号化が難解(解析しにくく)になればなるほど、暗号化・複合化の処理に負荷がかかります。

攻撃に対する耐性を強度といいます。 強度が低ければ盗聴・改ざん・成りすまし・事後否認などを許してしまうことになります。

計算量的安全性

鍵の全数探索で必ず解読可能です。
鍵長nビットに対して2nの計算量的安全性以上の安全性をもたない。
(平均解読計算量は半分の2n - 1)
鍵長が長ければより安全性は高くなります。

つまり総当り方式で鍵を解析すると、鍵長nビットであれば2n回以内で鍵がわかります。
総当り方式は「Brute Force方式」などとも呼ばれます。

総当り方式で解析可能といっても
128bitであれば3.4×1038回で解析可能で、
1回に0.01秒だとすると1年=3×107秒=3.2×109
1.1×1029年かかります。

計算機の性能の向上に起因します。

ショートカット法

鍵の全数探索をブロック暗号アルゴリズムの弱点を用いて計算量を低減させる手法を総称してショートカット法といいます。
数学的に解を求める方法です。

差分解読法(差分暗号解読)Differential cryptanalysis (Biham,1989)
 不能差分暗号解読Impossible Differential Attack
 切詰差分解読法Truncated Differential Attack
 高階差分解読法Higher Order Differential Attack
  Square攻撃Square Attack
  飽和攻撃Saturation Attack
 ブーメラン攻撃Boomerang attack
 補間攻撃Interporation Attack (Jakobsen, Knudsen, 1997)
  線形和攻撃Linear Sum Attack (Aoki, 1999)
線形解読法(線形暗号解読)Linear cryptanalysis (Matsui,1993)
 差分線形攻撃Differential-linear attack
 切詰線形攻撃Truncated Linear Attack
スライド攻撃Slide attack (David Wagner,Alex Biryukov,1999)
カイ2乗攻撃χ2 Attack
mod n攻撃Mod n cryptanalysis
XSL攻撃XSL attack

暗号化アルゴリズムがショートカット法による解析が可能であっても、計算量が現実的でなければ解析は難しいです。
設計時にこれらを想定した設計になっていなければ、その暗号アルゴリズムは信頼性が低いとなります。

サイドチャネル攻撃

暗号のアルゴリズムからではなく、それが実装されたハードウェアやソフトウェアの消費電力や実行時間等の情報を用いて攻撃する手法をサイドチャネル攻撃といいます。

非常に精密な計測を要するため、今までは実際に実施することが困難でした。
しかし、計測技術やレーザー照射技術の向上により、現実的な可能性が出てきました。
これらの攻撃からの防衛を考えに入れて、機器からの漏えい電磁波の抑制や、機器への侵入電磁波に対する耐性などが必要です。

電力攻撃Simple Power Analysis
電力差分攻撃Differntial Power Analysis
タイミング攻撃Timing Attack

暗号文一致攻撃

ブロック長分割の際にブロック長で単純に分割していた場合、暗号ブロックが一致した場合は復号した平文は一致するということになります。
特定のある暗号ブロックに対応する平文ブロックが1度知られると、同一の値を持つ暗号ブロックはすべて解読されたことになります。

暗号文改ざん攻撃

ブロック長分割の際にブロック長で単純に分割していた場合、ブロック単位の差し替えを行うことができます。
これはデータ改ざんの手法で暗号解析の手法ではありません。
ただし改ざん攻撃をするために、鍵を入手したり平文を正確に把握する必要はありません。

関連記事

スポンサーリンク

豊橋総合動植物公園 のんほいパーク

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る