Repository navigation
Expand file tree
/
Copy pathOneTimePad.java
More file actions
120 lines (112 loc) · 3.66 KB
/
Copy pathOneTimePad.java
File metadata and controls
120 lines (112 loc) · 3.66 KB
1
2
3
4
5
6
7
8
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package servlets;
/**
* One Time pad encryption for user specific keys. <br>
* <br>
* This file is part of the Security Shepherd Project.
*
* <p>The Security Shepherd project is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software Foundation, either
* version 3 of the License, or (at your option) any later version.<br>
*
* <p>The Security Shepherd project is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.<br>
*
* <p>You should have received a copy of the GNU General Public License along with the Security
* Shepherd project. If not, see <http://www.gnu.org/licenses/>.
*
* @author Jason
*/
public class OneTimePad {
private static final String KEY = "SuperKalaFragalisticExpeAloDocious";
/**
* Encrypts the supplied string value using the default key
*
* @param text The string that is to be encrypted
* @return The resulting string from encryption
*/
public static String encrypt(final String text) {
return new String(
org.apache.commons.codec.binary.Base64.encodeBase64String(xor(text.getBytes())).getBytes());
}
/**
* Encrypts the supplied string value using the submitted key
*
* @param key The encryption key
* @param text The string that is to be encrypted
* @return The resulting string from encryption
*/
public static String encrypt(final String text, String key) {
return new String(
org.apache.commons.codec.binary.Base64.encodeBase64String(xor(text.getBytes(), key))
.getBytes());
}
/**
* Decrypts the supplied string value using the default key
*
* @param hash The cipher text to be decrypted
* @return The plain text revealed from the decryption
*/
public static String decrypt(String hash) {
try {
return new String(
xor(org.apache.commons.codec.binary.Base64.decodeBase64(hash.getBytes())), "UTF-8");
} catch (java.io.UnsupportedEncodingException ex) {
throw new IllegalStateException(ex);
}
}
/**
* Decrypts the supplied string value using the submitted key
*
* @param hash The cipher text to be decrypted
* @param key The encryption key
* @return The plain text revealed from the decryption
*/
public static String decrypt(String hash, String key) {
try {
return new String(
xor(org.apache.commons.codec.binary.Base64.decodeBase64(hash.getBytes()), key), "UTF-8");
} catch (java.io.UnsupportedEncodingException ex) {
throw new IllegalStateException(ex);
}
}
/**
* XOR Function
*
* @param input Byte array to be XOR'd
* @return
*/
private static byte[] xor(final byte[] input) {
final byte[] output = new byte[input.length];
final byte[] secret = KEY.getBytes();
int spos = 0;
for (int pos = 0; pos < input.length; pos += 1) {
output[pos] = (byte) (input[pos] ^ secret[spos]);
spos += 1;
if (spos >= secret.length) {
spos = 0;
}
}
return output;
}
/**
* XOR Function
*
* @param input Byte array to be XOR'd
* @param key Encryption Key
* @return
*/
private static byte[] xor(final byte[] input, String theKey) {
final byte[] output = new byte[input.length];
final byte[] secret = theKey.getBytes();
int spos = 0;
for (int pos = 0; pos < input.length; pos += 1) {
output[pos] = (byte) (input[pos] ^ secret[spos]);
spos += 1;
if (spos >= secret.length) {
spos = 0;
}
}
return output;
}
}