【问题标题】:ruby OpenSSL RSA character encodingruby OpenSSL RSA 字符编码
【发布时间】:2015-02-03 04:56:25
【问题描述】:

我正在 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。

【问题讨论】:

    标签: ruby-on-rails ruby openssl rsa


    【解决方案1】:

    是的,你明白了。您应该在加密之前将 UTF-8 显式转换为字节,并在解密后再次返回。底层库只处理无符号字符,它们是 C 的字节等价物。

    如果我正确阅读了 Ruby API,您应该可以使用:

    string.force_encoding(Encoding::UTF_8)
    

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      相关资源
      最近更新 更多