Подтвердить что ты не робот

Как зашифровать данные в строке UTF-8 с помощью OpenSSL:: Cipher?

В приложении Rails 3.0 (Ruby 1.9.2) я пытаюсь зашифровать некоторые данные, используя что-то вроде этого:

cipher = OpenSSL::Cipher.new 'aes-256-cbc'
cipher.encrypt
cipher.key = cipher.random_key
cipher.iv = cipher.random_iv

encrypted = cipher.update 'most secret data in the world'
encrypted << cipher.final

Это войдет в базу данных UTF-8. Моя проблема в том, что

> encrypted.encoding
 => #<Encoding:ASCII-8BIT>

> encrypted.encode 'utf-8'
Encoding::UndefinedConversionError: "\xF7" from ASCII-8BIT to UTF-8

Как я могу получить зашифрованную строку UTF-8?

4b9b3361

Ответ 1

Решение состоит в том, чтобы преобразовать строку ASCII-8BIT в Base64 и затем закодировать в UTF-8.

cipher = OpenSSL::Cipher.new 'aes-256-cbc'
cipher.encrypt
cipher.key = cipher.random_key
cipher.iv = cipher.random_iv

encrypted = cipher.update 'most secret data in the world'
encrypted << cipher.final

encoded = Base64.encode64(encrypted).encode('utf-8')

После сохранения и получения из базы данных

decoded = Base64.decode64 encoded.encode('ascii-8bit')

и, наконец, расшифровать его.


PS: Если вам интересно:

cipher = OpenSSL::Cipher.new 'aes-256-cbc'
cipher.decrypt
cipher.key = random_key
cipher.iv = random_iv

decrypted = cipher.update encoded
decrypted << cipher.final

> decrypted
 => 'most secret data in the world'

Ответ 2

Я считаю, что лучше всего использовать force_encoding найденный здесь.

> encrypted.encoding
  => #<Encoding:ASCII-8BIT>

> encrypted.force_encoding "utf-8"

> encrypted.encoding
  => #<Encoding:UTF-8>