Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未替换引号(';)在Ruby中打断Base64_Ruby - Fatal编程技术网

未替换引号(';)在Ruby中打断Base64

未替换引号(';)在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

我试图对一些数据进行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.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