1.对称加密
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。
2.非对称加密
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。
3.AES标准规范
AES最常见的有3种方案,分别是AES-128、AES-192和AES-256,它们的区别在于密钥长度不同,AES-128的密钥长度为16bytes(128bit / 8),后两者分别为24bytes和32bytes。密钥越长,安全强度越高,但伴随运算轮数的增加,带来的运算开销就会更大,所以用户应根据不同应用场合进行合理选择,192和256由于美国限制 需要相关授权 否则抛出异常。
4.java应用
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import org.apache.commons.codec.binary.Base64;
public class AES128Utils {
public static final String KEY_ALGORITHM = "AES";
public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
public AES128Utils() {
}
/**
* 生成密钥
* @return
* @throws Exception
*/
public static String initkey() throws Exception {
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM);
kg.init(128);
SecretKey secretKey = kg.generateKey();
return Base64.encodeBase64String(secretKey.getEncoded());
}
public static Key toKey(byte[] key) throws Exception {
return new SecretKeySpec(key, KEY_ALGORITHM);
}
/**
* 加密
* @param data 源数据
* @param key 密钥key
* @return
* @throws Exception
*/
public static String encrypt(String data, String key) throws Exception {
Key k = toKey(Base64.decodeBase64(key));
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(1, k);
return Base64.encodeBase64String(cipher.doFinal(data.getBytes()));
}
/**
* 解密
* @param data 已加密的数据
* @param key 密钥
* @return
* @throws Exception
*/
public static String decrypt(String data, String key) throws Exception {
Key k = toKey(Base64.decodeBase64(key));
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(2, k);
return new String(cipher.doFinal(Base64.decodeBase64(data)));
}
/**
* 测试main 方法
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String source = "123456";
System.out.println("原文:" + source);
String key = initkey();
System.out.println("密钥:" + key);
String encryptData = encrypt(source, key);
System.out.println("加密:" + encryptData);
String decryptData = decrypt(encryptData, key);
System.out.println("解密: " + decryptData);
}
}