欢迎大家来到IT世界,在知识的湖畔探索吧!
使用AES加密,再使用base64编码加密。
具体细节请看注释。
/** * 加密 * * @param sSrc 加密的明文 * @param sKey 秘钥 * @param iv 向量 16 bytes * @return * @throws Exception */ public static String Encrypt(String sSrc, String sKey,String iv) throws Exception { if (sKey == null) { System.out.print("Key不能为空null"); return null; } if (sKey.length() != 16) { System.out.print("Key的长度不是16位"); return null; } if (iv.length() != 16) { System.out.print("iv的长度不是16位"); return null; } byte[] raw = sKey.getBytes(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec iv1 = new IvParameterSpec(iv.getBytes()); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv1); byte[] encrypted = cipher.doFinal(sSrc.getBytes()); return new BASE64Encoder().encode(encrypted); }
欢迎大家来到IT世界,在知识的湖畔探索吧!
解密,如加密相似,唯一不同就是解密的参数是待解密文件。
欢迎大家来到IT世界,在知识的湖畔探索吧! /** * 解密 * @param sSrc 接收到的加密过后的字符串(带解密密文) * @param sKey 秘钥 * @return * @throws Exception */ public static String Decrypt(String sSrc, String sKey,String iv) throws Exception { try { if (sKey == null) { System.out.print("Key不能为空null"); return null; } if (sKey.length() != 16) { System.out.print("Key的长度不是16位"); return null; } if (iv.length() != 16) { System.out.print("iv的长度不是16位"); return null; } byte[] byte1 = Base64.decode(sSrc);//先用Base64解码 IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes()); SecretKeySpec key = new SecretKeySpec(sKey.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); //与加密时不同MODE:Cipher.DECRYPT_MODE byte[] ret = cipher.doFinal(byte1); return new String(ret, "utf-8"); } catch (Exception ex) { System.out.println(ex.toString()); return null; } }
上述是我集成的方法,把加密(解密)文件、私钥、向量都作为参数进行的解析。
如若您想单独加密解密的话,请继续往下看。
/** * AES加密 * * @param content * @return * @throws Exception */ public static byte[] aesEncryptToBytes(String content) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(LENGTH, new SecureRandom(defaultKey.getBytes())); Cipher cipher = Cipher.getInstance("AES"); SecretKeySpec sks = new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"); cipher.init(Cipher.ENCRYPT_MODE, sks); return cipher.doFinal(content.getBytes(ENCODE)); } /** * AES解密 * * @param encryptBytes * @return * @throws Exception */ public static String aesDecryptByBytes(byte[] encryptBytes) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(LENGTH, new SecureRandom(defaultKey.getBytes())); Cipher cipher = Cipher.getInstance("AES"); SecretKeySpec sks = new SecretKeySpec(kgen.generateKey().getEncoded(), "AES"); cipher.init(Cipher.DECRYPT_MODE, sks); byte[] decryptBytes = cipher.doFinal(encryptBytes); return new String(decryptBytes); }
欢迎大家来到IT世界,在知识的湖畔探索吧! /** * BASE64 加密 * * @param content * @return * @throws Exception */ public static String base64Encode(byte[] bytes) { return new BASE64Encoder().encode(bytes); } /** * BASE64 解密 * * @param content * @return * @throws Exception */ public static byte[] base64Decode(String base64Code) throws Exception { return isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code); }
接下来测试一下:
public static void main(String[] args) throws Exception{ String pwd="123456"; String s = MD5Utils.md5LowerCase(pwd); //这里使用的是md5加密后的前十六位作为私钥,后十六位作为向量 //私钥 String substring = s.substring(0, 16); //向量 String substring1 = s.substring(16, 32); System.out.println("私钥 :"+substring); System.out.println("向量 :"+substring1); String mobile="18621764382"; String encrypt1 = Encrypt(mobile, substring,substring1); System.out.println("加密后的密文:"+encrypt1); String decrypt1 = Decrypt(encrypt1, substring,substring1); System.out.println("解密后的明文:"+decrypt1); }
结果:
私钥 :e10adc3949ba59ab 向量 :be56e057f20f883e 加密后的密文:c85VnIGqV2rxsPT1lNviiA== 解密后的明文:18621764382
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/49061.html