AES 加密算法实现

JAVA 实现

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class AESUtil {
    private static final String DEFAULT_KEY="hj7x89H$yuBI0456";
    private static final String DEFAULT_IV ="NIfb&95GUY86Gfgh";
    /**
     * @Ddescription AES加密
     * @param key 16位秘钥
     * @param iv 向量iv
     * @param plaintext 明文
     * @return 密文
     */
    public static String encrypt(String key, String iv, String plaintext) throws Exception {
        Cipher cipher = getCipher(key,iv,Cipher.ENCRYPT_MODE);
        byte[] bytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
        return Base64.getEncoder().encodeToString(bytes);
    }

    /**
     * @Description AES解密
     * @param key 16位秘钥
     * @param iv 向量iv
     * @param ciphertext 密文
     * @return 明文
     */
    public static String decrypt(String key, String iv, String ciphertext) throws Exception {
        Cipher cipher = getCipher(key,iv,Cipher.DECRYPT_MODE);
        byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(ciphertext));
        return new String(bytes,StandardCharsets.UTF_8);
    }

    private static Cipher getCipher(String key, String iv,int mode) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
        cipher.init(mode, keySpec, ivSpec);
        return cipher;
    }

    public static void main(String[] args) throws Exception {
        String text = "JDK 中是由名为 “SunJCE” 的提供商提供密钥算法的,如果没有指定其他提供商,则会默认使用该提供商的密钥算法。如果要使用特定的算法,而对该算法 Oracle 公司没有提供支持,那么也可以指定其他的提供商。";
        String ciphertext = encrypt(DEFAULT_KEY,DEFAULT_IV,text);
        System.out.println(ciphertext);
        String plaintext = decrypt(DEFAULT_KEY,DEFAULT_IV,ciphertext);
        System.out.println(plaintext);
    }
}

JAVASCRIPT 实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>AES</title>
</head>
<body>
<script src="https://cdn.bootcdn.net/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
<script type="text/javascript">
    // 解密
    function decrypt(text) {
        let decrypted = CryptoJS.AES.decrypt(text, CryptoJS.enc.Utf8.parse(key), {
            iv: CryptoJS.enc.Utf8.parse(iv),
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        return decrypted.toString(CryptoJS.enc.Utf8)
    }

    // 加密
    function encrypt(text) {
        return CryptoJS.AES.encrypt(text, CryptoJS.enc.Utf8.parse(key), {
            iv: CryptoJS.enc.Utf8.parse(iv),
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        }).toString()
    }

    const key = 'hj7x89H$yuBI0456';
    const iv = 'NIfb&95GUY86Gfgh';

    let text = "JDK 中是由名为 “SunJCE” 的提供商提供密钥算法的,如果没有指定其他提供商,则会默认使用该提供商的密钥算法。如果要使用特定的算法,而对该算法 Oracle 公司没有提供支持,那么也可以指定其他的提供商。";
    console.log('解密前明文:',text)

    let ciphertext = encrypt(text);
    console.log('密文:',ciphertext)

    const plaintext = decrypt(ciphertext);
    console.log('解密后明文:',plaintext)
</script>
</body>
</html>
posted @ 2023-04-28 15:26  小小爬虫  阅读(37)  评论(0编辑  收藏  举报