cifrado de firmwire

#incluir
#incluir
#incluye
#incluir

// Cifra el contenido del archivo de entrada `arg1` y escribe el contenido cifrado en el archivo de salida `arg2`.
// El cifrado se realiza utilizando AES-256-CBC con una clave salada derivada de la frase de contraseña `arg3`.
// Devuelve 1 en caso de éxito y 0 en caso de error.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
ARCHIVO *inputFile = fopen(arg1, "rb");
si (archivo de entrada == NULL) {
puts("Error al abrir el archivo de entrada");
0 regresar;
}

ARCHIVO *archivosalida = fopen(arg2, "wb");
si (archivodesalida == NULL) {
puts("Error al crear el archivo de salida");
fclose(archivo de entrada);
0 regresar;
}

const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
sal carbonizada sin firmar[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Genera una sal aleatoria.
puts("Error al generar sal");
fclose(archivo de entrada);
fclose(archivodesalida);
0 regresar;
}

// Escribiendo la cadena mágica "Salted__" y la sal en el archivo de salida.
fwrite("Salado__", 1, 8, archivo de salida);
fwrite(sal, 1, tamaño de(sal), archivo de salida);

clave de carácter sin firmar[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Deriva la clave y el IV de la frase de contraseña y salt usando SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Error al generar la clave");
fclose(archivo de entrada);
fclose(archivodesalida);
0 regresar;
}

EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, clave, iv) != 1) {
puts("Error en la inicialización del cifrado");
EVP_CIPHER_CTX_free(ctx);
fclose(archivo de entrada);
fclose(archivodesalida);
0 regresar;
}

carácter sin firmar inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int dentroLen, fueraLen;
while ((inLen = fread(inBuf, 1, tamaño de(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
manejarErrores(); // Defina su función de manejo de errores.
// Salir o limpiar recursos.
}
fwrite(outBuf, 1, outLen, salidaFile);
}

si (EVP_EncryptFinal_ex(ctx, outBuf y outLen)! = 1) {
manejarErrores(); // Maneja los errores apropiadamente.
// Salir o limpiar recursos.
}
fwrite(outBuf, 1, outLen, salidaFile);

EVP_CIPHER_CTX_free(ctx);
fclose(archivo de entrada);
fclose(archivodesalida);

devolver 1; // Éxito.
}

Formulario de contacto