Skip to content

Commit 41f767e

Browse files
authored
Add XOR Cipher (#5490)
1 parent 66ee59c commit 41f767e

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

DIRECTORY.md

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
* [RSA](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/RSA.java)
5353
* [SimpleSubCipher](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/SimpleSubCipher.java)
5454
* [Vigenere](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/Vigenere.java)
55+
* [XORCipher](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/ciphers/XORCipher.java)
5556
* conversions
5657
* [AffineConverter](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/AffineConverter.java)
5758
* [AnyBaseToAnyBase](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/conversions/AnyBaseToAnyBase.java)
@@ -619,6 +620,7 @@
619620
* [RSATest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/RSATest.java)
620621
* [SimpleSubCipherTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/SimpleSubCipherTest.java)
621622
* [VigenereTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/VigenereTest.java)
623+
* [XORCipherTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/ciphers/XORCipherTest.java)
622624
* conversions
623625
* [AnyBaseToDecimalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/AnyBaseToDecimalTest.java)
624626
* [BinaryToDecimalTest](https://github.com/TheAlgorithms/Java/blob/master/src/test/java/com/thealgorithms/conversions/BinaryToDecimalTest.java)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.thealgorithms.ciphers;
2+
3+
import java.nio.charset.Charset;
4+
import java.nio.charset.StandardCharsets;
5+
import java.util.HexFormat;
6+
7+
/**
8+
* A simple implementation of XOR cipher that, given a key, allows to encrypt and decrypt a plaintext.
9+
*
10+
* @author <a href="https://github.com/lcsjunior">lcsjunior</a>
11+
*
12+
*/
13+
public final class XORCipher {
14+
15+
private static final Charset CS_DEFAULT = StandardCharsets.UTF_8;
16+
17+
private XORCipher() {
18+
}
19+
20+
public static byte[] xor(final byte[] inputBytes, final byte[] keyBytes) {
21+
byte[] outputBytes = new byte[inputBytes.length];
22+
for (int i = 0; i < inputBytes.length; ++i) {
23+
outputBytes[i] = (byte) (inputBytes[i] ^ keyBytes[i % keyBytes.length]);
24+
}
25+
return outputBytes;
26+
}
27+
28+
public static String encrypt(final String plainText, final String key) {
29+
byte[] plainTextBytes = plainText.getBytes(CS_DEFAULT);
30+
byte[] keyBytes = key.getBytes(CS_DEFAULT);
31+
byte[] xorResult = xor(plainTextBytes, keyBytes);
32+
return HexFormat.of().formatHex(xorResult);
33+
}
34+
35+
public static String decrypt(final String cipherText, final String key) {
36+
byte[] cipherBytes = HexFormat.of().parseHex(cipherText);
37+
byte[] keyBytes = key.getBytes(CS_DEFAULT);
38+
byte[] xorResult = xor(cipherBytes, keyBytes);
39+
return new String(xorResult, CS_DEFAULT);
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.thealgorithms.ciphers;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
class XORCipherTest {
8+
9+
@Test
10+
void xorEncryptTest() {
11+
// given
12+
String plaintext = "My t&xt th@t will be ençrypted...";
13+
String key = "My ç&cret key!";
14+
15+
// when
16+
String cipherText = XORCipher.encrypt(plaintext, key);
17+
18+
// then
19+
assertEquals("000000b7815e1752111c601f450e48211500a1c206061ca6d35212150d4429570eed", cipherText);
20+
}
21+
22+
@Test
23+
void xorDecryptTest() {
24+
// given
25+
String cipherText = "000000b7815e1752111c601f450e48211500a1c206061ca6d35212150d4429570eed";
26+
String key = "My ç&cret key!";
27+
28+
// when
29+
String plainText = XORCipher.decrypt(cipherText, key);
30+
31+
// then
32+
assertEquals("My t&xt th@t will be ençrypted...", plainText);
33+
}
34+
}

0 commit comments

Comments
 (0)