下面代码返回的值是
当我们在测试中使用这个时:
这是一个编码问题,我们可以通过以下方式看到:
现在,我们失败的测试通过了:
以上方法应该失败的原因是因为我们再次比较ASCII-8bit和UTF-8(之前已经失败了):
但是当我们从另一个方向进行时,它不会失败:
"\x88\x90r\"\x9EN\xFFR"
:MyApp::XVP::xvp_password_encrypt_vnc("L1UkDr]c")
# => "\x88\x90r\"\x9EN\xFFR"
当我们在测试中使用这个时:
should "correctly encrypt a vnc password" do
assert MyApp::XVP::xvp_password_encrypt_vnc("L1UkDr]c") == "\x88\x90r\"\x9EN\xFFR"
end
# => false
这是一个编码问题,我们可以通过以下方式看到:
MyApp::XVP::xvp_password_encrypt_vnc("L1UkDr]c").encoding
# => #<Encoding:ASCII-8BIT>
"\x88\x90r\"\x9EN\xFFR".encoding
# => #<Encoding:UTF-8>
因此,比较失败是有道理的,修复方法是在 xvp_password_encrypt_vnc
方法末尾强制转换为 UTF 编码,如下所示:
def xvp_password_encrypt_vnc(hex)
des = OpenSSL::Cipher::Cipher.new("des-ecb")
... etc
des.update(hex).force_encoding('UTF-8')
end
现在,我们失败的测试通过了:
should "correctly encrypt a vnc password" do
assert MyApp::XVP::xvp_password_encrypt_vnc("L1UkDr]c").force_encoding("UTF-8") == "\x88\x90r\"\x9EN\xFFR"
end
# => true
但是反过来似乎不起作用:
# This should fail
should "correctly encrypt a vnc password" do
MyApp::XVP::xvp_password_decrypt_vnc("\x88\x90r\"\x9EN\xFFR") == "L1UkDr]c"
end
# => true
以上方法应该失败的原因是因为我们再次比较ASCII-8bit和UTF-8(之前已经失败了):
MyApp::XVP::xvp_password_decrypt_vnc("\x88\x90r\"\x9EN\xFFR").encoding
# => #<Encoding:ASCII-8BIT>
"L1UkDr]c".encoding
# => #<Encoding:UTF-8>
为什么只能单向传输:
something encoded in ASCII 8-bit != same thing encoded in UTF-8
但是当我们从另一个方向进行时,它不会失败:
something encoding in UTF-8 == same thing encoded in ASCII 8-bit
"\x88\x90r\"\x9EN\xFFR".valid_encoding?
可以帮助回答你的问题。你的问题在于该字符串不是“以UTF-8编码的相同内容”,这些字节甚至不是有效的UTF-8。然而,纯文本密码的ASCII和UTF-8编码作为字节和字符是等效的。 - Neil Slater