我已经浏览了几个CrytoJS示例,但无法为我解密。我需要解码一些密钥(长度为13个字符,以防万一重要)和iv(Base64解码后长度为16个)的东西。我已经提供了。我发现这个PHP示例运行正常(如果你运行它们将无法工作 - 键已被更改,当然:)):
cell.width - 8 - 32 - 8 - 8
现在我正在尝试在CryptoJS中做类似的事情,但不断收到错误$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)
), "\0..\32");
print("Decrypted: $decrypted");
:
Malformed Utf-8 data
加密文本和iv都是Base64编码的。我不确定如何处理这个问题。我已经看过几个CryptoJS解密的实现,并尝试了几种组合,但没有任何方法可以帮助我。
请帮忙吗? :)
答案 0 :(得分:1)
改变这个:
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]
。