2017-01-13 21 views
6

'da çalışıyor. Bu yüzden, ruby ​​üzerinde şifreleme ve şifre çözme yöntemleri var ve iyi bir yakut çalışıyorlar. Cevabı this question (How to decrypt message with CryptoJS AES. I have a working Ruby example)'dan takip ettim, ancak boş bir dizgeye dönüyor.CryptoJS, IV ve anahtar ile çalışmıyor, ancak Ruby

Yakut Kod

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 kodunuz, bağlantının 'data' değeriyle çalıştığından doğrudur, bu nedenle sorun Ruby kodundadır. Bence problem "anahtar" parametresinde. Şifreleme yaparken doğrudan onaltılı bir şekilde geçersiniz, ancak kodu çözülmüş değeri sağlamanız gerekir. Aes.key = key.scan (/../) ile deneyebilir misiniz? {| X | x.hex} .pack ('c *') '(bağlantınızdan çıkarılmış). Korkarım ki daha spesifik olamıyorum çünkü ben bilmiyorum Ruby – pedrofb

+0

Şifrelenmiş veriyi oluşturan orijinal (düz metin) veri sağlayabilir misiniz: veri = "wlkAKa4ps + Xizx4VIdUSp43yfQvOmt9FNlVTQ1ANsCU = \ n"; '? Orijinal verilere sahip olarak, onu üreten ve buradan şifreleyici yöntemi uygulayabiliriz. – peiiion

+1

@SuthanBala, HEX anahtarını baytlara dönüştürmek için sağladığım kodu denediniz mi? – pedrofb

cevap

4

sorun Yakut anahtar ikili biçime değil, altıgen olmasını bekler olmasıdır. Yani bunu yapmak gerekir:

: Benim için

#!/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 

Ben HTML dosyası içine (herhangi bir kodu değiştirmeden), ben orijinal iletiyi geri almak koyarsanız

mdnLCY6MdwEONY1AxR/vjVKMssB+yrPsz4QMjfl6fDXxv68E0EUxtAqa4VUo 
fTkjq2Hqyd48UV3dyWmEbwXw5Q== 

yazdırır o

<!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> 

Sorun, Ruby kodunuzun anlamsız bir metin yazımı oluşturmasıdır. Anahtarı düzeltin ve şifreleyin ve JS çalışmaya başlamalıdır.

+1

Bu, yorumumla aynı değil mi? – pedrofb

+0

Bu, JavaScript’de şimdi çalışıyor, teşekkürler. Fakat bu, daha önce çalışan yakutta şifre çözme yöntemini kırar. –

+0

Ruby şifre çözme işlemini düzeltmek için, anahtarı nasıl ayarlayacağınızı da değiştirmeniz gerekir (böylece şifreleme tarafı eşleşir). –

İlgili konular