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);}
}
常用的加密算法_liaomin416100569的专栏-CSDN博客