Method: Rex::Text.xor

Defined in:
lib/rex/text/xor.rb

.xor(key, value) ⇒ String

XOR a string against a variable-length key

Parameters:

  • key (String)

    XOR key

  • value (String)

    String to XOR

Returns:

  • (String)

    XOR'd string



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