この暗号化アルゴリズムはセキュリティ・キャンプ全国大会 2019 暗号化通信ゼミにて開発されました.
執筆中
- 平文ブロック長:45 文字
- 暗号文ブロック長:54 文字
- 鍵長:可変
- 暗号化処理の並列化:部分的に可 (※但し,Shuffle がボトルネックとなる)
- 復号処理の並列化:部分的に可 (※但し,Sort がボトルネックとなる)
- Random Read:不可
- 平文をブロックに分ける
- 必要があればパディングを用意する
- 全ての平文に対してマスク処理 1 を行う
- 全てのブロックに対し,エンコードを行う
- 全てのブロックのハッシュに対してマスク処理 2 を行う
- ブロックごとに暗号化を行う
- ブロックをシャッフルする (下記「shuffle」参照)
- 暗号文をブロックに分ける
- 全てのブロックに対して復号を行う
- 暗号化の(5)で使用したマスク処理を元に戻す
- (3)により現れるシーケンス番号を元に,ブロック間ソートを行う
- 暗号化の(3)で使用したマスク処理を元に戻す
- 全てのブロックに対し,デコードを行う
- 全てのブロックを結合させ,平文を生成する
平文ブロックが 45 文字 に満たない場合,1 文字 分 null 入れ,残りはランダムな英数列を入れる.
下記の文字集合を用いて表現できる数であり,この集合を表示可能文字と呼ぶ.表示可能文字は下記の順に順序を持っている.エスケープシーケンスに関しては ASCII コード参照.
{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\', ']', '^', '_', '`', '{', '|', '}', '~', ' ', '\n', '\0', '\t'}
本節では以下の記号を用いる.
$n$ :現在操作しているブロックの番号(0,1,2,...)$C_i$ :ブロックの$i$ 文字目の文字$\mathrm{toas}(C)$ :特定の文字$C$の ASCII コードにおける番号$\mathrm{fras}(N)$ :特定の数字$N$の ASCII コードにおける文字$\mathrm{rand}()$ :アルファベット又は数字から 1 文字を一様に選ぶ関数$\mathrm{to62}(x)$ :$[0, 98)$ の自然数 x を 98 進数に従って文字に変換する関数
この時,
とする.ただし,$i=1,2,3,4,5$ とする.これを全てのブロックに対して行う.
上記「エンコード」で付与した値を削除する.また,ハッシュが一致しているかチェックする.これにより改ざんやビット反転を検知することができる.
mask(1)では各ブロックの平文の先頭 45 文字にマスク処理を行う.まず,以下を定義する.
平文の$i$文字目:$Pi$ >
$i$ 番目のマスク:$Mi$ 表示可能文字内の文字$Pi$のインデックス:$\mathrm{Idx}(Pi)$
とすると,
$$Pi=\mathrm{printable\_table}[(\mathrm{Idx}(Pi)+Mi) \bmod 98]\\$$とする.
mask(2)ではハッシュとシーケンス番号にマスクをかける.計算方法は上記「mask(1)」と同様.
暗号化処理
復号処理
暗号化後に全ブロックをシャッフルする.Fisher–Yates のアルゴリズムを用いることによって高速に実現可能となる.
各ブロックの 51,52 番目を 98 進数として扱い,この値が昇順になるようにブロックごとにソートする.
- 暗号文 (
$N$ ブロック) - mask(1) (
$N*45$ 文字) - mask(2) (
$N*5$ 文字)
上記shuffleを行うことによって,どのブロックがもともとどこに在ったのか,という情報が隠蔽され,ブロックのすり替えができなくなる.