android Encrypt/Decrypt Strings 在4.2中无法解密解决办法
2014-01-13 10:39
537 查看
修改如下方法
或者 在Android 4.2 可以改用MD5 改变getrawkey()算法,它更加具有可操作性,MD5哈希计算在所有平台上都一样
原来方法为
private static byte[] getRawKey(byte[] seed) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG","Crypto"); 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; }
或者 在Android 4.2 可以改用MD5 改变getrawkey()算法,它更加具有可操作性,MD5哈希计算在所有平台上都一样
private static byte[] getRawKey(byte[] seed) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] md5Bytes = md.digest(seed); // 128 Bit = 16 byte SecretKey skey = new SecretKeySpec(md5Bytes, "AES"); byte[] raw = skey.getEncoded(); return raw; }
原来方法为
import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * Usage: * <pre> * String crypto = SimpleCrypto.encrypt(masterpassword, cleartext) * ... * String cleartext = SimpleCrypto.decrypt(masterpassword, crypto) * </pre> * @author ferenc.hechler */ public class SimpleCrypto { public static String encrypt(String seed, String cleartext) throws Exception { byte[] rawKey = getRawKey(seed.getBytes()); byte[] result = encrypt(rawKey, cleartext.getBytes()); return toHex(result); } public static String decrypt(String seed, String encrypted) throws Exception { byte[] rawKey = getRawKey(seed.getBytes()); 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)); } }
相关文章推荐
- android-sdk无法更新到4.2的解决办法
- android DDMS 连接真机(己ROOT),用file explore无法查看修改data/data文件夹的解决办法
- VS2015 使用 Visual Studio Emulator For Android 调试无法命中断点的解决办法?
- COCOS2D-X 无法编译到Android平台的解决办法
- Android Studio for Ubuntu 14.04 无法输入中文解决办法
- Android中R.styleable 无法解析时候的解决办法
- Eclipse external tools以及windows dos“无法访问android.app.Activity 找不到android.app.Activity的类文件”详细解决办法
- 关于android更新ADT后,旧工程无法显示Graphical Layout的解决办法
- eclipse无法导入Android工程的现象与解决办法
- Android ListView的Item无法响应OnItemClick的解决办法
- 安卓模拟器Android SDK Manager 无法获取SDK列表的解决办法
- [置顶] Android DDMS 无法打开data问题的简便解决办法--一次性解决
- android版kindle横屏后无法恢复竖屏解决办法
- Android SDK Manager在添加Platforms和其他Packages时提示无法在相应目录创建文件夹的解决办法!
- android(1) : ubuntu无法识别设备的解决办法
- Android SDK Manager 无法获取SDK列表的解决办法(转)
- 解决国内android sdk无法更新,google不能的简单办法
- android apk异常卸载后无法安装的解决办法
- 安卓(Android)surfaceview无法使用gesturedetector的解决办法
- android SDK SDK Manager.exe 无法打开,一闪而过最终解决办法