import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; /**
* Created by 黄俊聪 on 2017/12/15.
*/
public class AESUtil { public static final String KEY_ALGORITHM = "AES";
public static final String KEY_ALGORITHM_MODE = "AES/CBC/PKCS5Padding"; /**
*@Author 黄俊聪
*@Date 2017/12/15 15:44
*@Description AES对称加密
* @param data
* @param key key需要16位
*/ public static String encrypt(String data,String key){
try {
SecretKeySpec spec = new SecretKeySpec(key.getBytes("UTF-8"),KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM_MODE);
cipher.init(Cipher.ENCRYPT_MODE , spec,new IvParameterSpec(new byte[cipher.getBlockSize()]));
byte[] bs = cipher.doFinal(data.getBytes("UTF-8"));
return Base64Util.encode(bs);
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
*@Author 黄俊聪
*@Date 2017/12/15 15:50
*@Description
* AES对称解密 key需要16位
* @param data
* @param key
* @return
*/
public static String decrypt(String data, String key) {
try {
SecretKeySpec spec = new SecretKeySpec(key.getBytes("UTF-8"), KEY_ALGORITHM);
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM_MODE);
cipher.init(Cipher.DECRYPT_MODE , spec , new IvParameterSpec(new byte[cipher.getBlockSize()]));
byte[] originBytes = Base64Util.decode(data);
byte[] result = cipher.doFinal(originBytes);
return new String(result,"UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return null;
} public static void main(String[] args) throws Exception {
/**AES加密数据**/
String key = "123456789abcdfgt";
String dataToEn = "黄俊聪";
String enResult = encrypt(dataToEn, key);
System.out.println(enResult);
// String deResult = decrypt(enResult,key);
// System.out.println(deResult); /**RSA 加密AES的密钥**/
byte[] enKey = RSAUtil.encryptByPublicKey(key.getBytes("UTF-8"), "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbpmF28RgRDMduGSDhB2CD 0CiOFYytTGxYQuffq5RTgdoxxsE/3dgE+qQaDsTG1yzOwwCq7X3Xye7MZlcL 5SjNiLzh5tSEG7qyAVUfAgit1gYczWM+sTg+G7pnHa/omukvOfEeWceS8P35 Xt3ShqIeKfGxU4UIdiqKonBrQtYT/wIDAQAB");
System.out.println(new String(enKey,"UTF-8"));
String baseKey = Base64Util.encode(enKey); //服务端RSA解密AES的key
byte[] de = Base64Util.decode(baseKey);
byte[] deKeyResult = RSAUtil.decryptByPrivateKey(de);
System.out.println(new String(deKeyResult,"UTF-8")); String deResult = decrypt(enResult,key);
System.out.println(deResult);
}
//Base64工具类
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream; public class Base64Util {
private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
.toCharArray(); public static String encode(byte[] data) {
byte start = 0;
int len = data.length;
StringBuffer buf = new StringBuffer(data.length * 3 / 2);
int end = len - 3;
int i = start;
int n = 0; int d;
while (i <= end) {
d = (data[i] & 255) << 16 | (data[i + 1] & 255) << 8 | data[i + 2] & 255;
buf.append(legalChars[d >> 18 & 63]);
buf.append(legalChars[d >> 12 & 63]);
buf.append(legalChars[d >> 6 & 63]);
buf.append(legalChars[d & 63]);
i += 3;
if (n++ >= 14) {
n = 0;
buf.append(" ");
}
} if (i == start + len - 2) {
d = (data[i] & 255) << 16 | (data[i + 1] & 255) << 8;
buf.append(legalChars[d >> 18 & 63]);
buf.append(legalChars[d >> 12 & 63]);
buf.append(legalChars[d >> 6 & 63]);
buf.append("=");
} else if (i == start + len - 1) {
d = (data[i] & 255) << 16;
buf.append(legalChars[d >> 18 & 63]);
buf.append(legalChars[d >> 12 & 63]);
buf.append("==");
} return buf.toString();
} private static int decode(char c) {
if (c >= 65 && c <= 90) {
return c - 65;
} else if (c >= 97 && c <= 122) {
return c - 97 + 26;
} else if (c >= 48 && c <= 57) {
return c - 48 + 26 + 26;
} else {
switch (c) {
case '+':
return 62;
case '/':
return 63;
case '=':
return 0;
default:
throw new RuntimeException("unexpected code: " + c);
}
}
} public static byte[] decode(String s) {
ByteArrayOutputStream bos = new ByteArrayOutputStream(); try {
decode(s, bos);
} catch (IOException var5) {
throw new RuntimeException();
} byte[] decodedBytes = bos.toByteArray(); try {
bos.close();
bos = null;
} catch (IOException var4) {
System.err.println("Error while decoding BASE64: " + var4.toString());
} return decodedBytes;
} private static void decode(String s, OutputStream os) throws IOException {
int i = 0;
int len = s.length(); while (true) {
while (i < len && s.charAt(i) <= 32) {
++i;
} if (i == len) {
break;
} int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6)
+ decode(s.charAt(i + 3));
os.write(tri >> 16 & 255);
if (s.charAt(i + 2) == 61) {
break;
} os.write(tri >> 8 & 255);
if (s.charAt(i + 3) == 61) {
break;
} os.write(tri & 255);
i += 4;
} } }

RSAUtil算法请看下一篇

AES对称加密的更多相关文章

  1. AES对称加密和解密

    package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  2. java的AES对称加密和解密,有偏移量

    import java.math.BigDecimal; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; i ...

  3. AES对称加密和解密(转)

    AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...

  4. 正确使用AES对称加密

    正确使用AES对称加密 经常我看到项目中有人使用了对称加密算法,用来加密客户或项目传输中的部分数据.但我注意到开发 人员由于不熟悉原理,或者简单复制网上的代码示例,有导致代码存在安全风险. 我经常遇到 ...

  5. JAVA中AES对称加密和解密

    AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...

  6. AES对称加密解密类

    import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...

  7. 使用Aes对称加密解密Web.Config数据库连接串

    现在很多公司开始为了保证数据库的安全性,通常会对Web.Config的数据库连接字符串进行加密.本文将介绍学习使用Aes加密解密数据库连接字符串.本文采用MySql数据库. AES概念简述 AES 是 ...

  8. 17.app后端如何保证通讯安全--aes对称加密

    在上文<16.app后端如何保证通讯安全--url签名>提到,url签名有两个缺点,这两个缺点,如果使用对称加密方法的话,则完全可以避免这两个缺点.在本文中,会介绍对称加密的具体原理,和详 ...

  9. openssl之aes对称加密

    AES:密码学中的高级加密标准(Advanced Encryption Standard,AES),又称 Rijndael加密法. 对称加密:用同一个密码  加密/解密  文件. 使用openssl中 ...

随机推荐

  1. js中的监听事件总结

    javascript事件与功能说明大全:http://tools.jb51.net/table/javascript_event 1.滚动条监听事件 例1:监听滚动条距离页面顶端距离 <scri ...

  2. Eclipse 配置运行Spark

    本文主要记录Spark 在 Eclipse中报 找不到主类的问题.在新建Spark工程,然后add external jars 选择 spark-assembly-1.4.0-hadoop2.6.0. ...

  3. iOS简单动画效果:闪烁、移动、旋转、路径、组合

    #define kDegreesToRadian(x) (M_PI * (x) / 180.0) #define kRadianToDegrees(radian) (radian*180.0)/(M_ ...

  4. HTTP请求和MIME介绍

    HTTP请求和MIME介绍 HTTP请求由三部分组成,分别是: 请求行,消息报头,请求正文. 请求行(格式): Method Request-URI HTTP-Version CRLF Method: ...

  5. 数据库备份shell脚本

    法一: #!/bin/bash [ ! -d /server/backup ] && mkdir /server/backup mysqldump -u root -A -B > ...

  6. vue打包后不使用服务器直接访问方法

    根据官网打包执行npm run build 后dist文件夹打开的index.html 是空白 需要开启http服务器才能访问,以下是解决办法 1.找到config文件夹下的index文件 修改成 2 ...

  7. mybatis-generator 根据表生成对应文件

    1 创建maven工程 2.编辑.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project ...

  8. FreeMarker template error: The following has evaluated to null or missing: ==> blogger.md [in template "admin/about.ftl" at line 44, column 84]

    FreeMarker template error:The following has evaluated to null or missing:==> blogger.md [in templ ...

  9. 夏令营讲课内容整理 Day 6 Part 2.

    Day 6的第二部分,数论 数论是纯粹数学的分支之一,主要研究整数的性质   1.一些符号: a mod b 代表a除以b得到的余数 a|b a是b的约数 floor(x) 代表x的下取整,即小于等于 ...

  10. 解决无法make uImage的问题

    进入一个uboot目录, 执行make distclean make at91sam9260ek_config make ARCH=arm CROSS_COMPILE=arm-linux- cp to ...