|
Salsa20は、ダニエル・バーンスタインによって開発されたストリーム暗号である。32-bit addition、XORおよびキャリーなしローテートに基づく疑似乱数生成によって構成され、256ビットの鍵長、64ビットのnonce、512ビットの状態長を持つ(128ビットの鍵長のバージョンも存在する)。これにより、Salsa20には、ユーザが決まった時間で出力されるストリームの任意の位置を探索することが可能となる。最近のx86プロセッサでは、ソフトウェア実装で4–14 cycles per byte程度の速度を示す〔Salsa20 home page 〕。Salsa20は特許で保護されておらず、設計者であるバーンスタインによっていくつかのアーキテクチャ向けの最適化実装がパブリックドメインで公開されている〔Speed of Salsa20 〕。 == 構造 == Salsa20は、XOR、32-bit addition mod 232、32ビット長のワード16個のローテートを用いる。これにより、ソフトウェア実装におけるタイミング攻撃を回避することができる。 初期状態は8ワードの鍵、2ワードのストリーム位置、2ワードのnonce、4つの固定長のワードである。20ラウンドを経て、16ワードのストリーム出力を得る。 それぞれのラウンドは、4つの1/4ラウンド操作で構成され、4×4マトリックスからなる16ワードの行、列のいずれかとなる。2ラウンドごとにパターンは繰り返される。2ラウンドごとの疑似関数は以下の通りである。ここで ⊞ は addition modulo 232、<<< は左ローテート操作、^ は排他的論理和である。 x ^= y は x = x ^ y の略記である。x4 ^= (x0 ⊞ x)<<<7; x9 ^= (x5 ⊞ x1 )<<<7; x ^= (x ⊞ x6 )<<<7; x3 ^= (x ⊞ x)<<<7; x8 ^= (x4 ⊞ x0 )<<<9; x ^= (x9 ⊞ x5 )<<<9; x2 ^= (x ⊞ x)<<<9; x7 ^= (x3 ⊞ x)<<<9; x ^= (x8 ⊞ x4 )<<<13; x1 ^= (x ⊞ x9 )<<<13; x6 ^= (x2 ⊞ x)<<<13; x ^= (x7 ⊞ x3 )<<<13; x0 ^= (x ⊞ x8 )<<<18; x5 ^= (x1 ⊞ x)<<<18; x ^= (x6 ⊞ x2 )<<<18; x ^= (x ⊞ x7 )<<<18; x1 ^= (x0 ⊞ x3 )<<<7; x6 ^= (x5 ⊞ x4 )<<<7; x ^= (x ⊞ x9 )<<<7; x ^= (x ⊞ x)<<<7; x2 ^= (x1 ⊞ x0 )<<<9; x7 ^= (x6 ⊞ x5 )<<<9; x8 ^= (x ⊞ x)<<<9; x ^= (x ⊞ x)<<<9; x3 ^= (x2 ⊞ x1 )<<<13; x4 ^= (x7 ⊞ x6 )<<<13; x9 ^= (x8 ⊞ x)<<<13; x ^= (x ⊞ x)<<<13; x0 ^= (x3 ⊞ x2 )<<<18; x5 ^= (x4 ⊞ x7 )<<<18; x ^= (x9 ⊞ x8 )<<<18; x ^= (x ⊞ x)<<<18; Salsa20は20ラウンドの操作を行い、最終アレイを元のアレイに加えて64バイトの出力ブロックとする〔http://cr.yp.to/snuffle/salsafamily-20071225.pdf〕。また、ラウンド数をそれぞれ8、12に削減したSalsa20/8 および Salsa20/12と呼ばれる変種も存在する。これらはSalsa20を補完するものであり、ラウンド数の削減によってセキュリティマージンが小さくなる。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「Salsa20」の詳細全文を読む スポンサード リンク
|