2

json経由で暗号化されたデータをクライアントに送信し、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 の URL です。

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

4

2 に答える 2

3

owlstead に感謝します。ここ数日ですでにわかっていました。

このクエリを crypto-js スレッドで提起しました。問題は、crypto-js 復号化で IV を指定していなかったことです。Ruby で IV を指定しないと、IV として \0 が追加されます。

以下は作業コードです

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 リード開発者) によって昨日提供されました。

于 2013-08-08T02:34:11.483 に答える
-1

応答に のような改行がある場合は、次のよう"\r\n"に使用できます。

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

それらを削除します。

于 2017-08-26T15:35:56.907 に答える