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
在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解密时,需要注意数据解析和编码的一致性。根据您提供的代码,问题可能出现在以下几个方面:
-
数据解析方式:在Android代码中,
parseHexStr2Byte
方法将十六进制字符串转换为字节数组,而CryptoJS中直接使用CryptoJS.enc.Hex.parse(data)
生成WordArray。请确保两者处理方式一致,避免编码差异。 -
密钥和IV处理:Android中使用
key.getBytes()
和ivString.getBytes()
默认使用平台编码(通常是UTF-8),但需确认与CryptoJS的CryptoJS.enc.Utf8.parse
完全匹配。如果密钥或IV包含非ASCII字符,编码不一致可能导致解密失败。 -
解密输出处理:Android代码直接返回解密后的字节数组转换为字符串,而CryptoJS中先输出为UTF-8字符串,再进行Base64解码。这一步可能是多余的,因为Blowfish解密后应直接得到原始数据(例如"123"),无需Base64解码。建议直接输出
decrypted.toString(CryptoJS.enc.Utf8)
查看结果。 -
填充模式:双方均使用
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端完全一致。