2017-01-13 3 views
6

したがって、私はruby上で暗号化と復号化の方法を持っており、うまく動作します。私はthis question (How to decrypt message with CryptoJS AES. I have a working Ruby example)の答えに従いましたが、空の文字列を返しています。CryptoJSはIVとキーでは動作しませんが、Rubyで動作します

Rubyのコード

def load_vars 
     @key = "2e35f242a46d67eeb74aabc37d5e5d05" 
     @algorithm = "aes-128-cbc" 
    end 

    def encryption(data) 
     begin 
      key = @key 
      aes = OpenSSL::Cipher.new(@algorithm) 
      aes.encrypt() 
      aes.key = key 
      iv_value = aes.random_iv 
      aes.iv = iv_value 
      crypt = aes.update(data) + aes.final() 
      crypt_string = (Base64.encode64(iv_value + crypt)) 
      return crypt_string 
     end 
    end 

    def decryption(data) 
     begin 
      key = @key 
      aes = OpenSSL::Cipher.new(@algorithm) 
      iv_value = Base64.decode64(data)[0...16] 
      data_value = Base64.decode64(data)[16..-1] 
      aes.decrypt 
      aes.key = @key 
      aes.iv = iv_value 
      results = aes.update(data_value) + aes.final 
      return results 
     end 
    end 

HTML JSFIDDLE

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core-min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script> 

<script>   
    data = "wlkAKa4ps+Xizx4VIdUSp43yfQvOmt9FNlVTQ1ANsCU=\n"; // The data received from the ruby encryption method 
    key = "2e35f242a46d67eeb74aabc37d5e5d05"; 

    // Decode the base64 data so we can separate iv and crypt text. 
    var rawData = atob(data); 
    var iv = rawData.substring(0,16); 
    var crypttext = rawData.substring(16); 

    // Decrypt... 
    var plaintextArray = CryptoJS.AES.decrypt(
     { ciphertext: CryptoJS.enc.Latin1.parse(crypttext) }, 
     CryptoJS.enc.Hex.parse(key), 
     { iv: CryptoJS.enc.Latin1.parse(iv) } 
    ); 

    console.log(CryptoJS.enc.Latin1.stringify(plaintextArray)); 
</script> 
+1

あなたのJavaScriptコードはリンクの 'data'値で動作するので、正しいです。問題はRubyコードにあります。問題は 'key'パラメータにあると思います。暗号化するときは、直接16進数を渡しますが、デコードされた値を指定する必要があります。 'aes.key = key.scan(/../)を試してみてください。 x.hex} .pack( 'c *') '(リンクから抜粋)。私はRubyを知らないので、もっと具体的にはできません。 – pedrofb

+0

暗号化されたデータを生成した元の(平文)データを提供できるかどうか: 'data =" wlkAKa4ps + Xizx4VIdUSp43yfQvOmt9FNlVTQ1ANsCU = \ n ";' 元のデータを持っていれば、それを生成するencryptメソッドを実装することができ、そこからデバッグします。 – peiiion

+1

@SuthanBala、HEXキーをバイトに変換するために用意したコードで試しましたか? – pedrofb

答えて

4

問題は、Rubyは鍵がバイナリ形式ではなく、六角であることを期待していることです。だから、これを実行する必要があります。

:私にとって

#!/usr/bin/env ruby 

require 'openssl' 
require 'base64' 

data = "When in Rome do as the Romans do" 
key = "2e35f242a46d67eeb74aabc37d5e5d05" 
aes = OpenSSL::Cipher.new("aes-128-cbc") 
aes.encrypt() 
aes.key = key.scan(/../).collect{|x| x.hex}.pack("c*") 
iv_value = aes.random_iv 
aes.iv = iv_value 
crypt = aes.update(data) + aes.final() 
crypt_string = (Base64.encode64(iv_value + crypt)) 
puts crypt_string 

は、私はあなたのHTMLファイルに(任意のコードを変更せずに)、私は元のメッセージを取り戻すことを置く場合

mdnLCY6MdwEONY1AxR/vjVKMssB+yrPsz4QMjfl6fDXxv68E0EUxtAqa4VUo 
fTkjq2Hqyd48UV3dyWmEbwXw5Q== 

を印刷しています

<!DOCTYPE html> 
<html> 
<head> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core-min.js"></script> 
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script> 

<script>   
data = "mdnLCY6MdwEONY1AxR/vjVKMssB+yrPsz4QMjfl6fDXxv68E0EUxtAqa4VUo\nfTkjq2Hqyd48UV3dyWmEbwXw5Q==\n"; 
key = "2e35f242a46d67eeb74aabc37d5e5d05"; 

var rawData = atob(data); 
var iv = rawData.substring(0,16); 
var crypttext = rawData.substring(16); 

// Decrypt... 
var plaintextArray = CryptoJS.AES.decrypt(
    { ciphertext: CryptoJS.enc.Latin1.parse(crypttext) }, 
    CryptoJS.enc.Hex.parse(key), 
    { iv: CryptoJS.enc.Latin1.parse(iv) } 
); 

console.log(plaintextArray); 
console.log(CryptoJS.enc.Latin1.stringify(plaintextArray)); 
</script> 
</head> 
<body> 
</body> 
</html> 

あなたのRubyコードでは、不器用なサイファーテキストが生成されるという問題があります。キーを修正して再暗号化すると、JSが動作するはずです。

+1

これは私のコメントと同じではありませんか? – pedrofb

+0

JavaScriptで動作します。ありがとうございます。しかし、これは前に働いていたルビの解読メソッドを破ります。 –

+0

Rubyの解読を修正するには、そこに鍵を設定する方法を変更する必要があります(暗号化の側にも一致します)。 –

関連する問題