2013-08-05 58 views
1

我米試圖通過JSON發送加密數據到客戶端和客戶端解密使用cryptojs使用解密cryptojs不工作

我ROR代碼

def getkey 

    aes = OpenSSL::Cipher::Cipher.new('AES-128-CBC') 
    aes.encrypt 
    key = aes.random_key 

    session[:key] = key 

    render :json => {:mkey => Base64.encode64(key).gsub(/\n/, '')} 
end 

def getdata 
    js = "SOME DATA" 

    aes = OpenSSL::Cipher::Cipher.new('AES-128-CBC') 
    aes.encrypt 
    aes.key = session[:key] 
    encrypted = aes.update(js) + aes.final 

    encrypted = Base64.encode64(encrypted).gsub(/\n/, '') 

    render :json => {:data => encrypted} 
end 

我的JavaScript代碼

var key = btoa(BASE64_ENCODED_KEY); 
$http({method: 'GET', url: '/appi/getdata/', params: {SOME_PARAMS}}) 
.success(function(data, status, headers, config) { 
    var dat = btoa(data.data); 
    var decrypted = CryptoJS.AES.decrypt(dat, key); 
    console.log(decrypted.toString(CryptoJS.enc.Utf8)); 
}); 

獲取javascript錯誤「錯誤:格式錯誤的UTF-8數據。」在鉻

下面是簡化的jsfiddle一個網址上面的查詢

http://jsfiddle.net/7DRdK/1/

回答

2

感謝owlstead,我已經想通了這一點它過去幾天。

我提出在加密JS線程該查詢,問題是我並沒有指定在加密解密JS IV,如紅寶石,如果你不指定任何IV它增加了\ 0作爲IV。

下面是工作代碼

var encrypted = {}; 
encrypted.ciphertext = CryptoJS.enc.Base64.parse(data.data); 

var decrypted = CryptoJS.AES.decrypt(encrypted, CryptoJS.enc.Base64.parse(BASE64_ENCODED_KEY), 
      { iv: CryptoJS.enc.Hex.parse('00000000000000000000000000000000') });; 
console.log(decrypted.toString(CryptoJS.enc.Utf8)); 

這個工作對我來說,這溶液對我的Jeff.Mott.OR(當前cryptojs鉛DEV)

+2

decrypted.toString(CryptoJS.enc.Utf8)爲我工作。我正在使用decrypted.toString()。反正感謝.... –

+0

@sudesh這似乎是一個problem..Think CryptoJs着加密JSON objects..Canü請幫助me..I我得到了同樣的問題 – Catmandu

+0

@sudesh我只是on Rails開發環境得到。 。 – Catmandu

0

提供昨天如果響應有一個換行符如"\r\n",你可以用這個:

s = s.replace(/[\r\n]/g, ''); 

刪除它們。