网上资料显示,下一代加密技术会围绕着AES技术进行。初出茅庐,学习编写了加密代码,如下所示
package com.bao.tools.encryption;
import java.security.SecureRandom;
import java.util.Scanner;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.junit.Test;
/**
* @title AES加密解密算法
* @description 高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,现在 AES 标准的一个实现是 Rijndael 算法
* @author Administrator
* @date 2015-7-16
*/
public class CAES {
/**
*
* @param key(生成键字符串)
* @param value(加密的文字字符串)
* @param mode
* (true:加密;false:解密)
* @return
*/
public static byte[] setEncrypted(String key, byte[] value, boolean mode)throws Exception {
if (key == null || value == null)
return null;
// --------- 生成密码键
// 创建AES通用键模式
KeyGenerator generator = KeyGenerator.getInstance("AES");
// 初始化通用键(256位,创建随机编码键)
generator.init(128, new SecureRandom(key.getBytes("UTF-8")));
// 创建安全键实例
SecretKey keys = generator.generateKey();
// 创建密匙规范的实例
SecretKeySpec keySpec = new SecretKeySpec(keys.getEncoded(), "AES");
// ----------开始加密/解密内容
Cipher cipher = Cipher.getInstance("AES");// 创建AES内容加密实例
if (mode) {
cipher.init(Cipher.ENCRYPT_MODE, keySpec);// 加密
} else {
cipher.init(Cipher.DECRYPT_MODE, keySpec);// 解密
}
byte[] result = cipher.doFinal(value);
return result;//注意:返回一定是byte数组,否则报 16位字节异常 !
}
/*
* 测试
*/
@Test
public void test() throws Exception {
Scanner scanner = new Scanner(System.in);
System.out.println("-----------AES安全加密测试-------------\n请输入主键(字符串):");
String key = scanner.nextLine();
System.out.println("请输入要加密的内容:");
String value=scanner.nextLine();
System.out.println("---------运行结果-----------");
//如果要求安全系数更高且暂时不用解密,可以使用BASE64编码后再进行AES加密
// value = CBase64.setEncrypted(value);
byte[] message = setEncrypted(key, value.getBytes(), true);//执行加密方法
System.out.println("------加密字符为:"+new String(message));//在这里将字节数组转换为字符串显示出来
System.out.println("+++++++解 密 :"+new String(setEncrypted(key, message, false)));
scanner.close();
}
}
运行结果:
注明:网上找的资料,搞了大半个晚上才发现,byte存取很重要,不然会报16倍数字节异常 !