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

时间:2017-11-06 02:18:59

标签: cryptojs

我已经浏览了几个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解密的实现,并尝试了几种组合,但没有任何方法可以帮助我。

请帮忙吗? :)

1 个答案:

答案 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, 
  1. 第一个参数必须是一个对象一个base64编码的JavaScript字符串。仅传递encrypted会使decrypt调用无声地失败。您可以执行上面的操作,也可以从中删除以下行,将密文保留为base64编码的JavaScript字符串:

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