我正在 Rails 中构建一个 API,它使用 RSA 解密 POST 参数之一。当在 ruby 内部测试加密和解密时,如下所示,加密的字符串文字(似乎是 UTF8 编码的)在解密后不会显示为 UTF-8。为什么是ASCII-8BIT?建议的处理方法是什么?我是否应该对解密的字符串调用force_encoding("UTF-8"),并在API规范中规定所有字符串在加密之前都应该是UTF8?
@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
我在 OSX Yosemite 上使用 Ruby 2.1.3 和 Rails 4.1.5。
最佳答案
是的,你明白了。您应该在加密前显式将 UTF-8 转换为字节,并在解密后再次转换回来。底层库仅处理无符号字符,这相当于 C 的字节。
如果我正确地阅读了 Ruby API,您应该能够使用以下方法来完成此操作:
string.force_encoding(Encoding::UTF_8)
关于ruby-on-rails - ruby OpenSSL RSA 字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27308819/