[暗号化]ブロック暗号とは(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) 補完されたパディングをパディング方式で除去する。
暗号化方式(暗号化アルゴリズム)
暗号化の種類にはいくつかあります。
ブロック長
ブロック長 | 暗号化名 | 特徴 |
---|---|---|
Lucifer | 1971年頃にIBMでHorst Feistelにより開発された | |
56bit | DES Data Encryption Standard FIPS 46 | IBM社が開発した 安全性から推奨されない(差分解読法には対応) 1977年にLuciferをベースにして、DESが制定された コンピュータの性能の向上により1997年にRSAセキュリティ社がDESチャレンジを企画、全数探索により96日後に鍵が発見された 1998年にはハードウェアによる鍵探索専用機 DES cracker が開発され、鍵を56時間で探索した。 |
FEAL | 1987年にNTTの清水明宏と宮口庄司により発表された。 1991年にEli Bihamとアディ・シャミアにより差分解読法が発表され、差分解読法によって効率的に解読できることが判明した | |
TripleDES DESede FIPS PUB 46-3 | トリプル DES 暗号化 (DES-EDE) DESの代替の制定の必要性に迫られ、1999年にAESができるまでの中継ぎとしてTripleDESが制定された 暗号化、復号化、暗号化とDESを3重に施す方式 3倍に拡張したキーの中に3つのサブキーが含まれる 全て同じサブキーを使用すればDESと互換性のある暗号化/復号化を行うことができる | |
64bit | Blowfish | ブルース・シュナイアーによって開発された対称ブロック暗号 公式サイト 鍵長は32ビットから448ビットまで可変 DESやIDEAよりも高速とされています。 特許が取得されていためライセンスフリーな暗号化方式として広く使用されています。 |
64bit | TDEA | ISO/IEC_18033、CRYPTREC |
64bit | MISTY1 | ISO/IEC_18033、CRYPTREC, NESSIE 日本製 1995年に線形攻撃法と差分攻撃法に対して証明可能安全性を有する暗号として発表された |
64bit | CAST-128 | ISO/IEC_18033 |
64bit | CIPHERUNICORN-E | CRYPTREC |
64bit | Hierocrypt-L1 | CRYPTREC |
64bit | MULTI2 | ARIB限定受信方式 |
64bit | KASUMI | 3GPP W-CDMAおよびGSM用の暗号 復号が定義されていないブロック暗号 |
128bit 192bit 256bit | Rijndael | ベルギーの数学者Joan Daemen氏とVincent Rijmen氏によって開発された 2000年10月に、アメリカ政府標準技術局(NIST)によって次世代の暗号化標準AESに選定された。ブロック長は可変で128bitから256bitまでの32bitの倍数 |
128bit | AES Advanced Encryption Standard FIPS PUB 197 | ISO/IEC_18033、CRYPTREC、NESSIE 2001年11月に米NISTが制定 Rijndaelが元になっているが、NISTが公募した際のスペックに従いブロック長は固定 |
128bit | Camellia | ISO/IEC_18033、CRYPTREC、NESSIE 日本製 |
128bit | SEED | ISO/IEC_18033 |
128bit | CIPHERUNICORN-A | CRYPTREC |
128bit | Hierocrypt-3 | CRYPTREC |
128bit | SC2000 | CRYPTREC |
256bit | SHACAL-2 | NESSIE |
AESWrap | AES鍵ラッピングアルゴリズム | |
DESedeWrap | DESede鍵ラッピングアルゴリズム | |
ECIES | Elliptic Curve Integrated Encryption Scheme | |
RC2 | RSA Data Security, Inc の Ron Rivest により開発された可変キーサイズ暗号 | |
RC4 | RSA Data Security, Inc の Ron Rivest により開発された可変キーサイズ暗号 | |
RC5 | RSA Data Security, Inc の Ron Rivest により開発された可変キーサイズ暗号 | |
RSA | PKCS #1 で定義されている RSA 暗号 | |
IDEA | 非フリー | |
CLEFIA | FPGA(プログラム可能な集積回路)やICチップで実装した際に回路規模や実行速度が最適化されることを意図して設計された |
RijndaelはAESに採用された暗号化方式ですが、Rijndaelは128bitから256bitの可変ブロック長、AESは128bit固定ブロック長で異なります。
Blowfishの開発者ブルース・シュナイアーはAES公募の際の最終候補Twofishの開発者でもある。
鍵長 キー長
暗号化名 | キー長 |
---|---|
DES | 56bit |
DESede | 168bit |
Rijindael | 128bit、192bit、256bit |
AES | 128bit、192bit、256bit |
Blowfish | 32bitから448bit |
CAST5 | 1bitから128bit |
CAST6 | 1bitから256bit |
IDEA | 1bitから128bit |
RC2 | 1bitから1024bit |
RC4 | 40bitから2048bit |
RC5 | 1bitから128bit |
RC6 | 1bitから256bit |
Skipjack | 1bitから128bit |
Twofish | 128bit、192bit、256bit |
Serpent | 128bit、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
ブロック長よりも長い場合のデータ分割メカニズムです。
秘匿用の利用モードと、認証用の利用モードとがあります。
秘匿用の利用モード
ECB | Electronic CodeBook 暗号ブックモード | 1ブロックずつ単純に処理するため、暗号文一致攻撃をに弱い欠点があります ブロック単位の差し替えなど、暗号文改ざん攻撃にも弱いという問題があります 暗号化も復号化もランダムアクセスに適しています 初期化ベクトルを必要としません |
---|---|---|
CBC | Cipher Block Chaining 暗号文ブロック連鎖モード | FIPS PUB 81 で規定 前の平文ブロックを暗号化した結果を次の平文に XOR 演算によって重ね合わせ、その結果に対して暗号化処理を行います。最初のブロックを暗号化する場合は、前の暗号文の最後のブロックを利用するか、または外部から与えた初期ベクトル(initial vector) を利用します。 |
OFB | Output FeedBack 出力フィードバックモード | 初期ベクトル(initial vector) を暗号化し、それをまた暗号化し、次々と乱数を生成します。その乱数列を XOR 演算によって平文に重ね合わせ暗号化処理を行います。従って、ブロック暗号をストリーム暗号のように利用します。 |
KAK | key auto-key | OFBの別名 |
NOFB | Nビット形式Output FeedBack | OFBと互換ですが、アルゴリズムのブロックサイズを変更可能なため、より安全です。 |
CFB | Cipher FeedBack 暗号フィードバックモード | 1バイト毎に暗号化する必要があるバイトストリームを暗号化する際に適したモードです。 |
CTAK | ciphertext auto-key | CFBの別名 |
k-CFB | k-bit CFB | |
CTR | CounTeR | AES暗号制定の際に追加されたモード |
CTS | CipherText Stealing | |
2DEM | 2D Encryption Mode | |
ABC | Accumlated Block Chaining | |
IGE | Infinite Garble Extension | |
F8@3GPP |
ECB, CBC, OFB, CFBの4つは、FIPS, ANSIのほか、ISO、JISで規格化されている。
認証用の利用モード
CCM | Counter with CBC-MAC |
---|---|
OCB | Offset CodeBook |
XCBC | eXtended 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度知られると、同一の値を持つ暗号ブロックはすべて解読されたことになります。
暗号文改ざん攻撃
ブロック長分割の際にブロック長で単純に分割していた場合、ブロック単位の差し替えを行うことができます。
これはデータ改ざんの手法で暗号解析の手法ではありません。
ただし改ざん攻撃をするために、鍵を入手したり平文を正確に把握する必要はありません。
関連記事
- プログラムでもっとも正確に日本の祝日を求める方法(内閣府公表CSVの過去3度の改訂履歴)
- FAT(File Allocation Table)ファイルシステムの仕様 FAT16 FAT32 exFAT VFAT
- SDカード・microSDカードの規格
- Raspberry Pi 4 Model Bのチップ・無線LANアンテナ
- Raspberry Pi Zero WHのチップ・無線LANアンテナ(大きなチップはCPUではありません)
- 各ストレージの速度一覧 規格速度や実効速度(HDD/SSD/M2/NVMe/USBメモリ)
- メールテキストの1行の文字数制限(最大1,000文字、78文字以下であるべき)
- サイトマップ(sitemap.xml)のつくり方とちょっとしたテクニック
- Mobile Network Code(MNC)の一覧[V-Z]
- Mobile Network Code(MNC)の一覧[T-U]
- Mobile Network Code(MNC)の一覧[S]
- Mobile Network Code(MNC)の一覧[O-R]
- Mobile Network Code(MNC)の一覧[M-N]
- Mobile Network Code(MNC)の一覧[J-L]
- Mobile Network Code(MNC)の一覧[H-I]
- Mobile Network Code(MNC)の一覧[E-G]
- Mobile Network Code(MNC)の一覧[C-D]
- Mobile Network Code(MNC)の一覧[A-B]
- Mobile Country Code(MCC)の一覧
- コードページの一覧
- オープンソースライセンスの一覧と日本語訳(全52種類)
- ASCIIコード表
- IPアドレス サブネットマスク プレフィックス 早見表
- 文字実体参照(実体参照)の一覧
- 各地域、各国に割り振られているIPアドレス
- トラックバックの仕様
- webサイト巡回ツールのユーザーエージェント一覧
- whoisに表示されるステータス一覧
- Whoisサーバー一覧
- IANAによる文字コードの定義
- UTFとは
- 文字コード表(コード対応表) 0x0-0x4
- 文字コード表(コード対応表) 0x5-0x6
- 文字コード表(コード対応表) 0x7-0x8
- 文字コード表(コード対応表) 0x9-0xA
- 文字コード表(コード対応表) 0xB-0xC
- 文字コード表(コード対応表) 0xD-0xF
- インターネット初期に日本に割り振られたIPアドレス一覧
- 画面解像度の一覧
- Perl互換の正規表現(PCRE)に関する仕様
- HTTP/1.0仕様書 日本語訳
- HTTP/1.0
- 文字コード表(EUC-JP) [12836/12836]
- 文字コード表(Unicode UTF-8 UTF-16) [21420/21420]
- 文字コード表(コード対応表) 0xF
- 文字コード表(コード対応表) 0xE
- 文字コード表(コード対応表) 0xD
- 文字コード表(コード対応表) 0xC
- 文字コード表(コード対応表) 0xB
- 文字コード表(コード対応表) 0xA
- 文字コード表(コード対応表) 0x9
- 文字コード表(コード対応表) 0x8
- 文字コード表(コード対応表) 0x7
- 文字コード表(コード対応表) 0x6
- 文字コード表(コード対応表) 0x5
- 文字コード表(コード対応表) 0x4
- 文字コード表(コード対応表) 0x3
- 文字コード表(コード対応表) 0x2
- 文字コード表(コード対応表) 0x1
- 文字コード表(コード対応表) 0x0
- 文字コード表(Unicode UTF-8 UTF-16) [14000/21420]
- Unicode文字のブロックの範囲
- 文字コード表(EUC-JP) [6000/12836]
- 文字コード表(JIS)
- 文字コード表(Shift-JIS)
- 文字コード表(Unicode UTF-8 UTF-16) [7000/21420]
- RFC
- 電車路線、駅の一覧
- Google Developers
- Rainmeter
- Git
- fail2ban
スポンサーリンク