package servlets;
/**
* One Time pad encryption for user specific keys.
*
* This file is part of the Security Shepherd Project.
*
*
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.
*
*
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.
*
*
You should have received a copy of the GNU General Public License along with the Security
* Shepherd project. If not, see .
*
* @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;
}
}