AES 加解密
AES(Advanced Encryption Standard),又称高级加密标准,是一种对称加密算法,也是目前广泛使用的加密技术之一。其主要特点是加密速度快、安全性高、可扩展性好等。
AES 算法采用对称加密的方式,即加密和解密使用相同的密钥进行操作。密钥长度可以是 128、192 或 256 位,其中 128 位密钥被广泛使用,因为它可以提供足够的安全性和高效的加密速度。AES 加密和解密过程中采用分块加密的方式,即将明文分成若干个块,再分别进行加密操作,最后将加密得到的密文合并起来。
对称/分组密码一般分为流加密(如OFB、CFB等)和块加密(如ECB、CBC等)。对于流加密,需要将分组密码转化为流模式工作。对于块加密(或称分组加密),如果要加密超过块大小的数据,就需要涉及填充和链加密模式。
AES 算法具有很多优点,例如快速、安全、可靠等。它可以加密大量数据,而不会因为加密过程中的数据量过大而变得缓慢。此外,AES 算法还支持块大小的自动调整,可以处理不同大小的数据块。
常见的填充模式有以下三种:
-
NoPadding
不进行填充,要求原始加密串大小必须是 128bit 的整数倍 -
PKCS5Padding
将原始数据长度(字节数)填充到8的倍数,填充字节数据是 8 - (x % 8),x是原始数据长度。 -
PKCS7Padding
跟PKCS5Padding的填充方式一样,不同的是,PKCS5Padding只是对8字节的进行填充,PKCS7Padding可以对1~256字节大小的block进行填充。PKCS5Padding是PKCS7Padding的一个子集。
以下使用CBC块加密
抽取 WAS Liberty AES 算法
package pr.iceworld.fernando.spring.cryto;import pr.iceworld.fernando.spring.util.StringUtils;import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;public class AESManager {private static final String ALG = "AES";private static final String AES_CBC = "AES/CBC/PKCS5Padding";private static final String ALG_FACTORY = "PBKDF2WithHmacSHA1";private static final String AES_PREFI = "{aes}";public static String