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; } }