您的位置:首页 > 其它

对称加密算法 - AES

2017-08-09 00:00 197 查看
1、概述

AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。是DES算法的替代者。

AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。





2、实现

import java.io.IOException;
import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
* 对称加密算法 AES
*/
public class AESCoder {

public final static String KEY_ALGORITHM = "AES";
// 加密解密算法/工作模式/填充方式
public final static String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";

/**
* 获取 密钥
* @return
* @throws Exception
*/
public static String initKey() throws Exception{
//实例化
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
//设置密钥长度为 128 或 192 或 256
kg.init(128);
//生成密钥
SecretKey secretKey = kg.generateKey();
// 获取 密钥的 二进制编码形式
byte[] b = secretKey.getEncoded();
return new BASE64Encoder().encode(b);
}

/**
* 密钥转换
* @param key
* @return
* @throws IOException
*/
public static Key toKey(String key) throws IOException{
byte[] k = new BASE64Decoder().decodeBuffer(key);
//实例化 AES
SecretKey secretKey = new SecretKeySpec(k, KEY_ALGORITHM);
return secretKey;
}

/**
* DES 加密
* @param data
* @param key
* @return
*/
public static String encrypt(byte[] data, String key) throws Exception{

// 还原 key
Key k = toKey(key);

//Cipher对象实际完成加密操作  - 填充方式
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
//用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, k);
//正式执行加密操作
byte[] bt = cipher.doFinal(data);
return new BASE64Encoder().encode(bt);
}

/**
* DES 解密
* @param encryStr
* @param key
* @return
*/
public static String decrypt(String encryStr, String key) throws Exception{

BASE64Decoder decoder = new BASE64Decoder();
byte[] encryArr = decoder.decodeBuffer(encryStr);

// 还原 key
Key k = toKey(key);

// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, k);
// 真正开始解密操作
byte[] arr = cipher.doFinal(encryArr);
return new String(arr, "utf-8");
}

public static void main(String[] args) throws Exception {
String key = initKey();
String source = "AES 加密测试";
System.out.println("生成的 key:" + key);
String encryStr = encrypt(source.getBytes("utf-8"), key);
System.out.println(source + "->加密后-> " + encryStr);
String decryStr = decrypt(encryStr, key);
System.out.println(encryStr + "->解密后-> " + decryStr);
/***Console结果
* 生成的 key:EPyU8UwMv89YB6I4aYUnmg==
AES 加密测试->加密后-> 3ny9oF+LtTxzhjM4wZiuMIkqKANkErKBaiGx9knO91Y=
3ny9oF+LtTxzhjM4wZiuMIkqKANkErKBaiGx9knO91Y=->解密后-> AES 加密测试
*/
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对称加密算法 AES