ruby-on-rails - ruby OpenSSL RSA 字符编码

标签 ruby-on-rails ruby openssl rsa

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

相关文章:

javascript - 将 OpenSSL 命令行 AES 加密映射到等效的 NodeJS Crypto API

ruby-on-rails - 如何在Ruby in Rails中使用外部API

sql - 如何列出用户可用的所有任务?

c++ - 非阻塞连接 OpenSSL

java - SWF 最大工作流程执行时间限制

Ruby 时间操作

shell - 将文件传输到命令时从 openssl 获取不同的输出

mysql - rake 数据库 :migrate returns "Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds.."

ruby-on-rails - ruby/rails 中的 worker 是什么?

ruby - 在 ruby​​ 中调用 do block 内的方法