Javascript 在客户端使用forgejs加密数据,并使用ruby解密

Javascript 在客户端使用forgejs加密数据,并使用ruby解密,javascript,ruby,encryption,aes,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(i

对于给定的项目,我希望使用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
对键和IV过度使用字符串值,已尝试:

var key = forge.random.getBytesSync(32);
var iv = forge.random.getBytesSync(32);
然后给他们每个人打个电话。在将它们传递给Encryptor.decrypt之前,在ruby端使用Base64.decode64,但仍然没有成功


知道我哪里出了问题吗?

我设法让它工作起来了。因为我只使用一个密钥来加密一个值,所以我也使用了这个密钥作为IV&Salt。如果您使用密钥加密多个值,则不建议这样做。然后需要生成适当的salt和iv值

此外,gen键值是一种非常糟糕的方法,因为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;
})();
rawKey是从getKey返回的值。value属性是要加密的字符串的名称。我将rawkey用于iv&salt值,并以与ruby中相同的方式生成一个键。然后使用forge对字符串值进行加密


如果我使用base64,用ruby对其进行解码,并将相同的rawKey值传递给key、salt和iv的encryptor gem,它就工作了。

您复制粘贴了上面实际的encryptor.encrypt行了吗?第二个:键应该是:iv,不是吗?iv值太长了,你应该使用16字节的iv,而不是一个包含32个字符的。