Method: Rex::Text.xor
- Defined in:
- lib/rex/text/xor.rb
.xor(key, value) ⇒ String
XOR a string against a variable-length key
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/rex/text/xor.rb', line 9 def self.xor(key, value) unless key && value raise ArgumentError, 'XOR key and value must be supplied' end xor_key = case key when String if key.empty? raise ArgumentError, 'XOR key must not be empty' end key when Integer unless key.between?(0x00, 0xff) raise ArgumentError, 'XOR key must be between 0x00 and 0xff' end # Convert integer to string [key].pack('C') end # Get byte arrays for key and value xor_key = xor_key.bytes xor_value = value.bytes # XOR value against cycled key xor_value.zip(xor_key.cycle).map { |v, k| v ^ k }.pack('C*') end |