js前端CryptoJS AES加密,php后台解密

神坑CryptoJS AES加密
前端
引及CryptoJS文件

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>


前台js使用CryptoJS AES加密

//AES加密
encryptByAES(string) {
    const ckey = CryptoJS.enc.Utf8.parse("1234567890123456")
    const iv = CryptoJS.enc.Utf8.parse('1234567812345678');
    var encrypted = CryptoJS.AES.encrypt(str, ckey, {
        iv: iv,
        padding: CryptoJS.pad.Pkcs7,
        mode: CryptoJS.mode.CBC
    });
    return encrypted.toString(); 此方式返回base64格式密文
    //return encrypted.ciphertext.toString(); // 返回hex格式的密文
}

 
在需要加密的地方调用方法

aesEncrypt("需要加密的文本")


后端php
后端php代码

$iv = '1234567812345678';
$method = 'AES-128-CBC'; 
$key = '1234567890123456';
$options = 0;
#解密
$data2 = openssl_decrypt("需要解密的文本", $method, $key, $options, $iv);
 
#加密
openssl_encrypt('wang2016.', 'AES-128-CBC', $key,0, $iv);


重点来了!!!
CryptoJS.enc.Utf8.parse("1234567890123456"),前端需要转成utf8编码,不然会自动加盐,每次生成的密文都会不一样,导致后端解密失败。
密钥KEY:AES标准规定区块长度只有一个值,固定为128Bit,对应的字节为16位。AES算法规定密钥长度只有三个值,128Bit、192Bit、256Bit,对应的字节为16位、24位和32位,其中密钥KEY不能公开传输,用于加密解密数据。
CryptoJS.enc.Utf8.parse("1234567890123456"),注意秘钥的位数,最多是跟密码要求长度一样,如16位、24位和32位,不然会自动补齐,一样会导致后端解密失败。
CryptoJS.enc.Utf8.parse('1234567812345678'),前端需要转成utf8编码,否则会跟后端会解密失败;
初始化向量IV:该字段可以公开,用于将加密随机化。同样的明文被多次加密也会产生不同的密文,避免了较慢的重新产生密钥的过程,初始化向量与密钥相比有不同的安全性需求,因此IV通常无须保密。然而在大多数情况中,不应当在使用同一密钥的情况下两次使用同一个IV,一般推荐初始化向量IV为16位的随机值。
密钥和初始化向量:确保JavaScript和PHP中使用的是相同的密钥和初始化向量。密钥长度应为16、24或32字节(对应AES-128、AES-192、AES-256)。初始化向量(IV)长度也必须是16字节。
 

前端使用Vue和CryptoJSAES CBC(Cipher Block Chaining)加密,通常涉及以下几个步骤: 1. **加密** - 使用`CryptoJS.AES.encrypt()`函数,传入明文(待加密的数据)、密钥(Key,用于加密解密的同一条字符串)和IV(初始化向量,每次加密都要变化保持安全)。 - 示例代码: ```javascript const key = 'your_secret_key'; const iv = CryptoJS.lib.WordArray.random(16); // 16字节(128位) const plaintext = 'your_message'; // 明文 const ciphertext = CryptoJS.AES.cbcEncrypt(plaintext, key, { iv }); ``` 2. **Base64编码** - 为了跨平台传输,通常将密文和IV转换成Base64格式发送给后端。 3. **后端解密** - 后端Java需要使用相应的库,比如Bouncy Castle或Java Cryptography Extension (JCE),解码Base64后的密文和IV。 - 解密代码示例: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import java.util.Base64; // 首先添加BouncyCastleProvider Security.addProvider(new BouncyCastleProvider()); byte[] base64Ciphertext = "..." // 前端传来的Base64编码的密文 String base64Iv = "..." // IV Base64编码 byte[] decodedCiphertext = Base64.getDecoder().decode(base64Ciphertext); byte[] decodedIv = Base64.getDecoder().decode(base64Iv); SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES"); IvParameterSpec ivParameterSpec = new IvParameterSpec(decodedIv); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "BC"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] decryptedText = cipher.doFinal(decodedCiphertext); ``` 确保在两端使用的加密解密配置(如密钥长度、填充模式等)都是一致的。如果问题仍然存在,检查编码、传递过程中是否有丢失或乱序的情况,或者尝试排除其他潜在的网络问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值