.NetのRijndaelManagedのKeySize/BlockSize Key/IVに順序依存がある、という記事がたまたま2件連続してサジェストされたので。古い記事ですが、共通する考え違いをする人がいるというのはある程度一般的な間違いなのかなと思い記事にします。
感覚的な話として、KeySize/BlockSizeはKey/IVの長さを指定するものなのですから、Key/IVをセットした後にKeySize/BlockSizeをいじれば良くないことが起きても仕方が無いでしょう。
実際に何が起きたか
両例とも.NetのRijndaelManagedを使っていますが、RijndaelManaged(に限らずSymmetricAlgorithmを継承する暗号化アルゴリズム)はKeySizeをセットすると(値が変わらなくとも)Keyがランダム値で初期化されます(BlockSizeの場合は変更があった場合にIVが初期化されます)。要するに、Key => KeySizeの順で設定したコードは設定した鍵ではなくランダムな鍵で処理を行っていることになります。
なお発生したエラーの正体は下記:
「順序依存」の問題なのか
Noです。暗号化アルゴリズムの基本パラメータである鍵長やブロック長を触ればその通りの長さとなっていないといけない鍵やIVが初期化される、という当然に想定しうる挙動をしているだけです。
このような挙動についての前提知識が無かったのだとしても
-
KeySize/BlockSizeと渡そうとしているKey/IVの長さが異なったらどうなるのか - セットされている
Key/IVと異なる長さにKeySize/BlockSizeをセットしたらセットされているKey/IVがどうなるのか
と言う疑問が普通は生じるはずです。これは暗号アルゴリズムに限らず、「バッファとバッファ長」みたいな一般論で言えることです。これが「順序依存」の問題に見えるというのはパラメータの意味を考えないまま扱っているのが原因では無いかと想像します。