概要
「暗号化における IV と nonce の違いってなんだろう?よくわからない 🤔」とふと思い、調べてみた。
IV と nonce の比較
定義
IV
IV は初期化ベクトル (initialization vector) のこと。初期化ベクトル - Wikipedia によると
初期化ベクトルはビット列であり、ストリーム暗号またはブロック暗号を任意の暗号利用モードで実行するとき、同じ暗号鍵でストリームを生成しても毎回異なるストリームを生成するのに必要とされる。これにより、毎回暗号鍵を替えるといった時間のかかる作業を省くことができる。
加えて IV は予測不可能な乱数である必要がある。
余談だが、暗号化のたびに初期化ベクトルは変更することが望ましい。さもないと、例えば CBC モードで同じ初期化ベクトルを使った場合、同じ平文から同じ暗号文が生成されてしまう。つまり同じ平文であることを暗号文から推測されてしまう。
nonce
nonce は number used once の略であり、一度だけ使用される数字のこと。ノンス - Wikipedia によると
ノンスは、暗号通信で用いられる、使い捨てのランダムな値のことである。ノンスはたいてい、認証の過程で使われ、リプレイ攻撃を行えないようにする働きを担っている。
そしてこの Wikipedia には IV との比較に関しても言及されている。
ストリーム暗号でも、同じ鍵で暗号化の結果をメッセージごとに異なったものとするためにノンスが使われることがある。この場合、メッセージの番号を使うことも多い。同様の目的で使われる初期化ベクトルも、見方を変えればノンスの一種とも考えられる。
比較
cbc - Difference between a nonce and IV - Cryptography Stack Exchange という記事の回答を参考にした。
- 前提として両者は異なる概念である。
- IV を暗号化のたびに変更する場合、つまり IV が「一度だけ使用されるランダムなビット列」であればそれは nonce とも言える。
- nonce の生成方法として、単に増加する数を使う場合もある。
- ブロックチェーンの文脈での nonce がこれに該当するようだ。
要は「IV と nonce は違う概念だけど、IV の使い方によっては nonce とも呼べる」ってことかなと結論づけた。