无法解密 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,
第一个参数必须是对象或 base64 编码的JavaScript 字符串。仅传递 encrypted
会使 decrypt
调用静默失败。您可以执行我上面的操作,也可以从您的代码中删除以下行,将密文保留为 base64 编码的 JavaScript 字符串:
var encrypted = CryptoJS.enc.Base64.parse(encrypted);
JavaScript 通常对字节数组有非常奇怪的支持,因此一切都需要 CryptoJS 包装器才能正常工作。甚至 secretThree
,完全是 ASCII [0-9a-f]
.
我已经看过几个 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,
第一个参数必须是对象或 base64 编码的JavaScript 字符串。仅传递
encrypted
会使decrypt
调用静默失败。您可以执行我上面的操作,也可以从您的代码中删除以下行,将密文保留为 base64 编码的 JavaScript 字符串:var encrypted = CryptoJS.enc.Base64.parse(encrypted);
JavaScript 通常对字节数组有非常奇怪的支持,因此一切都需要 CryptoJS 包装器才能正常工作。甚至
secretThree
,完全是 ASCII[0-9a-f]
.