κρυπτογράφηση του firmwire
#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω
// Κρυπτογραφεί το περιεχόμενο του αρχείου εισόδου «arg1» και εγγράφει το κρυπτογραφημένο περιεχόμενο στο αρχείο εξόδου «arg2».
// Η κρυπτογράφηση εκτελείται χρησιμοποιώντας το AES-256-CBC με αλατισμένο κλειδί που προέρχεται από τη φράση πρόσβασης «arg3».
// Επιστρέφει 1 στην επιτυχία και 0 στην αποτυχία.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
FILE *inputFile = fopen(arg1, "rb");
if (inputFile == NULL) {
puts("Αποτυχία ανοίγματος αρχείου εισόδου");
0 επιστρέψει?
}
FILE *outputFile = fopen(arg2, "wb");
if (outputFile == NULL) {
puts("Αποτυχία δημιουργίας αρχείου εξόδου");
fclose(inputFile);
0 επιστρέψει?
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
ανυπόγραφο αλάτι άνθρακα[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Δημιουργήστε ένα τυχαίο αλάτι.
puts("Αποτυχία δημιουργίας αλατιού");
fclose(inputFile);
fclose(outputFile);
0 επιστρέψει?
}
// Εγγραφή της μαγικής συμβολοσειράς "Salted__" και του salt στο αρχείο εξόδου.
fwrite("Salted__", 1, 8, outputFile);
fwrite(salt, 1, sizeof(salt), outputFile);
ανυπόγραφο κλειδί χαρακτήρων[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Εξάγετε το κλειδί και το IV από τη φράση πρόσβασης και salt χρησιμοποιώντας SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Αποτυχία δημιουργίας κλειδιού");
fclose(inputFile);
fclose(outputFile);
0 επιστρέψει?
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, κλειδί, iv) != 1) {
puts("Αποτυχία προετοιμασίας κρυπτογράφησης");
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose(outputFile);
0 επιστρέψει?
}
ανυπόγραφο char inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inLen, outLen;
ενώ ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
handleErrors(); // Καθορίστε τη συνάρτηση χειρισμού σφαλμάτων.
// Έξοδος ή εκκαθάριση πόρων.
}
fwrite(outBuf, 1, outLen, outputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Χειριστείτε σωστά τα σφάλματα.
// Έξοδος ή εκκαθάριση πόρων.
}
fwrite(outBuf, 1, outLen, outputFile);
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose(outputFile);
επιστροφή 1; // Επιτυχία.
}
#περιλαμβάνω
#περιλαμβάνω
#περιλαμβάνω
// Κρυπτογραφεί το περιεχόμενο του αρχείου εισόδου «arg1» και εγγράφει το κρυπτογραφημένο περιεχόμενο στο αρχείο εξόδου «arg2».
// Η κρυπτογράφηση εκτελείται χρησιμοποιώντας το AES-256-CBC με αλατισμένο κλειδί που προέρχεται από τη φράση πρόσβασης «arg3».
// Επιστρέφει 1 στην επιτυχία και 0 στην αποτυχία.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
FILE *inputFile = fopen(arg1, "rb");
if (inputFile == NULL) {
puts("Αποτυχία ανοίγματος αρχείου εισόδου");
0 επιστρέψει?
}
FILE *outputFile = fopen(arg2, "wb");
if (outputFile == NULL) {
puts("Αποτυχία δημιουργίας αρχείου εξόδου");
fclose(inputFile);
0 επιστρέψει?
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
ανυπόγραφο αλάτι άνθρακα[8];
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Δημιουργήστε ένα τυχαίο αλάτι.
puts("Αποτυχία δημιουργίας αλατιού");
fclose(inputFile);
fclose(outputFile);
0 επιστρέψει?
}
// Εγγραφή της μαγικής συμβολοσειράς "Salted__" και του salt στο αρχείο εξόδου.
fwrite("Salted__", 1, 8, outputFile);
fwrite(salt, 1, sizeof(salt), outputFile);
ανυπόγραφο κλειδί χαρακτήρων[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH];
// Εξάγετε το κλειδί και το IV από τη φράση πρόσβασης και salt χρησιμοποιώντας SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Αποτυχία δημιουργίας κλειδιού");
fclose(inputFile);
fclose(outputFile);
0 επιστρέψει?
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, κλειδί, iv) != 1) {
puts("Αποτυχία προετοιμασίας κρυπτογράφησης");
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose(outputFile);
0 επιστρέψει?
}
ανυπόγραφο char inBuf[1024], outBuf[1024 + EVP_MAX_BLOCK_LENGTH];
int inLen, outLen;
ενώ ((inLen = fread(inBuf, 1, sizeof(inBuf), inputFile)) > 0) {
if (EVP_EncryptUpdate(ctx, outBuf, &outLen, inBuf, inLen) != 1) {
handleErrors(); // Καθορίστε τη συνάρτηση χειρισμού σφαλμάτων.
// Έξοδος ή εκκαθάριση πόρων.
}
fwrite(outBuf, 1, outLen, outputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Χειριστείτε σωστά τα σφάλματα.
// Έξοδος ή εκκαθάριση πόρων.
}
fwrite(outBuf, 1, outLen, outputFile);
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose(outputFile);
επιστροφή 1; // Επιτυχία.
}