我写了一些代码来反转Ruby中基于XOR的加密。 chipertext与'key'进行异或,输出传递给Zlib.deflate
。
require 'zlib'
def bin_to_hex(s)
s.unpack('H*').first
end
def hex(s)
s.scan(/../).map { |x| x.hex }.pack('c*')
end
chipertext = "Encrypted data"
key = "Some encryption key"
puts hex((bin_to_hex(Zlib::Inflate.inflate(code)).to_i(16) ^ ((bin_to_hex(key) * (bin_to_hex(Zlib::Inflate.inflate(chipertext)).length/bin_to_hex(key).length)) + bin_to_hex(key)[0, bin_to_hex(Zlib::Inflate.inflate(chipertext)).length%bin_to_hex(key).length]).to_i(16)).to_s(16))
在上面的示例中,当我将chipertext指定为字符串时,代码运行完美。但是,当我使用chipertext = File.open(ARGV[0], 'rb') { |f| f.read }
之类的代码时,我会得到一个inflate: incorrect header check (Zlib::DataError)
。
如何防止这种情况发生?