2014-12-05 41 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)