package servlets;
/**
* One Time pad encryption for user specific keys.
* <br/><br/>
* 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.<br/>
*
* 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/>
*
* 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
* @throws Exception Throws illegal state Exception
*/
public static String decrypt(String hash) throws Exception
{
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
* @throws Exception Throws illegal state Exception
*/
public static String decrypt(String hash, String key) throws Exception
{
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;
}
}