无法解密 AES-256 (CBC) - 格式错误的 Utf-8 数据

Unable to decrypt AES-256 (CBC) - Malformed Utf-8 data

我已经看过几个 CrytoJS 示例,但无法为我解密。我需要解码一些东西,其中提供了一个密钥(长度为 13 个字符,以防万一它很重要)和 iv(Base64 解码后长度为 16 个)。我发现这个 PHP 示例完美运行(如果您 运行 它们将无法运行 - 当然,密钥已更改 :)):

$encrypted = urldecode('6x5Mex1DqqFK0Z9F%2F6W1FNB55UM%2Baoyjw6NgTwDDmHpVytJXNyQsA3J8jh3R4qt5MbKITzIORGLtgmfknUNLaBhBaBO%2F8GiFPT8A6wVgtQ6YOXkJHG8S9VKYgrN9MCeT0e8mbWMNfkkJ0ips4K87ZNzC6Lb5dbT1%2BRMw%2BpmCP7M8%2FwiBMdJZ%2FdINblg%2FapHtaqv6TUBRukB%2FEJWgGFB86h5fJ8VNZKssWtx35gLo6IHai6GTQpyS%2FNeq5ZbX%2BJwcnCKOzudHsdAyxk%2BQYltupFNBXBzxxW%2Fiixtew7uNtRJQfy2epcx0SOqRGKQfJrRReFWvldJWSKz%2Bv0aRMdZWCVRHovcwPLdXNWSK%2Brs7G0LCnjji4RyqzU9DTy%2BijA1Xx3xVmOxXysCkvqXNg2P0LJ0O0qLJF9lfQb%2FrrPH3h3lB0a7737CTzQh5kuqK%2FNabfV8qLNyV6cJ5oQWMfXw4LRxDIeK9Me8Fnb2K44uC39Q%3D');

$iv = urldecode('MkQ4NUFGNkVBNjIwMEY5OQ%3D%3D');

$secretKey = "ABCDEFGHIJKL";

// decrypt the body... 
$decrypted = trim(
    mcrypt_decrypt(MCRYPT_RIJNDAEL_128,
        substr(sha1($secretKey), 0, 32),
        base64_decode($encrypted),
        MCRYPT_MODE_CBC, 
        base64_decode($iv)
    ), "[=10=]..");

print("Decrypted: $decrypted");

现在我正尝试在 CryptoJS 中做类似的事情,但不断收到错误 Malformed Utf-8 data:

var encrypted = decodeURIComponent('6x5Mex1DqqFK0Z9F%2F6W1FNB55UM%2Baoyjw6NgTwDDmHpVytJXNyQsA3J8jh3R4qt5MbKITzIORGLtgmfknUNLaBhBaBO%2F8GiFPT8A6wVgtQ6YOXkJHG8S9VKYgrN9MCeT0e8mbWMNfkkJ0ips4K87ZNzC6Lb5dbT1%2BRMw%2BpmCP7M8%2FwiBMdJZ%2FdINblg%2FapHtaqv6TUBRukB%2FEJWgGFB86h5fJ8VNZKssWtx35gLo6IHai6GTQpyS%2FNeq5ZbX%2BJwcnCKOzudHsdAyxk%2BQYltupFNBXBzxxW%2Fiixtew7uNtRJQfy2epcx0SOqRGKQfJrRReFWvldJWSKz%2Bv0aRMdZWCVRHovcwPLdXNWSK%2Brs7G0LCnjji4RyqzU9DTy%2BijA1Xx3xVmOxXysCkvqXNg2P0LJ0O0qLJF9lfQb%2FrrPH3h3lB0a7737CTzQh5kuqK%2FNabfV8qLNyV6cJ5oQWMfXw4LRxDIeK9Me8Fnb2K44uC39Q%3D');
var iv = decodeURIComponent('MkQ4NUFGNkVBNjIwMEY5OQ%3D%3D');


var encrypted = CryptoJS.enc.Base64.parse(encrypted);
var ive = CryptoJS.enc.Base64.parse(iv);

var secretOne = "CLICKBANKINFS";
var secretTwo = CryptoJS.SHA1(secretOne);
var secretThree = secretTwo.toString().substring(0,32);

var decrypted = CryptoJS.AES.decrypt(encrypted, secretThree, 
    { 
        iv: ive,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    }
);

console.log(decrypted.toString(CryptoJS.enc.Utf8));

密文和iv都是Base64编码的。我不确定如何准确处理。我已经看到了 CryptoJS 解密的几种实现,并尝试了几种组合,但对我来说没有任何效果。

有什么帮助吗? :)

改变这个:

var secretThree = secretTwo.toString().substring(0, 32));

var decrypted = CryptoJS.AES.decrypt(encrypted, secretThree, 

收件人:

var secretThree = CryptoJS.enc.Utf8.parse(secretTwo.toString().substring(0, 32)));

var decrypted = CryptoJS.AES.decrypt({ciphertext: encrypted}, secretThree, 
  1. 第一个参数必须是对象 base64 编码的JavaScript 字符串。仅传递 encrypted 会使 decrypt 调用静默失败。您可以执行我上面的操作,也可以从您的代码中删除以下行,将密文保留为 base64 编码的 JavaScript 字符串:

    var encrypted = CryptoJS.enc.Base64.parse(encrypted);
    
  2. JavaScript 通常对字节数组有非常奇怪的支持,因此一切都需要 CryptoJS 包装器才能正常工作。甚至 secretThree,完全是 ASCII [0-9a-f].