gpt4 book ai didi

c - 与 NodeJs 和 mbedtls 一起工作的加密程序

转载 作者:搜寻专家 更新时间:2023-10-31 22:49:41 26 4
gpt4 key购买 nike

首先,让我首先声明我不是密码学家,我也不是很擅长编写 C 代码,所以如果这个问题的答案很明显或已经回答,请原谅。我正在开发消息程序,无法在目标平台上使用 TLS。因此,我需要找到一种使用对称预共享 key 密码(如 AES)来加密每条消息的方法。

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

Aescrypt2当生成的加密数据也使用 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

一些当前不起作用的示例 Node 代码

    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 参数都无济于事。使用 nodejs,我要么得到错误的解密错误,要么在解密时出现乱码。我尝试按照网上的许多教程进行操作,例如 this一,来自this thread的建议,以及我能找到的所有其他东西。我读到过不同的加密程序使用不同的标准,因此并不总是保证跨平台/程序/语言的兼容性,但我想有人曾经陷入过这种困境并且知道解决方案?

我如何使用 nodejs 解密由 aescrypt2(或类似程序)加密的数据?我只能使用系统 exec 调用并让 Node 执行 aescrypt2 来解密/加密数据来使其工作,这并不理想,因为它会大大减慢速度。我愿意使用与 aescrypt2 不同的程序。唯一的要求是必须在Linux上运行,不能使用openssl libs(因为它们在目标系统上不支持),程序应该小而简单,由于空间限制,最重要的是,加密/解密需要与nodejs兼容。任何帮助将不胜感激。

最佳答案

How would I, using nodejs, decrypt data encrypted by aescrypt2 (or a program like it)?

很遗憾,没有比解密文件时 aescrypt2 所做的完全相同的事情更好的答案了。您已经自己链接到源代码,因此只需在 node.js 中执行与在解密分支中的 C 中执行的相同步骤即可。

首先,熟悉layout of the file containing the encrypted data :

    /*
* 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、加密 block 和 HMAC,而不是像您尝试使用 openssl 那样尝试解密整个文件(您的 openssl 示例也没有使用正确的 IV,而是尝试导出它从提供的 key - 阅读 man page )。

接下来,拿到 key 。 actual key used加密/解密不是在命令行上提供的,而是使用 SHA256 使用命令行上传递的 key 对 IV 进行 8192 次散列迭代。

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

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

所以我的建议是:尝试在 node.js 中编写相同的逻辑,并尝试为相应的 mbedtls 对应项找到 node.js 加密调用。

我不是加密专家,但我敢打赌,aescrypt 实现有太多让人感觉很复杂的步骤(比如生成实际使用的 key ),因为他们知道如何进行加密并且只是以正确的方式进行。

关于c - 与 NodeJs 和 mbedtls 一起工作的加密程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37369020/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com