ストリーム暗号アルゴリズム
ストリーム暗号とは
ストリーム暗号は,ブロック暗号がブロック単位で暗号化されるのに対し,もっと小さな単位 (多くは 1 ビットないし 8 ビット単位) で暗号化される方式である.
一般的にストリーム暗号の方がブロック暗号よりも高速である.ブロック暗号と比較すると,誤り伝搬が小さく同期を取り易いため,通信における回線暗号装置ではストリーム暗号がよく使われる.
( → ブロック暗号アルゴリズム)
ストリーム暗号の代表的な例であるバーナム暗号は次のように表される.
- 暗号化: C = M xor K
- 復号 : M = C xor K
暗号化する対象 M と同じ長さの鍵 K により,暗号化対象を XOR演算して暗号化する.
その他,ストリーム暗号として有名なものに RC4, SEAL などがある.
ストリーム暗号の構造
ストリーム暗号は,一般に鍵ストリームを生成する鍵ストリーム生成部と鍵ストリームと平文を結合する結合部から構成される.
鍵ストリーム生成の方法には,フィードバックシフトレジスタなどの専用のアルゴリズムによるものとブロック暗号を元にした生成方法とがある.
ストリーム暗号は,外部同期型と自己同期型に分類される.
- 同期式(外部同期式)
送信側・受信側ともに平文・暗号文とは独立して鍵シーケンスを生成する.ビット誤りが発生したときに他のビットに誤りが波及しない.常に送受信者間で同期しているため,削除,挿入,再送といった能動的な攻撃が行われた場合,同期がとれなくなり送受信者がすぐに検知することができる.しかし,攻撃者が暗号文を操作(例:ビット反転)することで,平文を変更できてしまうというデメリットにもなる.場合によってはMACなどのメッセージ認証が必要となる.また同期がずれた場合には,再同期の仕組みが別途必要となる.
ブロック暗号の利用モードの OFB(Output FeedBack)は,ブロック暗号を鍵生成器と見なせば外部同期式ストリーム暗号となる.
- 非同期式(自己同期式)
同期がずれたときでも自動的に再同期できるが,1ビットの誤りが他のビットにも伝搬し誤りが拡大する.
自己同期式は,送受信側とも暗号文を保持する外部レジスタを持っている.レジスタ長分の暗号文が誤りなく送信できれば,同期がずれたときでも自動的に再同期できるようになっている.そのため,ビット誤りが発生してもレジスタ長分正常に送信・受信できると,同期を自動的に回復できる.そのため,誤りが生じたとしても,最大でもレジスタ長分の伝搬で済む.
ブロック暗号を CFB(Cipher FeedBack)モードで利用すると,自己同期型式ストリーム暗号になる.
ストリーム暗号アルゴリズム
代表的な共通鍵暗号(ストリーム暗号)アルゴリズムを示す.
- RC4
Ron Rivestにより1987年に開発されたストリーム暗号方式であり,鍵長は2048までの可変長である.北米では,RC4の商標権をRSA社が保持しているため,インターネット上などではArcfour(ARC4)と呼ばれることもある.
SSLや無線LANのWEP(Wired Equivalent Privacy)で使われている(WEPでは,鍵長は40ビットまたは104ビット).
アルゴリズム:
- 初期化
- Ki :ユーザ鍵
- Si = i (i= 0~255)
- For i = 0 to 255
- j = (j + Si + Ki) mod 256
- Swap Si Sj
- 暗号化/復号
- i = (i + 1) mod 256
- j = (j + Si) mod 256
- Swap Si Sj
- t = (Si + Sj) mod 256
- St を平文(または暗号文)と XOR
- MUGI
ストリーム暗号向けの擬似乱数生成器であり,秘密鍵128ビット,初期ベクトル128ビット,出力ユニット長 n を入力して,n ユニット(ユニット:64ビットのデータブロック)の乱数列を出力する. MUGIはブロック暗号と同じ手法による設計を行っている.
(仕様:
http://www.sdl.hitachi.co.jp/crypto/mugi/)
- MULTI-S01
暗号化処理,復号処理からなり,それぞれ擬似乱数生成器とデータランダム化部分の2つの部分から構成される.擬似乱数生成器は,秘密鍵 K (256ビット)から鍵ストリーム A, B, S を(処理するデータの長さに応じた長さだけ)生成する. 暗号化は,メッセージ M (n×64 ビット),冗長符号 R (64ビット),秘密鍵 A (A≠0,64ビット),秘密鍵
B ((n+2)×64ビット),秘密鍵 S (64ビット)を入力として,暗号文 C ((n+2)×64ビット)を出力する.復号は,暗号文 C (64×n' ビット),冗長符号 R(64ビット),秘密鍵 A (≠0, 64ビット),秘密鍵 B(64×n' ビット),秘密鍵 S (64ビット)を入力して,改ざん検出信号,またはメッセージ
M (64×(n'-2) ビット) を出力する.
安全性は擬似乱数を発生する機構「擬似乱数生成器」の安全性に基づく.MULTI-S01は擬似乱数生成器としてPANAMA を用いている.
(仕様:
http://www.sdl.hitachi.co.jp/crypto/s01/)
- KCipher-2
KCipher-2は,処理能力が限られた小型モバイル機器上でも,本体の CPUに負担をかけることなく大容量データの暗号化や復元を行えるよう設計された共通鍵暗号方式のストリーム暗号アルゴリズムである.KDDI研と九州大学が共同で設計し,KDDI研が商用化したもので,ISO国際標準規格(ISO 18033-4) に採用されている (2012年).
携帯電話や ICカードなどリソースが限られた中で高速な処理を求められる分野への適用が考えられている.
(仕様:
"K2: A Stream Cipher Algorithm Using Dynamic Feedbak Control")
- ChaCha20
ChaCha20 は,鍵長256ビットのストリーム暗号である.入力に Nonce 96ビットと初期カウンタ値 32ビットを必要とする.ChaCha20 では,4バイト x 16個の状態テーブルを持ち,1/4ラウンド演算 (QuarterRound) と呼ばれる演算でこの状態を変化させる処理を行う.この状態テーブルの初期値は,定数,鍵,Nonce などを用いて設定される.20ラウンドの処理を行った後に,64バイト単位に平文または暗号文と XOR 処理を行う(暗号化と復号の処理は同じ).
ChaCha20 は,加算剰余, XOR,ビットローテーションという単純な計算処理だけから構成されるため,高速なソフトウェア処理が可能になる.
(仕様:
https://tools.ietf.org/html/rfc7539)