如何在node.js中加密并使用RNCryptor解密
问题描述:
我在使用节点加密数据和使用RNCryptor解密时遇到了问题。我的理解是RNCryptor使用特殊的数据格式?如何在node.js中加密并使用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,没有错误。
答
是的,RNCryptor以自己的格式输出加密数据。如果您在自己的加密代码中构建此格式(并使用相同的加密参数),则可以将其传递给JNCryptor进行解密。
对于RNCryptor格式版本3中,第一34个字节如下:
- 字节[0]是版本(3)。
- byte [1]定义是否使用密码或密钥(1代表密码,0代表密钥)。
- 字节[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
答
RNCryptor不仅仅是加密,更是一个完整的安全“堆栈”,包括身份验证,密码密钥导出,版本控制和随机IV。由于您的加密只是加密部分,它将不兼容。
使用RNCryptor进行加密或更改为简单的解密方法。由于该问题有一个commoncrypto标签,加密代码看起来像是Swift(没有语言标签),只需考虑在Objective-C中使用Common Crypto进行解密即可。示例代码见SO answer。