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
参考
- php – Are OpenSSL and Mcrypt incompatible? – Stack Overflow
- C# AES 256 bits Encryption Library with Salt – CodeProject