2014-12-05 95 views
1

我在使用RSA解密其中一个POST参数的Rails中构建了一个API。如下所示,当在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 

我在使用Rails 4.1.5的OSX Yosemite上使用Ruby 2.1.3。

回答

1

是的,你明白了。您应该在加密之前明确地将UTF-8转换为字节,并在解密后再次转回。底层库简单处理无符号的字符,如果我读这是一个字节相当于为C.

Ruby的API的正确,你应该能够通过使用要做到这一点:

string.force_encoding(Encoding::UTF_8)