为什么Ruby base64编码字符串不同于所有其他base64编码字符串?

为什么Ruby base64编码字符串不同于所有其他base64编码字符串?,ruby,base64,aes,Ruby,Base64,Aes,对于客户端和服务器之间的端到端加密通信,我正在实现一个加密/解密算法 然而,只有在Ruby中,加密/解密和base64编码/解码才能正常工作 但我看到的实际问题是Ruby的Base64编码 例如,假设我有一个32字节的AES密钥: "\"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算法中的数据 我想以Bas

对于客户端和服务器之间的端到端加密通信,我正在实现一个加密/解密算法

然而,只有在Ruby中,加密/解密和base64编码/解码才能正常工作

但我看到的实际问题是Ruby的Base64编码

例如,假设我有一个32字节的AES密钥:

"\"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编码格式将此密钥发送给客户端。为此,我采用了两种方法,每种方法产生不同的编码输出:

输入双引号

输入单引号

输出1不同于所有其他库:Java、Swift和,它们都产生相同的输出

输出2在输出编码方面与其他库相同。但我在转换AES密钥和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在评论中提到的,您不应该使用自己的加密,这是不安全的,请理解原因


使用ruby的gem是一个更好的主意。有关如何使用它的说明,请参阅。

问题是,当您使用单引号时,您将得到不同的结果:

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在评论中提到的,您不应该使用自己的加密,这是不安全的,请理解原因


使用ruby的gem是一个更好的主意。有关如何使用它的说明,请参阅。

如果您需要单引号行为,但不能使用单引号,那么Ruby有%q选项,即%q后跟围绕字符串的括号或括号等,或者%q后面的任何字符将充当单引号:%q |这是您的字符串|或%q{这是您的字符串}

如果您需要单引号行为,但不能使用单引号,那么Ruby有%q选项,即%q后跟围绕字符串的括号或括号等,或者%q后面的任何字符都将充当单引号:%q |这是您的字符串|或%q{这是您的字符串}

您真的想在开头也包含双引号吗?这可能就是它与众不同的原因。您是否解码了这两个版本并检查了返回的内容是否相同?对于客户端和服务器之间的端到端加密通信,我一直在实现加密/解密算法。不要。强大、安全、免费的加密软件已经存在,并且易于使用。编写自己的加密代码不是一个好主意。相反,对于您的应用程序服务器,请使用您节省的所有时间向您的应用程序添加有用的功能。。。。观察如果将字符串用不同的引号括起来会发生什么。引用的类型在Ruby中很重要。如果你正在实现你自己的加密算法,我会附和其他人的话,为了你自己的利益,不要这样做。不清楚您是在使用单独的库还是在尝试自己的加密。@jordan running是的,我不是在编写自己的加密算法,而是在使用Ruby默认的OpenSSL库及其AES加密技术。您真的想在开头也包含双引号吗?这可能就是它与众不同的原因。您是否解码了这两个版本并检查了返回的内容是否相同?对于客户端和服务器之间的端到端加密通信,我一直在实现加密/解密算法。不要。强大、安全、免费的加密软件已经存在,并且易于使用。编写自己的加密代码不是一个好主意。相反,对于您的应用程序服务器,请使用您节省的所有时间向您的应用程序添加有用的功能。。。。观察如果将字符串用不同的引号括起来会发生什么。引用的类型在Ruby中很重要。如果你正在实现你自己的加密算法,我会附和其他人的话,为了你自己的利益,不要这样做。不清楚您是在使用单独的库还是在尝试自己的加密。@jordan running是的,我不是在编写自己的加密算法,而是在使用Ruby默认的OpenSSL库及其AES加密技术。在这种情况下,查看输出可能会使区别更清楚。可能最好确保他们也在使用二进制字符串,以防万一。@muistooshort好主意,我更新了,但没有显示完整的字节数组,但我认为这已经足够清楚了。在这种情况下,查看输出可能会使区别更清楚。也许最好确保他们在工作
这也是一个二进制字符串,以防万一。@muistooshort是个好主意,我更新了,但没有显示完整的字节数组,但我认为这已经足够清楚了。谢谢你的回答。这可能会奏效。但问题是我已经在某个变量中有了数据,那么现在如何使用该变量通过此方法将其括在单引号中?%q{{aes_key}}=>{aes_key}它不计算该变量。是的,这是单引号行为。如果您想评估变量,您需要双引号行为-使用%Q。谢谢您的回答。这可能会奏效。但问题是我已经在某个变量中有了数据,那么现在如何使用该变量通过此方法将其括在单引号中?%q{{aes_key}}=>{aes_key}它不计算该变量。是的,这是单引号行为。如果要计算变量,则需要双引号行为-使用%Q。
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