versleutelen van Firmwire
#erbij betrekken
#erbij betrekken
# omvat
#erbij betrekken
// Codeert de inhoud van het invoerbestand `arg1` en schrijft de gecodeerde inhoud naar het uitvoerbestand `arg2`.
// De codering wordt uitgevoerd met behulp van AES-256-CBC met een gezouten sleutel afgeleid van de wachtwoordzin `arg3`.
// Retourneert 1 bij succes en 0 bij mislukking.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
BESTAND *inputFile = fopen(arg1, "rb");
if (invoerbestand == NULL) {
puts("Kan het invoerbestand niet openen");
0 terug;
}
BESTAND *outputFile = fopen(arg2, "wb");
if (uitvoerbestand == NULL) {
puts("Kan geen uitvoerbestand maken");
fclose(invoerbestand);
0 terug;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
niet-ondertekend char-zout [8];
if (RAND_bytes(salt, sizeof(salt)) != 1) {// Genereer een willekeurige salt.
puts("Kan geen zout genereren");
fclose(invoerbestand);
fclose(uitvoerbestand);
0 terug;
}
// Schrijven van de magische string "Salted__" en de salt naar het uitvoerbestand.
fwrite("Gezouten__", 1, 8, outputFile);
fwrite(salt, 1, groottevan(salt), outputFile);
niet-ondertekende tekensleutel[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Leid de sleutel en IV af van de wachtwoordzin en het zout met behulp van SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (niet-ondertekende char*)arg3, strlen(arg3), 1, sleutel, iv)) {
puts("Het genereren van de sleutel is mislukt");
fclose(invoerbestand);
fclose(uitvoerbestand);
0 terug;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, sleutel, iv) != 1) {
puts("Initialisatie van de codering is mislukt");
EVP_CIPHER_CTX_gratis(ctx);
fclose(invoerbestand);
fclose(uitvoerbestand);
0 terug;
}
niet-ondertekende char inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inLen, uitLen;
while ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
handleErrors(); // Definieer uw foutafhandelingsfunctie.
// Bronnen afsluiten of opruimen.
}
fwrite(outBuf, 1, outLen, outputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Ga op de juiste manier om met fouten.
// Bronnen afsluiten of opruimen.
}
fwrite(outBuf, 1, outLen, outputFile);
EVP_CIPHER_CTX_gratis(ctx);
fclose(invoerbestand);
fclose(uitvoerbestand);
retour 1; // Succes.
}
#erbij betrekken
# omvat
#erbij betrekken
// Codeert de inhoud van het invoerbestand `arg1` en schrijft de gecodeerde inhoud naar het uitvoerbestand `arg2`.
// De codering wordt uitgevoerd met behulp van AES-256-CBC met een gezouten sleutel afgeleid van de wachtwoordzin `arg3`.
// Retourneert 1 bij succes en 0 bij mislukking.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
BESTAND *inputFile = fopen(arg1, "rb");
if (invoerbestand == NULL) {
puts("Kan het invoerbestand niet openen");
0 terug;
}
BESTAND *outputFile = fopen(arg2, "wb");
if (uitvoerbestand == NULL) {
puts("Kan geen uitvoerbestand maken");
fclose(invoerbestand);
0 terug;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
niet-ondertekend char-zout [8];
if (RAND_bytes(salt, sizeof(salt)) != 1) {// Genereer een willekeurige salt.
puts("Kan geen zout genereren");
fclose(invoerbestand);
fclose(uitvoerbestand);
0 terug;
}
// Schrijven van de magische string "Salted__" en de salt naar het uitvoerbestand.
fwrite("Gezouten__", 1, 8, outputFile);
fwrite(salt, 1, groottevan(salt), outputFile);
niet-ondertekende tekensleutel[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Leid de sleutel en IV af van de wachtwoordzin en het zout met behulp van SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (niet-ondertekende char*)arg3, strlen(arg3), 1, sleutel, iv)) {
puts("Het genereren van de sleutel is mislukt");
fclose(invoerbestand);
fclose(uitvoerbestand);
0 terug;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, sleutel, iv) != 1) {
puts("Initialisatie van de codering is mislukt");
EVP_CIPHER_CTX_gratis(ctx);
fclose(invoerbestand);
fclose(uitvoerbestand);
0 terug;
}
niet-ondertekende char inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inLen, uitLen;
while ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
handleErrors(); // Definieer uw foutafhandelingsfunctie.
// Bronnen afsluiten of opruimen.
}
fwrite(outBuf, 1, outLen, outputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Ga op de juiste manier om met fouten.
// Bronnen afsluiten of opruimen.
}
fwrite(outBuf, 1, outLen, outputFile);
EVP_CIPHER_CTX_gratis(ctx);
fclose(invoerbestand);
fclose(uitvoerbestand);
retour 1; // Succes.
}