未替换引号(';)在Ruby中打断Base64
我试图对一些数据进行AES加密,并使用未替换引号(';)在Ruby中打断Base64,ruby,Ruby,我试图对一些数据进行AES加密,并使用random_iv生成一个初始化向量 def encrypt (data) cipher = OpenSSL::Cipher::AES.new(256, :CBC) cipher.encrypt cipher.key = @key iv = cipher.random_iv encrypted = cipher.update(data) + cipher.final encoded = Base64.encod
random_iv
生成一个初始化向量
def encrypt (data)
cipher = OpenSSL::Cipher::AES.new(256, :CBC)
cipher.encrypt
cipher.key = @key
iv = cipher.random_iv
encrypted = cipher.update(data) + cipher.final
encoded = Base64.encode64(encrypted+iv)
return encoded, self.sign(encoded)
end
如果iv
包含”
,则编码的字符串将在此处结束,并忽略“
之后的所有内容。我认为random\u iv
是OpenSSL::random.random\u字节(16)
,还没有检查源代码。当我得到random_iv
时,比如:
"0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>"
编码字符串的最后16个字符与之完全不同(结束于C8
)
如果iv
中没有”
,则可以正常工作。现在,我正在这样解决这个问题:
cipher.iv = Digest::MD5.new.digest(cipher.random_iv)
因为MD5
也是16字节
,并且符合iv
要求
Digest::MD5.new.digest('test').bytesize
# => 16
想知道是否有更好的方法。那么,为什么在《随机iv》中首先会出现《代码》?如何转义传递到encode64
的数据
另外,我是否需要将字节追加到数据中,直到数据.bytesize
可被16
整除?或者是Cipher::AES
为我做的
cipher.update(data)
作为字符串的内容,
“
没有什么特别之处。它只是一个ASCII值为39的字节
在语句encoded=Base64.encode64(加密+iv)
中,iv
与前面设置的cipher.iv
变量不同。在名为iv
的作用域中是否有方法或访问器?base64字符串'1JCQvhD6mrDXkhW4Hn9HIIr32TmYlBmp803oxOtrZMg=\n'
(我认为这是您函数的结果)不会以示例iv的base64编码结束,因此我非常确信表达式的+iv
部分没有看到“0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>”
示例iv的base64编码为我成功实现了往返:
irb> iv = "0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>".force_encoding('BINARY')
=> "0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>"
irb> e = Base64.encode64 iv
=> "MMh4JzaGBv5HW8719ctMPg==\n"
irb> d = Base64.decode64 e
=> "0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>"
irb> d == iv
=> true
这里也一样。我尝试了各种不同的引号和二进制数据组合,但都无法将其打破。如果Base64会像这样被打破似乎很奇怪。很久以前其他人就会注意到。嗨。是的,原始代码iv的编码与定义中的编码相同,所以我的坏代码在这里…在发布时摆弄东西。总之,我测试了它,但没有。强制编码(“二进制”)它已损坏。使用,它工作正常。在我的环境中,
\random\u iv
返回一个
字符串,就像cipher.update(数据)一样
即使数据
是UTF-8,我也只使用上面的强制编码
,因为我提供的字符串是默认为UTF-8的文本。字节字符串(任何随机字节生成器或加密方法的结果)应该始终指定为二进制编码,否则您将从将其解释为unicode的方法中得到令人惊讶的结果。
irb> iv = "0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>".force_encoding('BINARY')
=> "0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>"
irb> e = Base64.encode64 iv
=> "MMh4JzaGBv5HW8719ctMPg==\n"
irb> d = Base64.decode64 e
=> "0\xC8x'6\x86\x06\xFEG[\xCE\xF5\xF5\xCBL>"
irb> d == iv
=> true