ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

暗号理論入門 7章

暗号理論入門 原書第3版

暗号理論入門 原書第3版

目的のAESの章まできた。
NISTのドキュメント(pdf)
AES implementations(英語のwikipedia

第7章 AES暗号化アルゴリズム

アメリカ国立標準技術研究所(NIST)によりDESの後継となる暗号アルゴリズムの選考が行われ、ラインダール(Rijndael)暗号が採用され、規格化された。

7.1 記号

ラインダール暗号の構成には以下の記号が必要。

  • Nb
    平文ブロックと暗号文ブロックはNb個の32bitの語からなる。
    AESはNb = 4。よってAESのブロック長は128。

  • Nk
    鍵はNk個の32bitの語からなる。
    AESではNk = 4, 6, 8である。したがってAES鍵空間は  \mathbb{Z}_{2}^{128},\ \ \ \ \ \mathbb{Z}_{2}^{192},\ \ \ \ \ \mathbb{Z}_{2}^{256} のうちのどれかである。

  • Nr
    巡回の回数。AESでは、
    Nk = 4 のとき Nr = 10
    Nk = 6 のとき Nr = 12
    Nk = 8 のとき Nr = 14

平文と暗号文は4行Nb列の二次元byte配列として表す。
ラインダール鍵は、長さNkのword配列である。KeyExpansionという関数で、4*Nkの鍵から伸長鍵wを作る。
その後、平文ブロックはCipherアルゴリズムで暗号化される。

7.2 Ciper

平文ブロックはbyte配列stateにコピーされる。
stateはAddRoundKeyという初期変換が適用される。
stateはNr回巡回し、暗号文として返信される。最初のNr-1回は変換SubBytes、ShiftRows、MixColumns、AddRoundKeyを順次適用する。
最終巡回では、変換SubBytes、ShiftRows、AddRoundKeyのみを適用する。

NISTのドキュメントの5.1に擬似コードがある。

7.2.1 ByteとGF(28)の元の同一視

Byteはラインダール暗号文において有限体 GF(2^{8}) の元と同一視される。

7.2.2 SubBytes

NISTのドキュメントの5.1.1
DESのようにSボックスというByteを変換するためのテーブルがある。
これによりAESの非線形性を保証している。

7.2.3 ShiftRows

NISTのドキュメントの5.1.2
平文を部分変換したstateを行列表記した際の、行に巡回左シフトを適用する。
多重巡回を適用すると、この変換は高拡散の原因となる。

7.2.4 MixColumns

NISTのドキュメントの5.1.3
列ごとに指定多項式による変換を加える。
この変換はstateの列内の拡散の原因となる。

7.2.5 AddRoundKey

NISTのドキュメントの5.1.4
巡回鍵とstateのXORを計算。巡回の変換を鍵に依存させる効率的な変換。

7.3 KeyExpansion

NISTのドキュメントの5.2
アルゴリズムKeyExpansionにより、長さ4Nkのbyte配列であるラインダール鍵から、長さNb(Nr+1)のword配列である伸長鍵wが作られる。

7.4 実例

実際に動かしたログが記載されているだけ。

自分でも実装しようと思ってけど、あまりにたくさん実装例があるのでpycryptoを使ってみるだけにする。

#!/usr/bin/env python

import Crypto.Cipher.AES

aes = Crypto.Cipher.AES.new('16byte key abced', Crypto.Cipher.AES.MODE_ECB)

p = '16byte message__'
print('input : ' + p)

c = aes.encrypt(p)
print('enc   : ' + c)

p = aes.decrypt(c)
print('dec   : ' + p)

実行結果

input : 16byte message__
enc   : �
         ��#5cQ�:��;
dec   : 16byte message__

7.5 InvCipher

復号化する手順。NISTのドキュメントの5.3。



一応目的の章まで読んだから後はディッフィー・ヘルマン鍵交換方式と、ディジタル署名の章を流し読みして終わりにする。
この本は暗号の基礎が1冊で完結するように、丁寧に代数から解説が書いてある。教科書としては例がちょっと少ないかもしれない。
あと、courseraのスタンフォード大学のCryptography1という講義のカリキュラムを見ると、6週間でこの本よりはるかに多い量を学ぶようだ。代数は前提として、現場で用いられている暗号化アルゴリズムの内部構成などが対象っぽい。