AES对称加密
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对称加密的更多相关文章
- AES对称加密和解密
package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...
- java的AES对称加密和解密,有偏移量
import java.math.BigDecimal; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; i ...
- AES对称加密和解密(转)
AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...
- 正确使用AES对称加密
正确使用AES对称加密 经常我看到项目中有人使用了对称加密算法,用来加密客户或项目传输中的部分数据.但我注意到开发 人员由于不熟悉原理,或者简单复制网上的代码示例,有导致代码存在安全风险. 我经常遇到 ...
- JAVA中AES对称加密和解密
AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...
- AES对称加密解密类
import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...
- 使用Aes对称加密解密Web.Config数据库连接串
现在很多公司开始为了保证数据库的安全性,通常会对Web.Config的数据库连接字符串进行加密.本文将介绍学习使用Aes加密解密数据库连接字符串.本文采用MySql数据库. AES概念简述 AES 是 ...
- 17.app后端如何保证通讯安全--aes对称加密
在上文<16.app后端如何保证通讯安全--url签名>提到,url签名有两个缺点,这两个缺点,如果使用对称加密方法的话,则完全可以避免这两个缺点.在本文中,会介绍对称加密的具体原理,和详 ...
- openssl之aes对称加密
AES:密码学中的高级加密标准(Advanced Encryption Standard,AES),又称 Rijndael加密法. 对称加密:用同一个密码 加密/解密 文件. 使用openssl中 ...
随机推荐
- PHP读取XML文件
xml主键被json取代,大概了解一下就OK了 简要: 加载xml文件:$xml = simplexml_load_file('sa.xml');//$xml是一个对象 读取节点:echo $xml- ...
- 李忠益TP5商城项目笔记(待完成)
商品种类的无限极分类 $data=db('goods_type')->field(['*','concat(path,",",id)'=>'paths'])->o ...
- 【转】GPS网平差
进行GPS网平差的目的主要有三个: (1)消除由观测量和已知条件中存在的误差所引起的GPS网在几何上的不一致.包括闭合环闭合差不为0:复测基线较差不为0:通过由基线向量所形成的导线,将坐标由一个已知点 ...
- CSS——元素分类
1.标签元素被分为三大类:块状元素.内联元素和内联块元素. (1)常见块状元素有:<div>.<p>.<h1>...<h6>.<ol>.&l ...
- Titanic数据分析
一.材料准备 https://www.kaggle.com/c/titanic-gettingStarted/ 二.提出问题 生存率和哪些因素有关(性别,年龄,是否有伴侣,票价,舱位等级,包间,出发地 ...
- 【原创】Hibernate通过实体类自动建表时type=MyISAM的问题
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 当使用的mysql数据库为5.5版本时,方言需要设置为 <property name="hibernate.dialect&q ...
- OS模块的常用内置方法
chdir 修改当前工作目录到指定目录 Change the current working directory to the specified path. chmod 修改一个文件的访问权限 Ch ...
- Go笔记-指针
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址 一个指针变量可以指向任何一个值的内存地址 它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器 ...
- C语言深度剖析-笔记
关键字: C语言关键字32个: 关键字 意 义 auto 声明自动变 ...
- bzoj 3996: [TJOI2015]线性代数 [最小割]
3996: [TJOI2015]线性代数 题意:给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 \(D=(A * B-C)* A^T\)最大.其中A^T为A的转置.输出D.每 ...