写点什么

Java 实现 AES 加密算法,2021 最新百度、头条等公司 Java 面试题目

作者:Java高工P7
  • 2021 年 11 月 10 日
  • 本文字数:1575 字

    阅读完需:约 5 分钟

return decrypt(cipertext,key,_ENCRYPT_MODE);


}


/**


  • AES 加密

  • @param plainText 明文

  • @param key 密钥

  • @param encryptMode AES 加密模式,CBC 或 ECB

  • @return 该字符串的 AES 密文值


*/


public static String encrypt(String plainText, String key,String encryptMode) {


if (StringUtils.isEmpty(key)|| StringUtils.isEmpty(plainText)) {


return null;


}


try {


key = getMD5(key);


byte[] raw = key.getBytes("utf-8");


SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");


Cipher cipher = Cipher.getInstance("AES/"+encryptMode+"/PKCS5Padding");


if(encryptMode==AES.ENCRYPT_MODE_ECB) {


cipher.init(Cipher.ENCRYPT_MODE, skeySpec);


}


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


else {


IvParameterSpec iv = new IvParameterSpec(key.getBytes("utf-8"));//使用 CBC 模式,需要一个向量 iv,可增加加密算法的强度


cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);


}


byte[] encrypted = cipher.doFinal(plainText.getBytes("utf-8"));


String encryptedStr=new String(new BASE64Encoder().encode(encrypted));


//此处使用 BASE64 做转码功能,同时能起到 2 次加密的作用。


return encryptedStr;


//return new String(encrypted);


} catch (Exception ex) {


System.out.println(ex.toString());


return null;


}


}


/**


  • AES 解密

  • @param cipherText 密文

  • @param key 密钥

  • @param encryptMode AES 加密模式,CBC 或 ECB

  • @return 该密文的明文


*/


public static String decrypt(String cipherText, String key,String encryptMode) {


if (StringUtils.isEmpty(key)|| StringUtils.isEmpty(cipherText)) {


return null;


}


try {


key=getMD5(key);


byte[] raw = key.getBytes("utf-8");


SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");


Cipher cipher=Cipher.getInstance("AES/"+encryptMode+"/PKCS5Padding");


if(encryptMode==AES.ENCRYPT_MODE_ECB) {


cipher.init(Cipher.DECRYPT_MODE, skeySpec);


}else {


//使用 CBC 模式,需要一个向量 iv,可增加加密算法的强度


IvParameterSpec iv = new IvParameterSpec(key.getBytes("utf-8"));


cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);


}


//先用 base64 解密


byte[] encrypted1 = new BASE64Decoder().decodeBuffer(cipherText);


//byte[] encrypted1 = CipherText.getBytes();


try {


byte[] original = cipher.doFinal(encrypted1);


String originalString = new String(original,"utf-8");


return originalString;


} catch (Exception e) {


System.out.println(e.toString());


return null;


}


} catch (Exception ex) {


System.out.println(ex.toString());


return null;


}


}


/**


  • 进行 MD5 加密

  • @param s 要进行 MD5 转换的字符串

  • @return 该字符串的 MD5 值的 8-24 位


*/


public static String getMD5(String s){


char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};


try {


byte[] btInput = s.getBytes();


// 获得 MD5 摘要算法的 MessageDigest 对象


MessageDigest mdInst = MessageDigest.getInstance("MD5");


// 使用指定的字节更新摘要


mdInst.update(btInput);


// 获得密文


byte[] md = mdInst.digest();


// 把密文转换成十六进制的字符串形式


int j = md.length;


char str[] = new char[j * 2];


int k = 0;


for (int i = 0; i < j; i++) {


byte byte0 = md[i];


str[k++] = hexDigits[byte0 >>> 4 & 0xf];


str[k++] = hexDigits[byte0 & 0xf];


}


return new String(str).substring(8,24);


} catch (Exception e) {


e.printStackTrace();


return null;


}


}


}

AES 加密算法简要说明

AES 加密

  1. 校验参数是否为空。

  2. 将秘钥进行 MD5 加密(加密后的长度为 16)。

  3. 将明文进行 AES 加密。

  4. 将进行 AES 加密后的密文使用 base64 加密,并将转码后的结果返回。




用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Java实现AES加密算法,2021最新百度、头条等公司Java面试题目