使用客户端上的forgejs加密数据,并使用ruby进行解密

时间:2015-02-27 19:29:53

标签: javascript ruby encryption aes

对于给定的项目,我希望用AES 256加密一段数据,然后RSA加密密钥。我一直在ruby中使用Forge和Encryptor gem,我似乎无法获得匹配的加密值:

var key = 'strengthstrengthstrengthstrength';
var iv =  'cakecakecakecakecakecakecakecake';
var cipher = forge.aes.createEncryptionCipher(key, 'CBC');
cipher.start(iv);
cipher.update(forge.util.createBuffer("some string"));
cipher.finish();

var encrypted = cipher.output;
console.log(btoa(encrypted.data)); // outputs: CjLmWObDO2Dlwa5tJnRBRw==

然后在IRB:

Encryptor.encrypt 'some string', :key => 'strengthstrengthstrengthstrength', :key => 'cakecakecakecakecakecakecakecake'
Base64.encode64 _
# outputs: C9Gtk9YfciVMJEsbhZrQTw==\n

过度使用Key& amp;的字符串值四,尝试过:

var key = forge.random.getBytesSync(32);
var iv = forge.random.getBytesSync(32);

然后对每个人进行btoa()调用。使用红宝石侧的Base64.decode64,然后将它们传递给Encryptor.decrypt,但仍然没有运气。

知道我哪里出错了?

1 个答案:

答案 0 :(得分:0)

我设法让它发挥作用。由于我只使用一个密钥来加密一个值,所以我只使用了密钥作为IV&盐也是。如果您使用密钥加密多个值,则不推荐。然后,您需要生成适当的盐和水。 iv值。

此类密钥值也是一种非常糟糕的方式,因为Math.random不安全。只是没时间做正确的事情,但对于这种情况可以正常工作。

var Encryption = (function () {

  var api = {
    getKey: function () {
      var possible = "ABCDEFabcdef0123456789";
      var key = '';
      for (var i = 0; i < 32; i++) {
        key += possible.charAt(Math.floor(Math.random() * possible.length));
      }
      return key;
    },

    encryptPII: function (rawKey, value) {
      var salt = rawKey;
      var iv = rawKey;
      var key = forge.pkcs5.pbkdf2(rawKey, salt, 2000, 32);
      var cipher = forge.aes.createEncryptionCipher(key, 'CBC');
      cipher.start(iv);
      cipher.update(forge.util.createBuffer(value));
      cipher.finish();

      return btoa(cipher.output.data);
    }
  };
  return api;
})();

rawKeygetKey()返回的值。 value属性是要加密的字符串。我使用rawkey进行iv&amp; amp; salt值,以与ruby中的Encryptor gem相同的方式生成密钥。使用伪造然后加密字符串值。

如果我使用base64,在ruby中解码它,并将相同的rawKey值传递给加密器gem以获取key,salt和iv,它可以正常工作。