java php js AES加密解密相互通用工具类例子

知兮丶青 工具类 · 加密 · 解密 · 函数
阅读(959) 2021-11-19
java php js AES加密解密相互通用工具类例子
java php js AES加密解密相互通用工具类例子

有空之余整理了一份java、php和javascript的AES互相通用的加密解密工具类。AES算法加密和解密有几种加密模式,以下例子使用128位密钥长度CBC模式演示。AES属于对称加密算法,明文的加密和解密需要使用同一个密钥。如有不足之处请指出。



java AES加密解密示例

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class AES {
    //字符编码
    private static final String CHARSET = "UTF-8";
    //指定AES加密算法
    private static final String ALGORITHM = "AES";
    //指定AES加密算法模式
    private static final String ALGORITHM_CIPHER = "AES/CBC/PKCS5Padding";
    //指定密钥16位(打死也不要告诉别人)-- 记得修改16位 --
    private static final String KEY = "1234567890123456";
    //指定密钥偏移量16位 -- 记得修改16位 --
    private static final String IV  = "1234561234567890";

    /**
     * AES加密操作
     * @param plaintext 明文
     * @return 密文
     */
    public static String encrypt(String plaintext) {
        try {
            SecretKeySpec secret = new SecretKeySpec(KEY.getBytes(CHARSET), ALGORITHM);
            Cipher cipher = Cipher.getInstance(ALGORITHM_CIPHER);
            IvParameterSpec iv = new IvParameterSpec(IV.getBytes(CHARSET));
            cipher.init(Cipher.ENCRYPT_MODE, secret, iv);
            byte[] encrypted = cipher.doFinal(plaintext.getBytes(CHARSET));
            return new BASE64Encoder().encode(encrypted);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * AES解密操作
     * @param ciphertext 密文
     * @return 明文
     */
    public static String decrypt(String ciphertext) {
        try {
            SecretKeySpec secret = new SecretKeySpec(KEY.getBytes(CHARSET), ALGORITHM);
            Cipher cipher = Cipher.getInstance(ALGORITHM_CIPHER);
            IvParameterSpec iv = new IvParameterSpec(IV.getBytes(CHARSET));
            cipher.init(Cipher.DECRYPT_MODE, secret, iv);
            byte[] decrypted = cipher.doFinal(new BASE64Decoder().decodeBuffer(ciphertext));
            return new String(decrypted);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        //使用演示
        String content = "weizhixi";
        String s = AES.encrypt(content);
        System.out.println(s);
        System.out.println(decrypt(s));
        //输出:
        //ZyAtnyBgCGxzbYTW0AzcXw==
        //weizhixi
    }

}



php AES加密解密示例

class AES{
    //指定AES加密算法
    const CIPHER = "AES-128-CBC";
    //密钥16位(打死也不要告诉别人)-- 记得修改16位 --
    const AES_KEY = "1234567890123456";
    //密钥偏移量16位 -- 记得修改16位 --
    const AES_IV = "1234561234567890";

    /**
     * 加密
     * @param string $plaintext 明文
     * @return string 密文
     */
    public function encrypt($plaintext){
        return openssl_encrypt($plaintext, self::CIPHER, self::AES_KEY, 0, self::AES_IV);
    }

    /**
     * 解密
     * @param string $ciphertext 密文
     * @return bool|string 密文
     */
    public function decrypt($ciphertext){
        return openssl_decrypt($ciphertext, self::CIPHER, self::AES_KEY, 0, self::AES_IV);
    }

}


//使用演示
//include 'AES.php';
$aes = new AES();
$ciphertext = $aes->encrypt('weizhixi');
var_dump($ciphertext);
var_dump($aes->decrypt($ciphertext));
//输出:
//ZyAtnyBgCGxzbYTW0AzcXw==
//weizhixi



js AES加密解密示例

首先必须引入:crypto-js.js

//密钥16位(打死也不要告诉别人)-- 记得修改16位 --
var key = "1234567890123456";
//密钥偏移量16位 -- 记得修改16位 --
var iv = '1234561234567890';
//加密方法
function encrypt($plaintext) {
    var encrypted = CryptoJS.AES.encrypt($plaintext, CryptoJS.enc.Utf8.parse(key), {
        iv: CryptoJS.enc.Utf8.parse(iv),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}
//解密方法
function decrypt(ciphertext){
    var decrypt = CryptoJS.AES.decrypt(ciphertext, CryptoJS.enc.Utf8.parse(key), {
        iv: CryptoJS.enc.Utf8.parse(iv),
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return decrypt.toString(CryptoJS.enc.Utf8);
}


//使用演示
var ciphertext = encrypt('weizhixi');
console.info(ciphertext);
console.info(decrypt(ciphertext));
//输出:
//ZyAtnyBgCGxzbYTW0AzcXw==
//weizhixi


js中使用AES需要用到的js加密插件:
https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/crypto-js.js



zip icon
crypto-js.zip db3c6585430a094874e5a622f3773d43

已下载:247

原创文章,转载请注明出处:https://www.weizhixi.com/article/116.html