数据加密-对称加密AES

对称加密

对称加密算法又称传统加密算法。 加密和解密使用同一个密钥。

经典加密算法有三种:

  1. DES(Data Encryption Standard):数据加密标准(现在用的比较少,因为它的加密强度不够,能够暴力破解)
  2. 3DES:原理和DES几乎是一样的,只是使用3个密钥,对相同的数据执行三次加密,增强加密强度。(缺点:要维护3个密钥,大大增加了维护成本)
  3. AES(Advanced Encryption Standard):高级加密标准,目前美国国家安全局使用的,苹果的钥匙串访问采用的就AES加密。是现在公认的最安全的加密方式,是对称密钥加密中最流行的算法。

加密模式

加密模式:
ECB:电子密码本,就是每个块都是独立加密
CBC:密码块链,使用一个密钥和一个初始化向量(IV)对数据执行加密转换

只要是对称加密都有 ECB和 CBC模式,加密模式是加密过程对独立数据块的处理。对于较长的明文进行加密需要进行分块加密,在实际开发中,推荐使用CBC的,ECB的要少用。

AES加解密示例

数据传输的加密使用对称加密算法AES128位加密,加密模式CBC,填充模式PKCS5Padding方式。

/**
 * 加密
 * 
 * @param sSrc  待加密数据
 * @param sKey  密钥(16位字符串)
 * @return
 * @throws Exception
 */
public static String encrypt(String sSrc, String sKey) throws Exception {
	if (sKey == null) {
		return null;
	}
	// 判断Key是否为16位
	if (sKey.length() != 16) {
		return null;
	}
	byte[] raw = sKey.getBytes();
	SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
	Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "算法/模式/补码方式"
	IvParameterSpec iv = new IvParameterSpec(sKey.getBytes());// 使用CBC模式,需要一个向量iv,可增加加密算法的强度
	cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
	byte[] encrypted = cipher.doFinal(sSrc.getBytes());
	return new Base64Encoder().encode(encrypted);// 此处使用BASE64做转码功能,同时能起到2次加密的作用。
}

/**
 * 解密
 * 
 * @param sSrc 密文
 * @param sKey 密钥(16位字符串)
 * @return
 * @throws Exception
 */
public static String decrypt(String sSrc, String sKey) throws Exception {
	try {
		if (sKey == null) {
			return null;
		}
		// 判断Key是否为16位
		if (sKey.length() != 16) {
			return null;
		}
		byte[] raw = sKey.getBytes("ASCII");
		SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
		Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
		IvParameterSpec iv = new IvParameterSpec(sKey.getBytes());
		cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
		byte[] encrypted1 = new Base64Decoder().decode(sSrc);// 先用base64解密
		try {
			byte[] original = cipher.doFinal(encrypted1);
			String originalString = new String(original);
			return originalString;
		} catch (Exception e) {
			System.out.println(e.toString());
			return null;
		}
	} catch (Exception ex) {
		System.out.println(ex.toString());
		return null;
	}
}

Guess you like

Origin blog.csdn.net/qq_15764943/article/details/118099084