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