Created
August 7, 2013 23:08
-
-
Save yanchenko/6179826 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Copyright 2013 Alex Yanchenko | |
* | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package org.droidparts.util.crypto; | |
import java.security.SecureRandom; | |
import javax.crypto.Cipher; | |
import javax.crypto.KeyGenerator; | |
import javax.crypto.SecretKey; | |
import javax.crypto.spec.SecretKeySpec; | |
public class Crypter { | |
private final byte[] seed; | |
public Crypter(String seed) { | |
this.seed = seed.getBytes(); | |
} | |
public String encrypt(String cleartext) throws Exception { | |
byte[] rawKey = getRawKey(seed); | |
byte[] result = encrypt(rawKey, cleartext.getBytes()); | |
return toHex(result); | |
} | |
public String decrypt(String encrypted) throws Exception { | |
byte[] rawKey = getRawKey(seed); | |
byte[] enc = toByte(encrypted); | |
byte[] result = decrypt(rawKey, enc); | |
return new String(result); | |
} | |
private static byte[] getRawKey(byte[] seed) throws Exception { | |
KeyGenerator kgen = KeyGenerator.getInstance("AES"); | |
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); | |
sr.setSeed(seed); | |
kgen.init(128, sr); // 192 and 256 bits may not be available | |
SecretKey skey = kgen.generateKey(); | |
byte[] raw = skey.getEncoded(); | |
return raw; | |
} | |
private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { | |
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); | |
Cipher cipher = Cipher.getInstance("AES"); | |
cipher.init(Cipher.ENCRYPT_MODE, skeySpec); | |
byte[] encrypted = cipher.doFinal(clear); | |
return encrypted; | |
} | |
private static byte[] decrypt(byte[] raw, byte[] encrypted) | |
throws Exception { | |
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); | |
Cipher cipher = Cipher.getInstance("AES"); | |
cipher.init(Cipher.DECRYPT_MODE, skeySpec); | |
byte[] decrypted = cipher.doFinal(encrypted); | |
return decrypted; | |
} | |
public static String toHex(String txt) { | |
return toHex(txt.getBytes()); | |
} | |
public static String fromHex(String hex) { | |
return new String(toByte(hex)); | |
} | |
public static byte[] toByte(String hexString) { | |
int len = hexString.length() / 2; | |
byte[] result = new byte[len]; | |
for (int i = 0; i < len; i++) | |
result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2), | |
16).byteValue(); | |
return result; | |
} | |
public static String toHex(byte[] buf) { | |
if (buf == null) | |
return ""; | |
StringBuffer result = new StringBuffer(2 * buf.length); | |
for (int i = 0; i < buf.length; i++) { | |
appendHex(result, buf[i]); | |
} | |
return result.toString(); | |
} | |
private final static String HEX = "0123456789ABCDEF"; | |
private static void appendHex(StringBuffer sb, byte b) { | |
sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment