2017-11-06 9 views
0

私はいくつかのCrytoJSの例を見てきましたが、私の解読の仕事はできませんでした。私は鍵(13文字の長さ、それが重要な場合)とiv(Base64のデコード後の長さ16)を解読する必要があります。私は(あなたがそれらを実行する場合、これらは動作しません - キーはもちろん、変更されています:))完璧に動作します。このPHPの例を見つけました:AES-256(CBC) - 不正な形式のUtf-8データを解読することができません

$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"); 

そして今、私は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)); 

に暗号化されたテキストおよび静脈の両方にBase64がエンコードされています。どのようにこれが正確に処理されるのか分かりません。私はCryptoJS解読のいくつかの実装を見てきましたが、いくつかの組み合わせを試みましたが、何も私のために働いていませんでした。

何か助けてください。 :)この

+0

ここで、あなたのJavaScriptコードでは 'iv'を使用していますか?また、 'CryptoJS.enc.Base64.parse'を見てください。 – Blender

+0

@Blender JSコードはPHPコードの直後にあります。はい、私は 'CryptoJS.enc.Base64.parse'を見て、それを使っていましたが、それは私にとってはうまくいかなかったのです。 – dotslash

+0

私はそれがすぐ後であることを知っていますが、あなたはそれをPHPコードのほぼ同等の機能として投稿しています。 JSコードでは、実際には 'iv'変数を使用することはありません。最初に* exact *値が 'mcrypt_decrypt'に渡される方法と、' key'と 'iv'をあなたのJSコードの中からどのように変換するのかを最初に考えてみましょう。今のように、あなたのコードは実際の暗号化キー( 'substr(sha1($ secretKey)、0、32)')を派生しません。 – Blender

答えて

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]です。

+0

Whoa!ありがとうございました!:-) – dotslash

+0

うん、私はこの例で使用されている 'key'、' iv'と 'ciphertext'の値にどうやって到着したのか分かりません。説明していただけますか? :) – dotslash

+0

@ dotslash:私の編集を参照してください、それはより明確にする必要があります。 – Blender

関連する問題