import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

/**
 * AES 是双向对称加密算法
 * AES : Advanced Encryption Standard 即高级加密标准
 * 该算法由比利时密码学家Joan Daemen 和 Vincent Rijmen设计,结合两者的名字,又称Rijndael加密算法
 * 是美国联邦政府再用的一种对称加密标准,用来替代原先的DES算法
 *
 * AES 算法作为新一代数据加密标准,汇聚了强安全性、高新能、高效率、易用和灵活等优点,设计有三个密匙长度
 * (128,192,256位),比DES算法加密强度更高,更为安全。
 */
public class TestAES {

    public static String getKeyAES() throws Exception{
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(128);
        SecretKey key = keyGen.generateKey();
        String base64Str = Base64Utils.byte2base64(key.getEncoded());
        return base64Str;
    }

    public static SecretKey loadKeyAES(String base64Key) throws Exception {
        byte[] bytes = Base64Utils.base642byte(base64Key);
        SecretKey key = new SecretKeySpec(bytes, "AES");
        return key;
    }

    public static byte[] encryptAES(byte[] source, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] bytes = cipher.doFinal(source);
        return bytes;
    }

    public static byte[] decryptAES(byte[] source, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] bytes = cipher.doFinal(source);
        return bytes;
    }

    public static void main(String[] args) throws Exception {
        String sourceStr = "Hi, this is some source String.";
        String keyStr = getKeyAES();
        SecretKey aesKey = loadKeyAES(keyStr);
        byte[] beEncry = encryptAES(sourceStr.getBytes("utf8"),aesKey);
        byte[] beDecry = decryptAES(beEncry,aesKey);
        System.out.printf("source String: %s\n" +
                "keyStr: %s\n" +
                "beEncry:%s\n" +
                "beDecry:%s\n" +
                "result:%s",sourceStr,keyStr, Base64Utils.byte2base64(beEncry), Base64Utils.byte2base64(beDecry),new String(beDecry,"utf8"));
    }

}

程序输出:

对称加密AES算法Java实现_第1张图片