Android的常用加密和解密
16lz
2021-01-25
加密算法有很多一般分为对称加密(DES,AES)、非对称加密(RSA)、单向加密(MD5);
DES加密:
public class DES { // 初始化向量,随意填充 private static byte[] iv = { 'a', 'b', 'c', 'd', 'e', 1, 2, '*' }; public static void main(String[] args) { // 指定密匙 String key = "*()&^%$#"; // 指定需要加密的明文 String text = "4454069u =o 5h6u= bopregkljoj"; try { // 调用DES加密方法 String encryString = DES.encryptDES(text, key); System.out.println("DES加密结果: " + encryString); // 调用DES解密方法 String decryString = DES.decryptDES(encryString, key); System.out.println("DES解密结果: " + decryString); } catch (Exception e) { e.printStackTrace(); } } // DES加密 // encryptText为原文 // encryptKey为密匙 private static String encryptDES(String encryptText, String encryptKey) throws Exception { // 实例化IvParameterSpec对象,使用指定的初始化向量 IvParameterSpec spec = new IvParameterSpec(iv); // 实例化SecretKeySpec类,根据字节数组来构造SecretKeySpec SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES"); // 创建密码器 Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); // 用密码初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, key, spec); // 执行加密操作 byte[] encryptData = cipher.doFinal(encryptText.getBytes()); // 返回加密后的数据 return Base64.getEncoder().encodeToString(encryptData); } // 解密 private static String decryptDES(String decryptString, String decryptKey) throws Exception { // 先使用Base64解密 byte[] base64byte = Base64.getDecoder().decode(decryptString); // 实例化IvParameterSpec对象,使用指定的初始化向量 IvParameterSpec spec = new IvParameterSpec(iv); // 实例化SecretKeySpec类,根据字节数组来构造SecretKeySpec SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES"); // 创建密码器 Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); // 用密码初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, key, spec); // 获取解密后的数据 byte decryptedData[] = cipher.doFinal(base64byte); // 将解密后数据转换为字符串输出 return new String(decryptedData); }}
AES加密:
public class AES { public static void main(String[] args) throws Exception { // 设置加密密匙 String masterPassword = "AndroidERHJ"; // 设置原文 String originalText = "ABCDEFGHIJKLMNOPQRS547KYU,N;[HTUVWXYZ"; // 调用AES加密方法 String encryptingCode = AES.encrypt(masterPassword, originalText); System.out.println("加密结果:" + encryptingCode); // 调用AES解密方法 String decryString = AES.decrypt(masterPassword, encryptingCode); System.out.println("解密结果:" + decryString); } // AES加密 // encryptText为要加密的内容 // seed为密匙 public static String encrypt(String seed, String encryptText) throws Exception { byte[] rawKey = getRawKey(seed.getBytes()); byte[] result = encrypt(rawKey, encryptText.getBytes()); return toHex(result); } // AES解密 // decryptText为需要解密的内容 // seed为密匙 public static String decrypt(String seed, String decryptText) throws Exception { byte[] rawKey = getRawKey(seed.getBytes()); byte[] enc = toByte(decryptText); byte[] result = decrypt(rawKey, enc); return new String(result); } // 加密 private static byte[] encrypt(byte[] raw, byte[] bytes) throws Exception { // 生成一组扩展密匙,并放入一个数组之中 SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES"); // 用ENCRYPT_MODE模式,用skeySpec密码组,生成AES加密方法 cipher.init(Cipher.ENCRYPT_MODE, skeySpec); // 得到加密数据 byte[] encrypted = cipher.doFinal(bytes); return encrypted; } // 解密 private static byte[] decrypt(byte[] rawKey, byte[] enc) throws Exception { // 生成一组扩展密匙,并放入一个数组之中 SecretKeySpec skeyKeySpec = new SecretKeySpec(rawKey, "AES"); Cipher cipher = Cipher.getInstance("AES"); // 用DECRYPT_MODE模式,用skeySpec密码组,生成AES解密方法 cipher.init(Cipher.DECRYPT_MODE, skeyKeySpec); // 得到解密数据 byte[] decrypted = cipher.doFinal(enc); return decrypted; } // 对密匙进行编码 private static byte[] getRawKey(byte[] bytes) throws Exception { // 获取密匙生成器 KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(bytes); // 生成128位的AES密码生成器 kgen.init(128, sr); // 生成密匙 SecretKey sKey = kgen.generateKey(); // 编码格式 byte[] raw = sKey.getEncoded(); return raw; } // 将十六进制字符串为十进制字符串 private static String fromHex(String hex) { return new String(toByte(hex)); } // 将十六进制字符串为十进制字节数组 private static byte[] toByte(String hex) { int len = hex.length() / 2; byte[] result = new byte[len]; for (int i = 0; i < len; i++) { result[i] = Integer.valueOf(hex.substring(2 * i, 2 * i + 2), 16) .byteValue(); } return result; } // 把一个十进制字节数组转换成十六进制 private static String toHex(String txt) { return toHex(txt.getBytes()); } // 把一个十进制字节数组转换成十六进制 private 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 result, byte b) { result.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0X0f)); }}
MD5加密:
public class MD5 { public static void main(String[] args) { String md5 = toMd5("Android".getBytes()); System.out.println(md5); } // MD5加密 private static String toMd5(byte[] bytes) { try { // 实例化一个指定摘要算法为MD5的MessageDigest对象 MessageDigest algorithm = MessageDigest.getInstance("MD5"); // 重置摘要以供再次使用 algorithm.reset(); // 使用bytes跟新摘要 algorithm.update(bytes); // 使用指定的byte数组对摘要进行最后更新,然后完成摘要计算 return toHexString(algorithm.digest(), ""); } catch (Exception e) { e.printStackTrace(); } return null; } // 将字符串中的每个字符转换为十六进制 private static String toHexString(byte[] bytes, String separtor) { StringBuilder hexString = new StringBuilder(); for (byte b : bytes) { String hex = Integer.toHexString(0xff & b); if (hex.length() == 1) { hexString.append("0"); } hexString.append(hex).append(separtor); } return hexString.toString(); }}
更多相关文章
- android6.0 源码 系统应用之Music代码之类逻辑分析
- Android的源代码下载教程-android学习之旅(102)
- Android(安卓)Java 获取剪切板的内容,MD5加密。
- android调用webservice方法,参数或返回值使用服务器端类
- ClassLoader解析以及应用
- Android使用SharedPreferences实现登录帐号和密码的保存方法简介
- Android(安卓)Drawable 和String 相互转化
- Android(安卓)- 实现各种形状的ImageView
- Android(安卓)SDK开发 -- TitleBar重构 (代理模式-优化)