Verschlüsselung von Firmwire
#enthalten
#enthalten
#einschließen
#enthalten
// Verschlüsselt den Inhalt der Eingabedatei „arg1“ und schreibt den verschlüsselten Inhalt in die Ausgabedatei „arg2“.
// Die Verschlüsselung erfolgt mittels AES-256-CBC mit einem gesalzenen Schlüssel, der von der Passphrase „arg3“ abgeleitet ist.
// Gibt 1 bei Erfolg und 0 bei Fehler zurück.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
DATEI *inputFile = fopen(arg1, "rb");
if (inputFile == NULL) {
puts("Eingabedatei konnte nicht geöffnet werden");
Rückkehr 0;
}
DATEI *outputFile = fopen(arg2, "wb");
if (outputFile == NULL) {
puts("Ausgabedatei konnte nicht erstellt werden");
fclose(inputFile);
Rückkehr 0;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
unsigniertes Kohlesalz[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Einen zufälligen Salt generieren.
puts("Salz konnte nicht generiert werden");
fclose(inputFile);
fclose(outputFile);
Rückkehr 0;
}
// Den magischen String „Salted__“ und das Salt in die Ausgabedatei schreiben.
fwrite("Salted__", 1, 8, OutputFile);
fwrite(Salz, 1, sizeof(Salz), Ausgabedatei);
unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Schlüssel und IV mithilfe von SHA-256 aus der Passphrase und dem Salt ableiten.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Schlüssel konnte nicht generiert werden");
fclose(inputFile);
fclose(outputFile);
Rückkehr 0;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, key, iv) != 1) {
puts("Verschlüsselungsinitialisierung fehlgeschlagen");
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose(outputFile);
Rückkehr 0;
}
unsigned char 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) {
handleErrors(); // Definieren Sie Ihre Fehlerbehandlungsfunktion.
// Ressourcen beenden oder bereinigen.
}
fwrite(outBuf, 1, outLen, OutputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Fehler angemessen behandeln.
// Ressourcen beenden oder bereinigen.
}
fwrite(outBuf, 1, outLen, OutputFile);
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose(outputFile);
Rückgabe 1; // Erfolg.
}
#enthalten
#einschließen
#enthalten
// Verschlüsselt den Inhalt der Eingabedatei „arg1“ und schreibt den verschlüsselten Inhalt in die Ausgabedatei „arg2“.
// Die Verschlüsselung erfolgt mittels AES-256-CBC mit einem gesalzenen Schlüssel, der von der Passphrase „arg3“ abgeleitet ist.
// Gibt 1 bei Erfolg und 0 bei Fehler zurück.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
DATEI *inputFile = fopen(arg1, "rb");
if (inputFile == NULL) {
puts("Eingabedatei konnte nicht geöffnet werden");
Rückkehr 0;
}
DATEI *outputFile = fopen(arg2, "wb");
if (outputFile == NULL) {
puts("Ausgabedatei konnte nicht erstellt werden");
fclose(inputFile);
Rückkehr 0;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
unsigniertes Kohlesalz[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Einen zufälligen Salt generieren.
puts("Salz konnte nicht generiert werden");
fclose(inputFile);
fclose(outputFile);
Rückkehr 0;
}
// Den magischen String „Salted__“ und das Salt in die Ausgabedatei schreiben.
fwrite("Salted__", 1, 8, OutputFile);
fwrite(Salz, 1, sizeof(Salz), Ausgabedatei);
unsigned char key[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Schlüssel und IV mithilfe von SHA-256 aus der Passphrase und dem Salt ableiten.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Schlüssel konnte nicht generiert werden");
fclose(inputFile);
fclose(outputFile);
Rückkehr 0;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, key, iv) != 1) {
puts("Verschlüsselungsinitialisierung fehlgeschlagen");
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose(outputFile);
Rückkehr 0;
}
unsigned char 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) {
handleErrors(); // Definieren Sie Ihre Fehlerbehandlungsfunktion.
// Ressourcen beenden oder bereinigen.
}
fwrite(outBuf, 1, outLen, OutputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Fehler angemessen behandeln.
// Ressourcen beenden oder bereinigen.
}
fwrite(outBuf, 1, outLen, OutputFile);
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose(outputFile);
Rückgabe 1; // Erfolg.
}