适用于NodeJs和mbedtls的encryption程序

首先,让我首先说我不是一个密码学家,我也不是很擅长编写c代码,所以请问如果这个问题的答案是显而易见的或者回答的话。 我正在开发一个消息程序,不能在目标平台上使用TLS。 因此,我需要find一种方法来使用对称预共享密钥密码(如AES)来encryption每个消息。

我正在寻求一种方法来encryption和解密一个mbedtls程序(如aescrypt2)和另一个nodejs程序之间的数据。 Mbedtls,以前是polarssl,是一个为embedded式设备提供encryption的库。 源代码包含一些示例程序,如aescrypt2,rsaencrypt,ecdsa和crypt_and_hash。

Aescrypt2工作正常,当encryption的数据也使用aescrypt2解密,但我似乎无法使用aescrypt使用nodejs crypto或任何其他程序(包括openssl)解密数据。 例如:

echo 'this is a test message' >test.txt aescrypt 0 test.txt test.out hex:E76B2413958B00E193 aescrypt 1 test.out test.denc hex:E76B2413958B00E193 cat test.denc this is a test message 

用openssl:

 openssl enc -in out.test -out outfile.txt -d -aes256 -k E76B2413958B00E193 bad magic number 

一些样本节点代码,目前不工作

  var crypto = require('crypto'); var AESCrypt = {}; AESCrypt.decrypt = function(cryptkey, iv, encryptdata) { encryptdata = new Buffer(encryptdata, 'base64').toString('binary'); var decipher = crypto.createDecipheriv('aes-256-cbc', cryptkey, iv), decoded = decipher.update(encryptdata, 'binary', 'utf8'); decoded += decipher.final('utf8'); return decoded; } AESCrypt.encrypt = function(cryptkey, iv, cleardata) { var encipher = crypto.createCipheriv('aes-256-cbc', cryptkey, iv), encryptdata = encipher.update(cleardata, 'utf8', 'binary'); encryptdata += encipher.final('binary'); encode_encryptdata = new Buffer(encryptdata, 'binary').toString('base64'); return encode_encryptdata; } var cryptkey = crypto.createHash('sha256').update('Nixnogen').digest(), iv = 'a2xhcgAAAAAAAAAA', buf = "Here is some data for the encrypt", // 32 chars enc = AESCrypt.encrypt(cryptkey, iv, buf); var dec = AESCrypt.decrypt(cryptkey, iv, enc); console.warn("encrypt length: ", enc.length); console.warn("encrypt in Base64:", enc); console.warn("decrypt all: " + dec); 

这会导致每次错误或垃圾文本。 我也尝试过调整各种各样的东西。

我已经尝试了这一百种不同的方式,包括使用-pass pass:password arg无济于事。 使用nodejs,我得到了不好的解密错误,或者在解密时乱七八糟的乱七八糟。 我已经尝试过networking上的许多教程,比如这个 ,以及来自这个线程的build议,以及其他所有我能find的。 我已经读过不同的encryption程序使用不同的标准,所以跨平台/程序/语言的兼容性并不总是得到保证,但我想有人曾经在这个困境之前,并知道一个解决scheme?

我如何使用nodejs解密由aescrypt2(或类似程序)encryption的数据? 我只能使用系统执行调用工作,并让节点执行aescrypt2来解密/encryption数据,这是不理想的,因为它大大减缓了事情的速度。 我打算使用与aescrypt2不同的程序。 唯一的要求是它必须在Linux上运行,不能使用openssl库(因为它们在目标系统上不受支持),由于空间的限制,程序应该小而简单,最重要的是encryption/解密需要与nodejs兼容。 任何帮助将非常感激。

我如何使用nodejs解密由aescrypt2(或类似程序)encryption的数据?

很抱歉地说,但是没有比这更好的答案了:通过完成与aescrypt2解密文件时完全相同的事情。 您已经自己链接到源代码,所以只需在node.js中执行与解密分支中的C相同的步骤即可。

首先,熟悉包含encryption数据的文件的布局 :

  /* * The encrypted file must be structured as follows: * * 00 .. 15 Initialization Vector * 16 .. 31 AES Encrypted Block #1 * .. * N*16 .. (N+1)*16 - 1 AES Encrypted Block #N * (N+1)*16 .. (N+1)*16 + 32 HMAC-SHA-256(ciphertext) */ 

所以你需要从文件中提取IV,encryption的块和HMAC,而不是尝试用openssl来解密整个事情(你的openssl的例子也不使用正确的IV,而是试图从密钥中派生出来提供 – 阅读手册页 )。

接下来,获取关键权利。 用于encryption/解密的实际密钥不是在命令行上提供的密钥,而是使用SHA256在命令行上传递密钥的8192次迭代。

最后,他们使用AES-256-ECB(您的openssl和node.js示例使用CBC!)解密,每隔16个字节, 并将结果与先前的16个字节(IV用于前16个字节)进行XOR解密。

也许还有更多,我只是列出了通过aescrypt2.c代码阅读时看到的最明显的东西。

所以我的build议是:尝试在node.js中编写相同的逻辑,并尝试find各自的mbedtls对应节点的node.jsencryption调用。

我不是一个encryption专家,但我敢打赌,aescrypt实现有太多的步骤,感觉复杂(如生成实际的密钥使用),因为他们知道如何做encryption,只是做正确的方法。