暗号理論入門 4.10〜4.12
- 作者: 林芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2012/04/20
- メディア: 単行本
- この商品を含むブログを見る
4.10 アフィン暗号
を自然数、平文アルファベットを とする。アフィン暗号(affine cypher)とは、ブロック長 のブロック暗号で、鍵空間は に素である のすべての組 からなる。
鍵 に対する暗号化関数 は
である。鍵 に対する復号化関数は
である。
pythonで書いてみる。'A'〜'Z'のみ使用する。
class AffineCypher(object): def __init__(self, key): self.key = key def Encrypt(self, m): enc = lambda x : chr((self.key[0] * (ord(x)-ord('A')) + self.key[1]) % 26 + ord('A')) return ''.join(map(enc, m)) def Decrypt(self, m): gcd, a_, y = xeuclid(self.key[0], 26) if a_ < 0: a_ += 26 dec = lambda x : chr((a_ * (ord(x)-ord('A')) - a_ * self.key[1]) % 26 + ord('A')) return ''.join(map(dec, m))
拡張ユークリッドアルゴリズムのxeuclid()は以前の記事のものをそのまま使用。
鍵(7, 3)で動かしてみる。
>>> key = (7, 3) >>> affine = AffineCypher(key) >>> p = 'AFFINECYPHER' >>> e = affine.Encrypt(p) >>> print e DMMHQFRPEAFS >>> p = affine.Decrypt(e) >>> print p AFFINECYPHER
となるアフィン暗号の鍵空間は、 個の元がある。鍵をすべて当たってみることで暗号文のみ攻撃で復号化できる。
4.11 行列と線形写像
行列の一般的な話がほとんど。
4.12 アフィン線形ブロック暗号
アフィン線形ブロック暗号はアフィン暗号を一般化したもので、以前はよく使用された。
アフィン線形ブロック暗号を定義するため、自然数 と を必要とし、 をブロックの長さとする。
ブロック長 のブロック暗号と平文空間、暗号文空間 に対して、そのすべての暗号文関数がアフィン線形であれば、このブロック暗号をアフィン線形という。すべての暗号化関数が線形であれば、このブロック暗号を線形という。
暗号化関数はアフィン線形であるため、
という形である。 かつ とする。
復号化関数は
となる。
ここで、 とし、 は の での逆元とする。