对于客户端和服务器之间的端到端加密通信,我正在实现一种加密/解密算法。
但是,它们(加密/解密和 base64 编码/解码)只有在 Ruby 中才能正常工作。
但我看到的实际问题是 Ruby 的 Base64 编码。
例如,假设我有这个(32 字节)AES key :
"\"1\xAF\xC7\xC0\xA6\xC9\xBA\xD6\x9F\xBA\xD2\xC9\xBE\x0F\x8E*\x88\x87(\x9B\xCBp\x15!/\x13\x8F\xCE\xFB\x15\x9B"
我正在使用 AES 算法加密数据。
我想以 Base64 编码格式将此 key 发送给客户端。为此,我正在做(两种方式,每种方式产生不同的编码输出):
输入双引号
Base64.urlsafe_encode64("\"1\xAF\xC7\xC0\xA6\xC9\xBA\xD6\x9F\xBA\xD2\xC9\xBE\x0F\x8E*\x88\x87(\x9B\xCBp\x15!/\x13\x8F\xCE\xFB\x15\x9B")
# => "IjGvx8CmybrWn7rSyb4PjiqIhyiby3AVIS8Tj877FZs="
输入单引号
Base64.urlsafe_encode64('\"1\xAF\xC7\xC0\xA6\xC9\xBA\xD6\x9F\xBA\xD2\xC9\xBE\x0F\x8E*\x88\x87(\x9B\xCBp\x15!/\x13\x8F\xCE\xFB\x15\x9B')
# => "XCIxXHhBRlx4QzdceEMwXHhBNlx4QzlceEJBXHhENlx4OUZceEJBXHhEMlx4QzlceEJFXHgwRlx4OEUqXHg4OFx4ODcoXHg5Qlx4Q0JwXHgxNSEvXHgxM1x4OEZceENFXHhGQlx4MTVceDlC"
输出 1 不同于所有其他库:Java、Swift 和 an online site , another site ,它们都产生相同的输出。
Output 2 在输出编码方面与其他库相同。但是我在将 AES key 和 AES 加密数据转换为在单引号中使用时遇到问题,这是不可能的,因为我加密的数据已经包含那些单引号和其他非法字符,Ruby 的 Base64 编码无法正常工作。
如有任何帮助,我们将不胜感激。
最佳答案
问题是当你使用单引号时你会得到不同的结果:
a = "\"1\xAF\xC7\xC0\xA6\xC9\xBA\xD6\x9F\xBA\xD2\xC9\xBE\x0F\x8E*\x88\x87(\x9B\xCBp\x15!/\x13\x8F\xCE\xFB\x15\x9B"
#=> "\"1\xAF\xC7\xC0\xA6ɺ֟\xBA\xD2ɾ\u000F\x8E*\x88\x87(\x9B\xCBp\u0015!/\u0013\x8F\xCE\xFB\u0015\x9B"
b = '\"1\xAF\xC7\xC0\xA6\xC9\xBA\xD6\x9F\xBA\xD2\xC9\xBE\x0F\x8E*\x88\x87(\x9B\xCBp\x15!/\x13\x8F\xCE\xFB\x15\x9B'
#=> "\\\"1\\xAF\\xC7\\xC0\\xA6\\xC9\\xBA\\xD6\\x9F\\xBA\\xD2\\xC9\\xBE\\x0F\\x8E*\\x88\\x87(\\x9B\\xCBp\\x15!/\\x13\\x8F\\xCE\\xFB\\x15\\x9B"
a == b
=> false
a.bytes.count
=> 32
b.bytes.count
=> 108
a.length
=> 29
b.length
=> 108
所以你看到单引号会双重转义。
但是,正如 Jordan Running 在评论中提到的那样,您不应该使用自己的加密方式,这并不安全,请 read this answer了解原因。
使用 ruby 的 openssl 是一个更好的主意 gem 。有关如何使用它的说明,请参阅 documentation here .
关于ruby - 为什么 Ruby base64 编码字符串与所有其他 base64 编码字符串不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55399329/