5

Crypto Js (クライアント側) と OpenSSL (サーバー側) で AES-256-CBC を使用してテキストを暗号化しようとしていますが、異なる結果が得られます。これは、サーバー側で暗号化されたテキストをデコードできず、クライアント側でその逆ができない理由を説明しています。

これが私がやっている方法です:

クライアント側 (Crypto JS) - 編集済み

iv = CryptoJS.enc.Base64.parse("kT+uMuPwUk2LH4cFbK0GiA==")

key = CryptoJS.enc.Hex.parse("6476b3f5ec6dcaddb637e9c9654aa687")

encrypted_text = CryptoJS.AES.encrypt("test", key, {mode: CryptoJS.mode.CBC, formatter : Base64Formatter, iv : iv})

encrypted_text => "7Qu7/V7yXHt67wMOV0/1Tg=="

サーバー側 (Rails OpenSSL) - 編集済み

iv = Base64.decode64("kT+uMuPwUk2LH4cFbK0GiA==")

key = "6476b3f5ec6dcaddb637e9c9654aa687"

cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')

cipher.encrypt

cipher.key = key

cipher.iv = iv

text = cipher.update("test") + cipher.final

encrypted_text = Base64.strict_encode64(text)

encrypted_text => "fHhNBuopuuthdq2SFvvgDw=="

誰かが私が間違っていることについて何か考えがありますか? 私はこの時点で困惑しています。

ヘルプは大歓迎です..ありがとう!

ポール

4

2 に答える 2

2

行で:

key = CryptoJS.enc.Hex.parse("abcdefghijklmnopqrstuvwxyz012345")

文字列「abcdefghijklmnopqrstuvwxyz012345」は 16 進数表記ではありません。私はそれから始めます。

于 2012-05-15T05:51:32.467 に答える
2

ドキュメントに基づくと、CryptoJS はキーのサイズに基づいて 128/192/256 を選択するようです。そのキーは、16 進数から 2 進数に解析すると 16 バイトになります。これは、AES-128-CBC を使用してエンコードすることを意味します。したがって、Ruby 側での AES-256-CBC の選択は正しくありません。

さらに、キーはルビー側で 16 進数でデコードされていません。これらの変更により、コードは次のようになります。

iv = Base64.decode64("kT+uMuPwUk2LH4cFbK0GiA==")

key = ["6476b3f5ec6dcaddb637e9c9654aa687"].pack("H*")

cipher = OpenSSL::Cipher::Cipher.new('aes-128-cbc')

cipher.encrypt

cipher.key = key

cipher.iv = iv

text = cipher.update("test") + cipher.final

encrypted_text = Base64.strict_encode64(text)

そして、出力は=> "7Qu7/V7yXHt67wMOV0/1Tg=="です。まさに私たちが期待するものです。

于 2013-07-27T14:51:27.947 に答える