šifrování firmwire
#zahrnout
#zahrnout
#zahrnout
#zahrnout
// Zašifruje obsah vstupního souboru `arg1` a zapíše zašifrovaný obsah do výstupního souboru `arg2`.
// Šifrování se provádí pomocí AES-256-CBC s osoleným klíčem odvozeným z přístupové fráze `arg3`.
// Vrátí 1 při úspěchu a 0 při neúspěchu.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
SOUBOR *vstupniSoubor = fopen(arg1, "rb");
if (vstupniSoubor == NULL) {
puts("Nepodařilo se otevřít vstupní soubor");
0 návrat;
}
FILE *outputFile = fopen(arg2, "wb");
if (outputFile == NULL) {
puts("Nepodařilo se vytvořit výstupní soubor");
fclose(vstupniSoubor);
0 návrat;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
unsigned char salt[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Vygenerování náhodné soli.
puts("Nepodařilo se vygenerovat sůl");
fclose(vstupniSoubor);
fclose(výstupníSoubor);
0 návrat;
}
// Zápis magického řetězce "Salted__" a salt do výstupního souboru.
fwrite("Salted__", 1, 8, outputFile);
fwrite(sůl, 1, velikost(sůl), výstupníSoubor);
nepodepsaný klíč[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Odvozte klíč a IV z přístupové fráze a soli pomocí SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Nepodařilo se vygenerovat klíč");
fclose(vstupniSoubor);
fclose(výstupníSoubor);
0 návrat;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, klíč, iv) != 1) {
puts("Inicializace šifrování se nezdařila");
EVP_CIPHER_CTX_free(ctx);
fclose(vstupniSoubor);
fclose(výstupníSoubor);
0 návrat;
}
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(); // Definujte svou funkci zpracování chyb.
// Ukončení nebo vyčištění prostředků.
}
fwrite(outBuf, 1, outLen, outputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Přiměřeně zacházet s chybami.
// Ukončení nebo vyčištění prostředků.
}
fwrite(outBuf, 1, outLen, outputFile);
EVP_CIPHER_CTX_free(ctx);
fclose(vstupniSoubor);
fclose(výstupníSoubor);
návrat 1; // Úspěch.
}
#zahrnout
#zahrnout
#zahrnout
// Zašifruje obsah vstupního souboru `arg1` a zapíše zašifrovaný obsah do výstupního souboru `arg2`.
// Šifrování se provádí pomocí AES-256-CBC s osoleným klíčem odvozeným z přístupové fráze `arg3`.
// Vrátí 1 při úspěchu a 0 při neúspěchu.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
SOUBOR *vstupniSoubor = fopen(arg1, "rb");
if (vstupniSoubor == NULL) {
puts("Nepodařilo se otevřít vstupní soubor");
0 návrat;
}
FILE *outputFile = fopen(arg2, "wb");
if (outputFile == NULL) {
puts("Nepodařilo se vytvořit výstupní soubor");
fclose(vstupniSoubor);
0 návrat;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
unsigned char salt[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Vygenerování náhodné soli.
puts("Nepodařilo se vygenerovat sůl");
fclose(vstupniSoubor);
fclose(výstupníSoubor);
0 návrat;
}
// Zápis magického řetězce "Salted__" a salt do výstupního souboru.
fwrite("Salted__", 1, 8, outputFile);
fwrite(sůl, 1, velikost(sůl), výstupníSoubor);
nepodepsaný klíč[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Odvozte klíč a IV z přístupové fráze a soli pomocí SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Nepodařilo se vygenerovat klíč");
fclose(vstupniSoubor);
fclose(výstupníSoubor);
0 návrat;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, klíč, iv) != 1) {
puts("Inicializace šifrování se nezdařila");
EVP_CIPHER_CTX_free(ctx);
fclose(vstupniSoubor);
fclose(výstupníSoubor);
0 návrat;
}
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(); // Definujte svou funkci zpracování chyb.
// Ukončení nebo vyčištění prostředků.
}
fwrite(outBuf, 1, outLen, outputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Přiměřeně zacházet s chybami.
// Ukončení nebo vyčištění prostředků.
}
fwrite(outBuf, 1, outLen, outputFile);
EVP_CIPHER_CTX_free(ctx);
fclose(vstupniSoubor);
fclose(výstupníSoubor);
návrat 1; // Úspěch.
}