【问题标题】:decrypt using cryptojs not working使用cryptojs解密不起作用
【发布时间】:2013-08-05 09:47:46
【问题描述】:

我正在尝试通过 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 的网址

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

【问题讨论】:

    标签: javascript ruby ruby-on-rails-3 cryptography cryptojs


    【解决方案1】:

    谢谢 owlstead,前几天我已经想通了。

    我在 crypto-js 线程中提出了这个查询,问题是我没有在 crypto-js 解密中指定 IV,就像在 Ruby 中一样,如果你没有指定任何 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 领导开发)提供给我的

    【讨论】:

    • decrypted.toString(CryptoJS.enc.Utf8) 对我有用。我正在使用decrypted.toString()。无论如何谢谢....
    • @sudesh 这似乎是一个问题..认为 CryptoJs 无法加密 JSON 对象..你能帮我..我遇到同样的问题
    • @sudesh 我应该把它贴在哪里..它很大..你能进来聊天
    • var data = angular.fromJson(strData); var 加密 = {}; encrypted.ciphertext = CryptoJS.enc.Base64.parse(data.data); var 解密 = CryptoJS.AES.decrypt(加密,CryptoJS.enc.Base64.parse(pki),{ iv: CryptoJS.enc.Base64.parse(data.pki) }); var mainData = decrypted.toString(CryptoJS.enc.Utf8);返回 angular.fromJson(mainData); }].concat($http.defaults.transformResponse), params: default_params, headers: headers }).success(function (data) { var endApi = new Date(); callback(data); });
    • @Sudesh 感谢您的回复..我们了解了这个问题并致力于解决方案..问题是 chrome 特定的,因为页面正在重新加载,因为指定的图像路径之一不正确.实际上我不知道这与您处理的代码相同..您是否处理过整个应用程序
    【解决方案2】:

    如果响应中有"\r\n"这样的换行符,你可以使用这个:

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

    删除它们。

    【讨论】:

      猜你喜欢
      • 2012-09-16
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-10-05
      相关资源
      最近更新 更多