2014-12-05 3 views
1

Я строю API в Rails, который расшифровывает один из параметров POST с помощью RSA. При проверке шифрования и дешифрования внутри Ruby, как показано ниже, строковый литерал, зашифрованный (который, как представляется, кодируется в кодировке UTF8), не появляется в качестве UTF-8 после дешифрования. Почему это ASCII-8BIT? Каков рекомендуемый способ справиться с этим? Должен ли я вызвать force_encoding («UTF-8») в расшифрованной строке и сказать в спецификации API, что все строки должны быть UTF8 перед шифрованием?ruby ​​OpenSSL RSA кодировка символов

@rsa = OpenSSL::PKey::RSA.new(1024) 

original = "hej på dig\n" 

puts original.encoding.name # => "UTF-8" 

ciphertext = @rsa.public_encrypt(original) 

decrypted = @rsa.private_decrypt(ciphertext) 

puts decrypted.encoding.name # => "ASCII-8BIT" 

assert_equal original, decrypted 
#expected: hej på dig 
#actual: hej p\xC3\xA5 dig 

Я использую Ruby 2.1.3 на OSX Yosemite with Rails 4.1.5.

ответ

1

Да, вы поняли. Вы должны явно перевернуть UTF-8 в байты перед шифрованием и снова после дешифрования. Базовая библиотека просто обрабатывает беззнаковые символы, которые являются байты эквивалентом C.

Если я прочитал Рубин API, правильно, вы должны быть в состоянии сделать это с помощью:

string.force_encoding(Encoding::UTF_8) 
Смежные вопросы