固件加密

#包括
#包括
#包括
#包括

// 加密输入文件 `arg1` 的内容并将加密内容写入输出文件 `arg2`。
// 使用 AES-256-CBC 以及从密码“arg3”派生的加盐密钥执行加密。
// 成功则返回 1,失败则返回 0。
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
FILE *inputFile = fopen(arg1, "rb");
如果(输入文件== NULL){
put("打开输入文件失败");
0返回;
}

FILE *outputFile = fopen(arg2, "wb");
如果(输出文件== NULL){
puts("创建输出文件失败");
fclose(输入文件);
0返回;
}

const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
无符号炭盐[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // 生成随机盐。
put("生成盐失败");
fclose(输入文件);
fclose(输出文件);
0返回;
}

// 将“Salted__”魔术字符串和盐写入输出文件。
fwrite("加盐__", 1, 8, 输出文件);
fwrite(盐, 1, sizeof(盐), 输出文件);

无符号字符密钥[EVP_MAX_KEY_LENGTH],iv[EVP_MAX_IV_LENGTH];
// 使用 SHA-256 从密码和盐中派生密钥和 IV。
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
put("生成密钥失败");
fclose(输入文件);
fclose(输出文件);
0返回;
}

EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, key, iv) != 1) {
put("加密初始化失败");
EVP_CIPHER_CTX_free(ctx);
fclose(输入文件);
fclose(输出文件);
0返回;
}

无符号字符 inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inLen、outLen;
while ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
处理错误(); // 定义错误处理函数。
// 退出或清理资源。
}
fwrite(outBuf, 1, outLen, 输出文件);
}

if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
处理错误(); // 适当地处理错误。
// 退出或清理资源。
}
fwrite(outBuf, 1, outLen, 输出文件);

EVP_CIPHER_CTX_free(ctx);
fclose(输入文件);
fclose(输出文件);

返回1; // 成功。
}

联系表格