HarmonyOS 鸿蒙Next中带有iv向量的CryptoJS.Blowfish解密问题

HarmonyOS 鸿蒙Next中带有iv向量的CryptoJS.Blowfish解密问题

const data: string = "be6d321f68174dcf"
const key: string = "ax+b=c@)!^)(!%1+1=0"
const iv: string = "00000000"

const keyWords = CryptoJS.enc.Utf8.parse(key);
const ivWords = CryptoJS.enc.Utf8.parse(iv);
const params = CryptoJS.lib.CipherParams.create({
  ciphertext: CryptoJS.enc.Hex.parse(data) // 这里应该是WordArray,不是字符串
});

const decrypted = CryptoJS.Blowfish.decrypt(
  params, // 第一个参数:CipherParams对象
  keyWords, // 第二个参数:密钥WordArray
  {
    // 第三个参数:配置选项
    iv: ivWords,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.NoPadding
  }
)
/*   const decrypted = CryptoJS.Blowfish.decrypt(
     CryptoJS.enc.Hex.parse(data).toString(CryptoJS.enc.Utf8),
     keyWords,
     {
       iv: ivWords,
       mode: CryptoJS.mode.CBC,
       padding: CryptoJS.pad.NoPadding
     }
   )试过结果一样*/
const c = decrypted.toString(CryptoJS.enc.Utf8)
let base64Helper = new util.Base64Helper()
let textDecoder = util.TextDecoder.create('utf-8', {
  fatal: false,
  ignoreBOM: true
});
try {
  let resultString = textDecoder.decodeToString(
    base64Helper.decodeSync(c),
    { stream: false }
  )
  console.log("解码:" + resultString)
} catch (e) {
  console.log("解码出错" + e)
}

现在无法正确解析,是不是用错了。be6d321f68174dcf 对应的结果是123的。我是把之前android的代码进行重新编码的。下面是android代码

public static String desEncrypt(String data, String key) {

    String ivString = "00000000";
    byte[] iv = ivString.getBytes();

    try {
        byte[] encryp = parseHexStr2Byte(data);
        System.out.println("结果c:" +new String(encryp));
        Cipher cipher = Cipher.getInstance("Blowfish/CBC/NoPadding");
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "Blowfish");
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
        byte[] original = cipher.doFinal(encryp);
        return new String(original);
    } catch (Exception e) {
        // TODO: handle exception
    }
    return null;
}
String a = BlowfishCoder.desEncrypt("be6d321f68174dcf", BlowfishCoder.KEY);

更多关于HarmonyOS 鸿蒙Next中带有iv向量的CryptoJS.Blowfish解密问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,CryptoJS.Blowfish解密需使用CryptoJS.mode.CBC模式并正确配置iv向量。示例代码:

const decrypted = CryptoJS.Blowfish.decrypt(
  ciphertext,
  key,
  { 
    mode: CryptoJS.mode.CBC,
    iv: iv,
    padding: CryptoJS.pad.Pkcs7
  }
);

确保iv与加密时使用的向量一致,且长度符合Blowfish算法要求(8字节)。解密结果需通过CryptoJS.enc.Utf8转换为字符串。

更多关于HarmonyOS 鸿蒙Next中带有iv向量的CryptoJS.Blowfish解密问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中使用CryptoJS进行Blowfish解密时,需要注意数据解析和编码的一致性。根据您提供的代码,问题可能出现在以下几个方面:

  1. 数据解析方式:在Android代码中,parseHexStr2Byte方法将十六进制字符串转换为字节数组,而CryptoJS中直接使用CryptoJS.enc.Hex.parse(data)生成WordArray。请确保两者处理方式一致,避免编码差异。

  2. 密钥和IV处理:Android中使用key.getBytes()ivString.getBytes()默认使用平台编码(通常是UTF-8),但需确认与CryptoJS的CryptoJS.enc.Utf8.parse完全匹配。如果密钥或IV包含非ASCII字符,编码不一致可能导致解密失败。

  3. 解密输出处理:Android代码直接返回解密后的字节数组转换为字符串,而CryptoJS中先输出为UTF-8字符串,再进行Base64解码。这一步可能是多余的,因为Blowfish解密后应直接得到原始数据(例如"123"),无需Base64解码。建议直接输出decrypted.toString(CryptoJS.enc.Utf8)查看结果。

  4. 填充模式:双方均使用NoPadding,但需确保原始数据在加密时也未添加填充,否则解密会失败。

尝试简化CryptoJS代码,直接输出解密后的UTF-8字符串,避免额外的Base64解码步骤:

const decrypted = CryptoJS.Blowfish.decrypt(
  CryptoJS.enc.Hex.parse(data),
  keyWords,
  { iv: ivWords, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.NoPadding }
);
console.log("直接解密结果:", decrypted.toString(CryptoJS.enc.Utf8));

如果输出仍不正确,检查密钥和IV的字节表示是否与Android端完全一致。

回到顶部