高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
题外话:长矛和盾牌的斗争永远存在,近年已经有研究表明 AES 并非牢不可破,虽然 AES 城墙未跨,但已经被开了个孔,但未必代表 AES 不安全,因为要想真正攻破 AES 还是相当复杂的,也就是,就目前而言 AES 仍然安全。
以下加密代码基于 Java 内置的加密对象完成 AES 加密,使用静态Key,也可以很轻松的将 Key 改为动态输入,代码使用很简单:
/*
* AES 加密
* 传入原文字符串,获得密文
* 传入密文,解密并得到原文。
* key 静态,稍作调整,可以将 key 作为参数实时加密
*
*/
package cn.sharcom.library;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class EncryptTools
{
// 128 bit key
private String key = "TE53DAH32R9VMHEP";
// 16 bytes vector
private String initVector = "ZEM84JFYEJDHMKG0";
/**
* 对原文加密
*
* @param key
* @param initVector
* @param strSource
* @return
*/
private String encrypt(String key, String initVector, String strSource)
{
String strResult = null;
try
{
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(strSource.getBytes());
strResult = Base64.encodeBase64String(encrypted);
}
catch (Exception e)
{
e.printStackTrace();
strResult = null;
}
return strResult;
}
/**
* 对密文解密
*
* @param key
* @param initVector
* @param encrypted
* @return
*/
private String decrypt(String key, String initVector, String encrypted)
{
try
{
IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted));
return new String(original);
}
catch (Exception ex)
{
ex.printStackTrace();
}
return null;
}
/**
* AES 加密<br>
* 传入需要加密的原文
*
* @param strSource
* @return
*/
public String encrypt(String strText)
{
return encrypt(key, initVector, strText);
}
/**
* AES 解密<br>
* 输入密文
*
* @param strCiphertext
* @return
*/
public String decrypt(String strCiphertext)
{
return decrypt(key, initVector, strCiphertext);
}
}
测试代码:
@Test
public void testEncrypt()
{
// fail("Not yet implemented");
// 创建加密对象
EncryptTools encrypt = new EncryptTools();
// 设置需要加密的原文
String str = "Hello World";
System.out.println(str);
// 加密并输出密文
String strEncrypt = encrypt.encrypt(str);
System.out.println();
// 解密密文并输出原文
String strMessage = encrypt.decrypt(strEncrypt);
System.out.println(strMessage);
}
输出结果,而你看到的密文和这里的不一样,这是因为我们使用的 Key 并不相同的原因。
Hello World
fHo50bJylE1jnFb8+I7xKg==
Hello World
Q群讨论 236201801
.