Blog of Heath

Initialization Vector Length in MRI Ruby versus JRuby

Posted in Ruby, Technology by heathanderson on September 27, 2009

When using OpenSSL encryption in standard Ruby, the length of an initialization vector (IV) can apparently be as large as you want it to be as long as it is at least the minimum size. This is odd. This can also cause trouble when switching over to JRuby. JRuby appear to be much pickier about IV length.

This works in MRI but not in JRuby:

unencrypted_data = "test"

des = OpenSSL::Cipher::Cipher.new("des-ede3-cbc")
des.encrypt
des.key = '0123456789abcdef01234567890'

des.iv = "ed87acdcca419954edccb736f7dc77a74f5ac8dfe3861c3d5f77248e21592131a5423d63ff91f07956ce1aa386f8359931b5" # 100 characters
encrypted_data = des.update(unencrypted_data) + des.final

puts encrypted_data

JRuby gives you this very helpful message:
ruby_string_encryption.rb:27:in `encrypt': No message available (OpenSSL::Cipher::CipherError)
from ruby_string_encryption.rb:37

Change the IV to 8 characters and everything works fine.

Update 10/14/2009 The code that I originally posted was incorrect. I have updated it. Also I opened a ticket for this issue.

If you are looking for what size an initialization vector should be check out my post on encrypting a string with Ruby.

Tagged with: , ,

One Response

Subscribe to comments with RSS.

  1. Charles Oliver Nutter said, on September 28, 2009 at 4:25 am

    Hello from the JRuby team!

    OpenSSL is a tricky beast to emulate, but at the moment we pass all available tests and specs for Ruby’s OpenSSL library. If there are cases like this that you think we should be passing, we’d love to get bug reports for them. Even better, if you think you can *help*, we’d love to accept your patches :)

    JRuby’s OpenSSL support certainly isn’t perfect, but we want to keep improving it.


Leave a Reply