XOR cipher
Encryption algorithm
- 10 min read
- 4 chapters
Related on Lably
Through Subtraction, ASCII and Malware
- A 0 = A,
- A A = 0,
- A B = B A,
- (A B) C = A (B C),
- (B A) A = B 0 = B
For example where denotes the exclusive disjunction (XOR) operation. This operation is sometimes called modulus 2 addition (or subtraction, which is identical). 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
The string "Wiki" (01010111 01101001 01101011 01101001 in 8-bit ASCII) can be encrypted with the repeating key 11110011 as follows:
And conversely, for decryption:
Sign in to keep reading
3 more chapters are free with a Lably account.
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 (i.e. using the same key for xor operation on the whole data) 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.
The XOR operator in any of these ciphers 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.
Usefulness in cryptography
The primary reason XOR is so useful in cryptography is because it is "perfectly balanced"; for a given plaintext input 0 or 1, the ciphertext result is equally likely to be either 0 or 1 for a truly random key bit.
The table below shows all four possible pairs of plaintext and key bits. It is clear that if nothing is known about the key or plaintext, nothing can be determined from the ciphertext alone.
Other logical operations such and AND or OR do not have such a mapping. For example consider the table for AND below:
If the ciphertext were 0, then there is a 2/3 chance that the plaintext was 0 too. And if the ciphertext was 1, then the plaintext would have to be 1. This clearly reveals information about the text that the XOR approach does not.
Example implementation
Example using the JavaScript programming language.
<span id="mwvQ"></span><span class="kd" id="mwvg">function</span><span class="w" id="mwvw"> </span><span class="nx" id="mwwA">xor_Encrypt</span><span class="p" id="mwwQ">(</span><span class="nx" id="mwwg">inputString</span><span class="p" id="mwww">,</span><span class="w" id="mwxA"> </span><span class="nx" id="mwxQ">key</span><span class="p" id="mwxg">)</span><span class="w" id="mwxw"> </span><span class="p" id="mwyA">{</span> <span class="w" id="mwyQ"> </span><span class="kd" id="mwyg">let</span><span class="w" id="mwyw"> </span><span class="nx" id="mwzA">encrypted_Hex</span><span class="w" id="mwzQ"> </span><span class="o" id="mwzg">=</span><span class="w" id="mwzw"> </span><span class="s2" id="mw0A">""</span><span class="p" id="mw0Q">;</span> <span class="w" id="mw0g"> </span> <span class="w" id="mw0w"> </span><span class="k" id="mw1A">for</span><span class="w" id="mw1Q"> </span><span class="p" id="mw1g">(</span><span class="kd" id="mw1w">let</span><span class="w" id="mw2A"> </span><span class="nx" id="mw2Q">i</span><span class="w" id="mw2g"> </span><span class="o" id="mw2w">=</span><span class="w" id="mw3A"> </span><span class="mf" id="mw3Q">0</span><span class="p" id="mw3g">;</span><span class="w" id="mw3w"> </span><span class="nx" id="mw4A">i</span><span class="w" id="mw4Q"> </span><span class="o" id="mw4g"><</span><span class="w" id="mw4w"> </span><span class="nx" id="mw5A">inputString</span><span class="p" id="mw5Q">.</span><span class="nx" id="mw5g">length</span><span class="p" id="mw5w">;</span><span class="w" id="mw6A"> </span><span class="nx" id="mw6Q">i</span><span class="o" id="mw6g">++</span><span class="p" id="mw6w">)</span><span class="w" id="mw7A"> </span><span class="p" id="mw7Q">{</span> <span class="w" id="mw7g"> </span><span class="kd" id="mw7w">const</span><span class="w" id="mw8A"> </span><span class="nx" id="mw8Q">plain_string</span><span class="w" id="mw8g"> </span><span class="o" id="mw8w">=</span><span class="w" id="mw9A"> </span><span class="nx" id="mw9Q">inputString</span><span class="p" id="mw9g">.</span><span class="nx" id="mw9w">charCodeAt</span><span class="p" id="mw-A">(</span><span class="nx" id="mw-Q">i</span><span class="p" id="mw-g">);</span> <span class="w" id="mw-w"> </span><span class="kd" id="mw_A">const</span><span class="w" id="mw_Q"> </span><span class="nx" id="mw_g">key_Char</span><span class="w" id="mw_w"> </span><span class="o" id="mwAQA">=</span><span class="w" id="mwAQE"> </span><span class="nx" id="mwAQI">key</span><span class="p" id="mwAQM">.</span><span class="nx" id="mwAQQ">charCodeAt</span><span class="p" id="mwAQU">(</span><span class="nx" id="mwAQY">i</span><span class="w" id="mwAQc"> </span><span class="o" id="mwAQg">%</span><span class="w" id="mwAQk"> </span><span class="nx" id="mwAQo">key</span><span class="p" id="mwAQs">.</span><span class="nx" id="mwAQw">length</span><span class="p" id="mwAQ0">);</span> <span class="w" id="mwAQ4"> </span> <span class="w" id="mwAQ8"> </span><span class="kd" id="mwARA">const</span><span class="w" id="mwARE"> </span><span class="nx" id="mwARI">xor_Result</span><span class="w" id="mwARM"> </span><span class="o" id="mwARQ">=</span><span class="w" id="mwARU"> </span><span class="nx" id="mwARY">plain_string</span><span class="w" id="mwARc"> </span><span class="o" id="mwARg">^</span><span class="w" id="mwARk"> </span><span class="nx" id="mwARo">key_Char</span><span class="p" id="mwARs">;</span><span class="w" id="mwARw"> </span><span class="c1" id="mwAR0">// Perform XOR operation</span> <span class="w" id="mwAR4"> </span><span class="c1" id="mwAR8">// Convert the XOR result to a two-digit hexadecimal string</span> <span class="w" id="mwASA"> </span><span class="c1" id="mwASE">// Pad with '0' if it's a single digit (e.g., 5 -> "05")</span> <span class="w" id="mwASI"> </span><span class="kd" id="mwASM">let</span><span class="w" id="mwASQ"> </span><span class="nx" id="mwASU">hex</span><span class="w" id="mwASY"> </span><span class="o" id="mwASc">=</span><span class="w" id="mwASg"> </span><span class="nx" id="mwASk">xor_Result</span><span class="p" id="mwASo">.</span><span class="nx" id="mwASs">toString</span><span class="p" id="mwASw">(</span><span class="mf" id="mwAS0">16</span><span class="p" id="mwAS4">);</span> <span class="w" id="mwAS8"> </span><span class="k" id="mwATA">if</span><span class="w" id="mwATE"> </span><span class="p" id="mwATI">(</span><span class="nx" id="mwATM">hex</span><span class="p" id="mwATQ">.</span><span class="nx" id="mwATU">length</span><span class="w" id="mwATY"> </span><span class="o" id="mwATc"><</span><span class="w" id="mwATg"> </span><span class="mf" id="mwATk">2</span><span class="p" id="mwATo">)</span><span class="w" id="mwATs"> </span><span class="p" id="mwATw">{</span> <span class="w" id="mwAT0"> </span><span class="nx" id="mwAT4">hex</span><span class="w" id="mwAT8"> </span><span class="o" id="mwAUA">=</span><span class="w" id="mwAUE"> </span><span class="s2" id="mwAUI">"0"</span><span class="w" id="mwAUM"> </span><span class="o" id="mwAUQ">+</span><span class="w" id="mwAUU"> </span><span class="nx" id="mwAUY">hex</span><span class="p" id="mwAUc">;</span> <span class="w" id="mwAUg"> </span><span class="p" id="mwAUk">}</span> <span class="w" id="mwAUo"> </span> <span class="w" id="mwAUs"> </span><span class="nx" id="mwAUw">encrypted_Hex</span><span class="w" id="mwAU0"> </span><span class="o" id="mwAU4">+=</span><span class="w" id="mwAU8"> </span><span class="nx" id="mwAVA">hex</span><span class="p" id="mwAVE">;</span> <span class="w" id="mwAVI"> </span><span class="p" id="mwAVM">}</span> <span class="w" id="mwAVQ"> </span><span class="k" id="mwAVU">return</span><span class="w" id="mwAVY"> </span><span class="nx" id="mwAVc">encrypted_Hex</span><span class="p" id="mwAVg">;</span> <span class="p" id="mwAVk">}</span> <span class="kd" id="mwAVo">function</span><span class="w" id="mwAVs"> </span><span class="nx" id="mwAVw">xorDecrypt</span><span class="p" id="mwAV0">(</span><span class="nx" id="mwAV4">hexInput</span><span class="p" id="mwAV8">,</span><span class="w" id="mwAWA"> </span><span class="nx" id="mwAWE">key</span><span class="p" id="mwAWI">)</span><span class="w" id="mwAWM"> </span><span class="p" id="mwAWQ">{</span> <span class="w" id="mwAWU"> </span><span class="kd" id="mwAWY">let</span><span class="w" id="mwAWc"> </span><span class="nx" id="mwAWg">decrypted_String</span><span class="w" id="mwAWk"> </span><span class="o" id="mwAWo">=</span><span class="w" id="mwAWs"> </span><span class="s1" id="mwAWw">''</span><span class="p" id="mwAW0">;</span> <span class="w" id="mwAW4"> </span><span class="c1" id="mwAW8">// Step 1: Convert hexInput string into an array</span> <span class="w" id="mwAXA"> </span><span class="kd" id="mwAXE">const</span><span class="w" id="mwAXI"> </span><span class="nx" id="mwAXM">bytes</span><span class="w" id="mwAXQ"> </span><span class="o" id="mwAXU">=</span><span class="w" id="mwAXY"> </span><span class="p" id="mwAXc">[];</span> <span class="w" id="mwAXg"> </span> <span class="w" id="mwAXk"> </span><span class="c1" id="mwAXo">// Iterate through the hex string two characters at a time</span> <span class="w" id="mwAXs"> </span><span class="k" id="mwAXw">for</span><span class="w" id="mwAX0"> </span><span class="p" id="mwAX4">(</span><span class="kd" id="mwAX8">let</span><span class="w" id="mwAYA"> </span><span class="nx" id="mwAYE">i</span><span class="w" id="mwAYI"> </span><span class="o" id="mwAYM">=</span><span class="w" id="mwAYQ"> </span><span class="mf" id="mwAYU">0</span><span class="p" id="mwAYY">;</span><span class="w" id="mwAYc"> </span><span class="nx" id="mwAYg">i</span><span class="w" id="mwAYk"> </span><span class="o" id="mwAYo"><</span><span class="w" id="mwAYs"> </span><span class="nx" id="mwAYw">hexInput</span><span class="p" id="mwAY0">.</span><span class="nx" id="mwAY4">length</span><span class="p" id="mwAY8">;</span><span class="w" id="mwAZA"> </span><span class="nx" id="mwAZE">i</span><span class="w" id="mwAZI"> </span><span class="o" id="mwAZM">+=</span><span class="w" id="mwAZQ"> </span><span class="mf" id="mwAZU">2</span><span class="p" id="mwAZY">)</span><span class="w" id="mwAZc"> </span><span class="p" id="mwAZg">{</span> <span class="w" id="mwAZk"> </span><span class="c1" id="mwAZo">// Take a two-character hex substring (e.g., "AB")</span> <span class="w" id="mwAZs"> </span><span class="kd" id="mwAZw">const</span><span class="w" id="mwAZ0"> </span><span class="nx" id="mwAZ4">hexa_Byte</span><span class="w" id="mwAZ8"> </span><span class="o" id="mwAaA">=</span><span class="w" id="mwAaE"> </span><span class="nx" id="mwAaI">hexInput</span><span class="p" id="mwAaM">.</span><span class="nx" id="mwAaQ">slice</span><span class="p" id="mwAaU">(</span><span class="nx" id="mwAaY">i</span><span class="p" id="mwAac">,</span><span class="w" id="mwAag"> </span><span class="nx" id="mwAak">i</span><span class="w" id="mwAao"> </span><span class="o" id="mwAas">+</span><span class="w" id="mwAaw"> </span><span class="mf" id="mwAa0">2</span><span class="p" id="mwAa4">);</span> <span class="w" id="mwAa8"> </span><span class="c1" id="mwAbA">// Convert hex substring to an integer (e.g., "AB" -> 171)</span> <span class="w" id="mwAbE"> </span><span class="nx" id="mwAbI">bytes</span><span class="p" id="mwAbM">.</span><span class="nx" id="mwAbQ">push</span><span class="p" id="mwAbU">(</span><span class="nb" id="mwAbY">parseInt</span><span class="p" id="mwAbc">(</span><span class="nx" id="mwAbg">hexa_Byte</span><span class="p" id="mwAbk">,</span><span class="w" id="mwAbo"> </span><span class="mf" id="mwAbs">16</span><span class="p" id="mwAbw">));</span> <span class="w" id="mwAb0"> </span><span class="p" id="mwAb4">}</span> <span class="w" id="mwAb8"> </span> <span class="w" id="mwAcA"> </span><span class="c1" id="mwAcE">// Step 2: XOR each byte with the key and convert back to character</span> <span class="w" id="mwAcI"> </span><span class="k" id="mwAcM">for</span><span class="w" id="mwAcQ"> </span><span class="p" id="mwAcU">(</span><span class="kd" id="mwAcY">let</span><span class="w" id="mwAcc"> </span><span class="nx" id="mwAcg">i</span><span class="w" id="mwAck"> </span><span class="o" id="mwAco">=</span><span class="w" id="mwAcs"> </span><span class="mf" id="mwAcw">0</span><span class="p" id="mwAc0">;</span><span class="w" id="mwAc4"> </span><span class="nx" id="mwAc8">i</span><span class="w" id="mwAdA"> </span><span class="o" id="mwAdE"><</span><span class="w" id="mwAdI"> </span><span class="nx" id="mwAdM">bytes</span><span class="p" id="mwAdQ">.</span><span class="nx" id="mwAdU">length</span><span class="p" id="mwAdY">;</span><span class="w" id="mwAdc"> </span><span class="nx" id="mwAdg">i</span><span class="o" id="mwAdk">++</span><span class="p" id="mwAdo">)</span><span class="w" id="mwAds"> </span><span class="p" id="mwAdw">{</span> <span class="w" id="mwAd0"> </span><span class="kd" id="mwAd4">const</span><span class="w" id="mwAd8"> </span><span class="nx" id="mwAeA">byte_Value</span><span class="w" id="mwAeE"> </span><span class="o" id="mwAeI">=</span><span class="w" id="mwAeM"> </span><span class="nx" id="mwAeQ">bytes</span><span class="p" id="mwAeU">[</span><span class="nx" id="mwAeY">i</span><span class="p" id="mwAec">];</span> <span class="w" id="mwAeg"> </span><span class="kd" id="mwAek">const</span><span class="w" id="mwAeo"> </span><span class="nx" id="mwAes">key_Char</span><span class="w" id="mwAew"> </span><span class="o" id="mwAe0">=</span><span class="w" id="mwAe4"> </span><span class="nx" id="mwAe8">key</span><span class="p" id="mwAfA">.</span><span class="nx" id="mwAfE">charCodeAt</span><span class="p" id="mwAfI">(</span><span class="nx" id="mwAfM">i</span><span class="w" id="mwAfQ"> </span><span class="o" id="mwAfU">%</span><span class="w" id="mwAfY"> </span><span class="nx" id="mwAfc">key</span><span class="p" id="mwAfg">.</span><span class="nx" id="mwAfk">length</span><span class="p" id="mwAfo">);</span> <span class="w" id="mwAfs"> </span><span class="kd" id="mwAfw">const</span><span class="w" id="mwAf0"> </span><span class="nx" id="mwAf4">xor_Result</span><span class="w" id="mwAf8"> </span><span class="o" id="mwAgA">=</span><span class="w" id="mwAgE"> </span><span class="nx" id="mwAgI">byte_Value</span><span class="w" id="mwAgM"> </span><span class="o" id="mwAgQ">^</span><span class="w" id="mwAgU"> </span><span class="nx" id="mwAgY">key_Char</span><span class="p" id="mwAgc">;</span><span class="w" id="mwAgg"> </span><span class="c1" id="mwAgk">// Perform XOR operation</span> <span class="w" id="mwAgo"> </span><span class="c1" id="mwAgs">// Convert the XOR result back to a character</span> <span class="w" id="mwAgw"> </span><span class="nx" id="mwAg0">decrypted_String</span><span class="w" id="mwAg4"> </span><span class="o" id="mwAg8">+=</span><span class="w" id="mwAhA"> </span><span class="nb" id="mwAhE">String</span><span class="p" id="mwAhI">.</span><span class="nx" id="mwAhM">fromCharCode</span><span class="p" id="mwAhQ">(</span><span class="nx" id="mwAhU">xor_Result</span><span class="p" id="mwAhY">);</span> <span class="w" id="mwAhc"> </span><span class="p" id="mwAhg">}</span> <span class="w" id="mwAhk"> </span> <span class="w" id="mwAho"> </span><span class="k" id="mwAhs">return</span><span class="w" id="mwAhw"> </span><span class="nx" id="mwAh0">decrypted_String</span><span class="p" id="mwAh4">;</span> <span class="p" id="mwAh8">}</span>Another example using the Python programming language.
<span id="mwAig"></span><span class="kn" id="mwAik">from</span><span class="w" id="mwAio"> </span><span class="nn" id="mwAis">os</span><span class="w" id="mwAiw"> </span><span class="kn" id="mwAi0">import</span> <span class="n" id="mwAi4">urandom</span> <span class="k" id="mwAi8">def</span><span class="w" id="mwAjA"> </span><span class="nf" id="mwAjE">generate_key</span><span class="p" id="mwAjI">(</span><span class="n" id="mwAjM">length</span><span class="p" id="mwAjQ">:</span> <span class="nb" id="mwAjU">int</span><span class="p" id="mwAjY">)</span> <span class="o" id="mwAjc">-></span> <span class="nb" id="mwAjg">bytes</span><span class="p" id="mwAjk">:</span> <span class="w" id="mwAjo"> </span><span class="sd" id="mwAjs">"""Generate encryption key."""</span> <span class="k" id="mwAjw">return</span> <span class="n" id="mwAj0">urandom</span><span class="p" id="mwAj4">(</span><span class="n" id="mwAj8">length</span><span class="p" id="mwAkA">)</span> <span class="k" id="mwAkE">def</span><span class="w" id="mwAkI"> </span><span class="nf" id="mwAkM">xor_strings</span><span class="p" id="mwAkQ">(</span><span class="n" id="mwAkU">s</span><span class="p" id="mwAkY">,</span> <span class="n" id="mwAkc">t</span><span class="p" id="mwAkg">)</span> <span class="o" id="mwAkk">-></span> <span class="nb" id="mwAko">bytes</span><span class="p" id="mwAks">:</span> <span class="w" id="mwAkw"> </span><span class="sd" id="mwAk0">"""Concatenate xor two strings together."""</span> <span class="k" id="mwAk4">if</span> <span class="nb" id="mwAk8">isinstance</span><span class="p" id="mwAlA">(</span><span class="n" id="mwAlE">s</span><span class="p" id="mwAlI">,</span> <span class="nb" id="mwAlM">str</span><span class="p" id="mwAlQ">):</span> <span class="c1" id="mwAlU"># Text strings contain single characters</span> <span class="k" id="mwAlY">return</span> <span class="s2" id="mwAlc">""</span><span class="o" id="mwAlg">.</span><span class="n" id="mwAlk">join</span><span class="p" id="mwAlo">(</span><span class="nb" id="mwAls">chr</span><span class="p" id="mwAlw">(</span><span class="nb" id="mwAl0">ord</span><span class="p" id="mwAl4">(</span><span class="n" id="mwAl8">a</span><span class="p" id="mwAmA">)</span> <span class="o" id="mwAmE">^</span> <span class="n" id="mwAmI">b</span><span class="p" id="mwAmM">)</span> <span class="k" id="mwAmQ">for</span> <span class="n" id="mwAmU">a</span><span class="p" id="mwAmY">,</span> <span class="n" id="mwAmc">b</span> <span class="ow" id="mwAmg">in</span> <span class="nb" id="mwAmk">zip</span><span class="p" id="mwAmo">(</span><span class="n" id="mwAms">s</span><span class="p" id="mwAmw">,</span> <span class="n" id="mwAm0">t</span><span class="p" id="mwAm4">))</span><span class="o" id="mwAm8">.</span><span class="n" id="mwAnA">encode</span><span class="p" id="mwAnE">(</span><span class="s2" id="mwAnI">"utf8"</span><span class="p" id="mwAnM">)</span> <span class="k" id="mwAnQ">else</span><span class="p" id="mwAnU">:</span> <span class="c1" id="mwAnY"># Bytes objects contain integer values in the range 0-255</span> <span class="k" id="mwAnc">return</span> <span class="nb" id="mwAng">bytes</span><span class="p" id="mwAnk">([</span><span class="n" id="mwAno">a</span> <span class="o" id="mwAns">^</span> <span class="n" id="mwAnw">b</span> <span class="k" id="mwAn0">for</span> <span class="n" id="mwAn4">a</span><span class="p" id="mwAn8">,</span> <span class="n" id="mwAoA">b</span> <span class="ow" id="mwAoE">in</span> <span class="nb" id="mwAoI">zip</span><span class="p" id="mwAoM">(</span><span class="n" id="mwAoQ">s</span><span class="p" id="mwAoU">,</span> <span class="n" id="mwAoY">t</span><span class="p" id="mwAoc">)])</span> <span class="n" id="mwAog">message</span> <span class="o" id="mwAok">=</span> <span class="s2" id="mwAoo">"This is a secret message"</span> <span class="nb" id="mwAos">print</span><span class="p" id="mwAow">(</span><span class="s2" id="mwAo0">"Message:"</span><span class="p" id="mwAo4">,</span> <span class="n" id="mwAo8">message</span><span class="p" id="mwApA">)</span> <span class="n" id="mwApE">key</span> <span class="o" id="mwApI">=</span> <span class="n" id="mwApM">generate_key</span><span class="p" id="mwApQ">(</span><span class="nb" id="mwApU">len</span><span class="p" id="mwApY">(</span><span class="n" id="mwApc">message</span><span class="p" id="mwApg">))</span> <span class="nb" id="mwApk">print</span><span class="p" id="mwApo">(</span><span class="s2" id="mwAps">"Key:"</span><span class="p" id="mwApw">,</span> <span class="n" id="mwAp0">key</span><span class="p" id="mwAp4">)</span> <span class="n" id="mwAp8">cipherText</span> <span class="o" id="mwAqA">=</span> <span class="n" id="mwAqE">xor_strings</span><span class="p" id="mwAqI">(</span><span class="n" id="mwAqM">message</span><span class="o" id="mwAqQ">.</span><span class="n" id="mwAqU">encode</span><span class="p" id="mwAqY">(</span><span class="s2" id="mwAqc">"utf8"</span><span class="p" id="mwAqg">),</span> <span class="n" id="mwAqk">key</span><span class="p" id="mwAqo">)</span> <span class="nb" id="mwAqs">print</span><span class="p" id="mwAqw">(</span><span class="s2" id="mwAq0">"cipherText:"</span><span class="p" id="mwAq4">,</span> <span class="n" id="mwAq8">cipherText</span><span class="p" id="mwArA">)</span> <span class="nb" id="mwArE">print</span><span class="p" id="mwArI">(</span><span class="s2" id="mwArM">"decrypted:"</span><span class="p" id="mwArQ">,</span> <span class="n" id="mwArU">xor_strings</span><span class="p" id="mwArY">(</span><span class="n" id="mwArc">cipherText</span><span class="p" id="mwArg">,</span> <span class="n" id="mwArk">key</span><span class="p" id="mwAro">)</span><span class="o" id="mwArs">.</span><span class="n" id="mwArw">decode</span><span class="p" id="mwAr0">(</span><span class="s2" id="mwAr4">"utf8"</span><span class="p" id="mwAr8">))</span> <span class="c1" id="mwAsA"># Verify</span> <span class="k" id="mwAsE">if</span> <span class="n" id="mwAsI">xor_strings</span><span class="p" id="mwAsM">(</span><span class="n" id="mwAsQ">cipherText</span><span class="p" id="mwAsU">,</span> <span class="n" id="mwAsY">key</span><span class="p" id="mwAsc">)</span><span class="o" id="mwAsg">.</span><span class="n" id="mwAsk">decode</span><span class="p" id="mwAso">(</span><span class="s2" id="mwAss">"utf8"</span><span class="p" id="mwAsw">)</span> <span class="o" id="mwAs0">==</span> <span class="n" id="mwAs4">message</span><span class="p" id="mwAs8">:</span> <span class="nb" id="mwAtA">print</span><span class="p" id="mwAtE">(</span><span class="s2" id="mwAtI">"Unit test passed"</span><span class="p" id="mwAtM">)</span> <span class="k" id="mwAtQ">else</span><span class="p" id="mwAtU">:</span> <span class="nb" id="mwAtY">print</span><span class="p" id="mwAtc">(</span><span class="s2" id="mwAtg">"Unit test failed"</span><span class="p" id="mwAtk">)</span>
A shorter example using the R programming language, based on a puzzle posted on Instagram by GCHQ.
<span id="mwAuA"></span><span class="n" id="mwAuE">secret_key</span><span class="w" id="mwAuI"> </span><span class="o" id="mwAuM"><-</span><span class="w" id="mwAuQ"> </span><span class="nf" id="mwAuU">c</span><span class="p" id="mwAuY">(</span><span class="mh" id="mwAuc">0xc6</span><span class="p" id="mwAug">,</span><span class="w" id="mwAuk"> </span><span class="mh" id="mwAuo">0xb5</span><span class="p" id="mwAus">,</span><span class="w" id="mwAuw"> </span><span class="mh" id="mwAu0">0xca</span><span class="p" id="mwAu4">,</span><span class="w" id="mwAu8"> </span><span class="mh" id="mwAvA">0x01</span><span class="p" id="mwAvE">)</span><span class="w" id="mwAvI"> </span><span class="o" id="mwAvM">|></span><span class="w" id="mwAvQ"> </span><span class="nf" id="mwAvU">as.raw</span><span class="p" id="mwAvY">()</span> <span class="n" id="mwAvc">secret_message</span><span class="w" id="mwAvg"> </span><span class="o" id="mwAvk"><-</span><span class="w" id="mwAvo"> </span><span class="s" id="mwAvs">"I <3 Wikipedia"</span><span class="w" id="mwAvw"> </span><span class="o" id="mwAv0">|></span> <span class="w" id="mwAv4"> </span><span class="nf" id="mwAv8">charToRaw</span><span class="p" id="mwAwA">()</span><span class="w" id="mwAwE"> </span><span class="o" id="mwAwI">|></span> <span class="w" id="mwAwM"> </span><span class="nf" id="mwAwQ">xor</span><span class="p" id="mwAwU">(</span><span class="n" id="mwAwY">secret_key</span><span class="p" id="mwAwc">)</span><span class="w" id="mwAwg"> </span><span class="o" id="mwAwk">|></span> <span class="w" id="mwAwo"> </span><span class="n" id="mwAws">base64enc</span><span class="o" id="mwAww">::</span><span class="nf" id="mwAw0">base64encode</span><span class="p" id="mwAw4">()</span> <span class="n" id="mwAw8">secret_message_bytes</span><span class="w" id="mwAxA"> </span><span class="o" id="mwAxE"><-</span><span class="w" id="mwAxI"> </span><span class="n" id="mwAxM">secret_message</span><span class="w" id="mwAxQ"> </span><span class="o" id="mwAxU">|></span> <span class="w" id="mwAxY"> </span><span class="n" id="mwAxc">base64enc</span><span class="o" id="mwAxg">::</span><span class="nf" id="mwAxk">base64decode</span><span class="p" id="mwAxo">()</span> <span class="nf" id="mwAxs">xor</span><span class="p" id="mwAxw">(</span><span class="n" id="mwAx0">secret_message_bytes</span><span class="p" id="mwAx4">,</span><span class="w" id="mwAx8"> </span><span class="n" id="mwAyA">secret_key</span><span class="p" id="mwAyE">)</span><span class="w" id="mwAyI"> </span><span class="o" id="mwAyM">|></span><span class="w" id="mwAyQ"> </span><span class="nf" id="mwAyU">rawToChar</span><span class="p" id="mwAyY">()</span>

