有后端的解码方法,我前端用crypto-js应该怎么配置参数?

后端的解码方法是这样的,我在前端用crypto-js应该怎么设置参数?

// 解密模式/补码方式,固定值,不允许修改
String CIPHER_MODEL = "/CBC/NoPadding";
// 解密算法,固定值,不允许修改
String keyAlgorithm = "AES";
// 密钥,从医院获取
String key = "M4pe91TNP39MvGmDNNgq7w==";
// 待解密内容
    String content = "a5KxFJpwuQlH5EOZeIBZteWKCflCykxfzj5ZIUtlOYI=";
// 将密钥进行base64解密
    byte[] keys = Base64.getDecoder().decode(key);
    // 转base64字节码
    byte[] contentBytes = Base64.getDecoder().decode(content);
    //  按照 算法/模式/补码方式  构建Cipher对象
Cipher cipher = Cipher.getInstance(keyAlgorithm + CIPHER_MODEL);
// 生成密匙
 SecretKeySpec keyspec = new SecretKeySpec(key, keyAlgorithm);
// 构建偏移量,使用密钥作为偏移量
 IvParameterSpec ivspec = new IvParameterSpec(key);
// 用密钥和一组算法参数初始化此 Cipher
// Cipher.ENCRYPT_MODE用于将 Cipher 初始化为解密模式的常量
 cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);
// 将密文进行解密,得到解密后数据
byte[] result= cipher.doFinal(content);
     // decodeContent 为最终解密后的内容
     String decodeContent = new String(result, Charset.forName("utf-8")).trim();

下面是我写的,但我知道有些参数是不对的,有懂的吗?

import CryptoJS from 'crypto-js'
import { Base64 } from 'js-base64';

//加密
function encryption(data,iv,key){
    let keyOk=CryptoJS.enc.Utf8.parse(key)
    let ivOk=CryptoJS.enc.Utf8.parse(iv)
    let encryptedData=CryptoJS.AES.encrypt(data,keyOk,{
        iv:ivOk,
        mode:CryptoJS.mode.CBC,
        padding:CryptoJS.pad.Pkcs7
    }).toString()
    return encryptedData;
}
//解密 
function decryption(data,iv,key){
    console.log(data,iv,key)
    let keyOk=CryptoJS.enc.Utf8.parse(key)
    let ivOk=CryptoJS.enc.Utf8.parse(iv)
    let dataOk=data
    let decryptedData=CryptoJS.AES.decrypt(dataOk,keyOk,{
        iv:ivOk,
        mode:CryptoJS.mode.CBC,
        padding:CryptoJS.pad.Pkcs7
    }).toString(CryptoJS.enc.Utf8)
    return decryptedData
}
export {
    encryption,
    decryption
};
阅读 598
avatarAI BotBETA

你的前端代码看起来已经很接近了,但是有几个关键的差异需要注意。

首先,你的后端代码是使用Java的JCE (Java Cryptography Extension) 和 Cipher 类进行加密和解密的。而在前端,你使用的是CryptoJS,这是一个JavaScript库,它对AES加密提供了一个纯JS实现。这两者在内部工作方式和一些细节上有很大的差异。

你的后端代码中,密钥和初始化向量(IV)都是Base64解码的,而在CryptoJS中,你不需要手动进行这个解码步骤,因为CryptoJS会自动处理。

其次,你在后端代码中直接将密钥作为偏移量,而在CryptoJS中,你需要创建一个专门用于CBC模式的密钥对象。

下面是一个修正后的版本:

import CryptoJS from 'crypto-js'

// 密钥和初始化向量
const key = "M4pe91TNP39MvGmDNNgq7w=="; // 这个密钥应该是16进制字符串,而不是Base64编码的字符串
const iv = "a5KxFJpwuQlH5EOZeIBZteWKCflCykxfzj5ZIUtlOYI="; // 这个IV应该是16进制字符串,而不是Base64编码的字符串

// 将密钥和IV转换为16进制字节数组
const keyBytes = CryptoJS.enc.Base64.parse(key);
const ivBytes = CryptoJS.enc.Base64.parse(iv);

// 加密函数
function encryption(data){
    let encrypted = CryptoJS.AES.encrypt(data, keyBytes, {
        iv: ivBytes,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.toString();
}

// 解密函数
function decryption(data){
    let decrypted = CryptoJS.AES.decrypt(data, keyBytes, {
        iv: ivBytes,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    return decrypted.toString(CryptoJS.enc.Utf8);
}

请注意,这里我们假设你的密钥和IV是Base64编码的字符串,这是因为你的后端代码是这样的。如果它们实际上是16进制字符串,那么你需要将它们转换为CryptoJS可以理解的格式。如果你的密钥和IV实际上是Base64编码的,那么你应该使用CryptoJS.enc.Base64.parse来解析它们。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进