require 'base64' def str(bytes) bytes.pack('C*') end def xor_buffer_with_bytes(buffer, bytes) result = Array.new(buffer.size) result.each_index do |i| byte = bytes[i % bytes.length] result[i] = buffer[i] ^ byte end result end ciphertext = Base64.decode64('ptITlnk7EGRodZ/dRp9dF1VqaEOPjC2SMQdUYGgmn81GhzEqVHsEX6brBqRwMBEySgo=').bytes crib = ARGV[0].bytes key_size = 10 max_offset = ciphertext.length - crib.length (0..max_offset).each do |i| key = Array.new(key_size, 0) crib.length.times { |j| key[(i+j)%key_size] = ciphertext[i+j] ^ crib[j] } p str(xor_buffer_with_bytes(ciphertext, key)) end