XOR cipher


In cryptography, the simple XOR cipher is a type of additive cipher, an encryption algorithm that operates according to the principles:
where denotes the exclusive disjunction operation. This operation is sometimes called modulus 2 addition. With this logic, a string of text can be encrypted by applying the bitwise XOR operator to every character using a given key. To decrypt the output, merely reapplying the XOR function with the key will remove the cipher.

Example

For example, the string "Wiki" can be encrypted with the repeating key as follows:
And conversely, for decryption:

Use and security

The XOR operator is extremely common as a component in more complex ciphers. By itself, using a constant repeating key, a simple XOR cipher can trivially be broken using frequency analysis. If the content of any message can be guessed or otherwise known then the key can be revealed. Its primary merit is that it is simple to implement, and that the XOR operation is computationally inexpensive. A simple repeating XOR cipher is therefore sometimes used for hiding information in cases where no particular security is required. The XOR cipher is often used in computer malware to make reverse engineering more difficult.
If the key is random and is at least as long as the message, the XOR cipher is much more secure than when there is key repetition within a message. When the keystream is generated by a pseudo-random number generator, the result is a stream cipher. With a key that is truly random, the result is a one-time pad, which is unbreakable in theory.
In any of these ciphers, the XOR operator is vulnerable to a known-plaintext attack, since plaintext ciphertext = key.
It is also trivial to flip arbitrary bits in the decrypted plaintext by manipulating the ciphertext.
This is called malleability.

Example implementation

Example using the Python programming language.

from __future__ import print_function, unicode_literals
from os import urandom
def genkey -> bytes:
"""Generate key."""
return urandom

def xor_strings -> bytes:
"""xor two strings together."""
if isinstance:
# Text strings contain single characters
return b"".join ^ ord) for a, b in zip)
else:
# Python 3 bytes objects contain integer values in the range 0-255
return bytes

message = 'This is a secret message'
print
key = genkey
print
cipherText = xor_strings
print
print.decode)
  1. Verify
if xor_strings.decode message:
print
else:
print