4

我在使用节点加密数据和使用 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 并且没有错误。

4

2 回答 2

0

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

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

于 2016-02-23T16:04:08.867 回答
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

于 2016-02-23T14:25:06.147 回答