OpenSSL::Cipher は Ruby と JRuby (Java) で実行結果が異なる (場合がある)

Ruby OpenSSL は JRuby OpenSSL とは実装が違うので、同じコードでも結果が異なる場合があります。

昨日 OpenSSL::Cipher を利用していてそんな状況に遭遇したので、メモメモ。

以下のコードは、Ruby と JRuby (or Java) で実行結果が異なります。つまり、Ruby で暗号化したデータを JRuby (or Java) で複合化できません。。。

require 'openssl'
def display_bytes(bytes) bytes.each_byte do |byte| print byte, ":" end end
plain_text = "some plain text is here" key = "1234567890abcdef" # 16 bytes iv = "abcdef1234567890" # 16 bytes
cipher = OpenSSL::Cipher::AES.new("128-CBC") cipher.iv, cipher.key = iv, key cipher.encrypt cipher_text = cipher.update(plain_text) + cipher.final
display_bytes(cipher_text)

そして、なんと赤文字の部分を逆にしてやると Ruby と JRuby の結果は同じになります。

cipher.encrypt
cipher.iv, cipher.key = iv, key

JRuby は順序を変えても結果は変わらないので、Ruby OpenSSL の方に問題があるのだと思います。

Read more