C言語OpenSSLのAES256とC# RijndaelManagedクラスの互換性

OpenSSLでAES-256で暗号化したものをSystem.Security.Cryptography.RijndaelManagedクラスで復号するためのメモ。

同じ“256”にだまされてはいけない

LinuxとWindowsで暗号化通信を実装することになったので、LinuxはCからOpenSSLの関数を使い、WindowsではC#でRijndaelManagedクラスを使うことにした。

当初、AES-256というからには鍵長256 bits、ブロック長256 bitsだよね!とか思ってC#側の復号部分を書いていたのだが、これが全くうまくいかない。AES-128(いわゆるAES)ならC#側にAesCryptoServiceProviderを使うことでうまくいくのだが。

で、いろいろ調べたところ、まず第一にAES-256とRijndael-256に互換性はない!らしい。

Just to add to nrathaus comment. AES-128 and rijndael-128 are compatible, but AES-256 and rijndael-256 are not.

正確には、Rijndael-256の場合、ブロック長を128, 192, 256 bitsから選べるが、AES-256だと鍵長は256 bitsでもブロック長は128 bitsに固定されている。

つまり、ブロック長が128 bits以外のRijndael-256とAES-256には互換性がない、というわけだ。

というわけでRijndaelManagedクラスのほうもBlockSizeは128にしてやる必要があった。こちらのソースを見るまでさっぱり気づかなかった。思い込みというのは怖い。

AES.KeySize = 256;
AES.BlockSize = 128;

まとめ

  • AES-256 = Rijndael-256 ではない
  • AES-256 の鍵長は256 bits、ブロック長は128 bits

参考

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です