A simple adaptive cipher based on the logical XOR operation.
The XOR cipher will encrypt a message by using the Boolean XOR (exclusive or) operation. A XOR B returns 1 if and only if A and B are different.
A | B | A XOR B |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
To encrypt a message with a given key, we first convert the string into their ASCII equivalent, and we then XOR every character with the key. For example, if we want to encrypt XOR with 134 as a key, we would do:
X O R
01011000 01001111 01010010 # String in ASCII
10000110 10000110 10000110 # Repeating key 134
--------------------------
11011110 11001001 11010100 # XOR result
Þ É Ô # Result converted back into plain text
When implemented in python, we get char ^ key
.
As you might have noticed, in this cipher, a given character is always replaced by the same character. This makes frequency analysis easier. To avoid that, we can use a non-repeating key eg. 29, 62, 134
, where we loop through the keys to encode each character.
X O R
88 79 82
29 62 134
----------
69 113 212
E q Ô
The XOR operation has a couple of properties, including:
A XOR A = 0
A XOR 0 = A
(A XOR B) XOR C = A XOR (B XOR C)
So, from that, we can conclude that:
B XOR A XOR A = B XOR 0 = B
Therefore, to decrypt a message, we need to re-XOR it with the same key, aka. re-encode it.
Þ É Ô # Encoded string
11011110 11001001 11010100 # String in ASCII
10000110 10000110 10000110 # Repeating key 134
--------------------------
01011000 01001111 01010010 # XOR result
X O R # Decoded string
- Frequency analysis can be used to crack the code if the key is a single number.
Language | Encrypt | Decrypt |
---|---|---|
Javascript | encrypt.js | decrypt.js |
Python | encrypt.py | decrypt.py |
Swift | lib.swift | lib.swift |
Tests are automatically handled by Travis CI.
Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.
We use SemVer for versioning. For the versions available, see the tags on this repository.
Made with ❤️ at CrypTools.
See also the list of contributors who participated in this project.
This project is licensed under the MIT License - see the LICENSE file for details