如何在node.js中加密并使用RNCryptor解密

时间:2014-09-04 02:38:42

标签: commoncrypto rncryptor

我无法使用节点加密数据并使用RNCryptor进行解密。我的理解是RNCryptor使用特殊的数据格式?

密码文本生成如下:

var crypto = require('crypto');
var cipher = crypto.createCipher('aes-256-cbc','InmbuvP6Z8');
var text = "123|123123123123123";
var crypted = cipher.update(text,'utf8','base64');
crypted += cipher.final('base64');

我正在这样解密:

[RNDecryptor decryptData:plainText withPassword:password error:&error];

我该怎么做?当我尝试解密时,我得到一个空的NSData并且没有错误。

2 个答案:

答案 0 :(得分:0)

是的,RNCryptor以自己的格式输出加密数据。如果您使用自己的加密代码构建此格式(并使用相同的加密参数),则可以将其传递给JNCryptor进行解密。

对于RNCryptor格式版本3,前34个字节如下:

  • byte [0]是版本(3)。
  • byte [1]定义是使用密码还是密钥(密码为1,密钥为0)。
  • bytes [2-9]携带加密盐。
  • bytes [10-17]带有HMAC盐。
  • bytes [18-33]带有IV。

然后是加密的密文。

然后最后32个字节保存密文的(SHA256)HMAC。

规范在这里:https://github.com/RNCryptor/RNCryptor-Spec/blob/master/RNCryptor-Spec-v3.md

答案 1 :(得分:0)

RNCryptor不仅仅是加密,而是一个完整的安全"堆栈"包括身份验证,密码密钥推导,版本控制和随机iv。由于您的加密只是加密部分,因此它将不兼容。

使用RNCryptor进行加密或更改为简单的解密方法。由于该问题具有commoncrypto标记,并且加密代码看起来可能是Swift(没有语言标记),因此只需考虑在Objective-C中使用Common Crypto进行解密。有关示例代码,请参阅SO answer