chiffrer le fil ferme
#inclure
#inclure
#inclut
#comprendre
// Chiffre le contenu du fichier d'entrée `arg1` et écrit le contenu crypté dans le fichier de sortie `arg2`.
// Le cryptage est effectué à l'aide d'AES-256-CBC avec une clé salée dérivée de la phrase secrète « arg3 ».
// Renvoie 1 en cas de succès et 0 en cas d'échec.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
FICHIER *inputFile = fopen(arg1, "rb");
si (inputFile == NULL) {
puts("Échec de l'ouverture du fichier d'entrée");
0 revenir;
}
FICHIER *outputFile = fopen(arg2, "wb");
si (fichiersortie == NULL) {
puts("Échec de la création du fichier de sortie");
fclose(inputFile);
0 revenir;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
sel de charbon non signé[8] ;
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Génère un sel aléatoire.
puts("Échec de la génération du sel");
fclose(inputFile);
fclose (fichier de sortie);
0 revenir;
}
// Écriture de la chaîne magique "Salted__" et du sel dans le fichier de sortie.
fwrite("Salted__", 1, 8, fichierde sortie);
fwrite (sel, 1, taille de (sel), fichier de sortie);
clé de caractère non signée[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH] ;
// Dérivez la clé et l'IV de la phrase secrète et du sel en utilisant SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Échec de la génération de la clé");
fclose(inputFile);
fclose (fichier de sortie);
0 revenir;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, clé, iv) != 1) {
puts("Échec de l'initialisation du chiffrement");
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose (fichier de sortie);
0 revenir;
}
caractère non signé 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(); // Définissez votre fonction de gestion des erreurs.
// Quitte ou nettoie les ressources.
}
fwrite(outBuf, 1, outLen, outputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Gère les erreurs de manière appropriée.
// Quitte ou nettoie les ressources.
}
fwrite(outBuf, 1, outLen, outputFile);
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose (fichier de sortie);
renvoyer 1 ; // Succès.
}
#inclure
#inclut
#comprendre
// Chiffre le contenu du fichier d'entrée `arg1` et écrit le contenu crypté dans le fichier de sortie `arg2`.
// Le cryptage est effectué à l'aide d'AES-256-CBC avec une clé salée dérivée de la phrase secrète « arg3 ».
// Renvoie 1 en cas de succès et 0 en cas d'échec.
int32_t saltedEncrypt(char* arg1, char* arg2, char* arg3) {
FICHIER *inputFile = fopen(arg1, "rb");
si (inputFile == NULL) {
puts("Échec de l'ouverture du fichier d'entrée");
0 revenir;
}
FICHIER *outputFile = fopen(arg2, "wb");
si (fichiersortie == NULL) {
puts("Échec de la création du fichier de sortie");
fclose(inputFile);
0 revenir;
}
const EVP_CIPHER *cipherType = EVP_aes_256_cbc();
sel de charbon non signé[8] ;
if (RAND_bytes(salt, sizeof(salt)) != 1) { // Génère un sel aléatoire.
puts("Échec de la génération du sel");
fclose(inputFile);
fclose (fichier de sortie);
0 revenir;
}
// Écriture de la chaîne magique "Salted__" et du sel dans le fichier de sortie.
fwrite("Salted__", 1, 8, fichierde sortie);
fwrite (sel, 1, taille de (sel), fichier de sortie);
clé de caractère non signée[EVP_MAX_KEY_LENGTH], iv[EVP_MAX_IV_LENGTH] ;
// Dérivez la clé et l'IV de la phrase secrète et du sel en utilisant SHA-256.
if (!EVP_BytesToKey(cipherType, EVP_sha256(), salt, (unsigned char*)arg3, strlen(arg3), 1, key, iv)) {
puts("Échec de la génération de la clé");
fclose(inputFile);
fclose (fichier de sortie);
0 revenir;
}
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
if (ctx == NULL || EVP_EncryptInit_ex(ctx, cipherType, NULL, clé, iv) != 1) {
puts("Échec de l'initialisation du chiffrement");
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose (fichier de sortie);
0 revenir;
}
caractère non signé 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(); // Définissez votre fonction de gestion des erreurs.
// Quitte ou nettoie les ressources.
}
fwrite(outBuf, 1, outLen, outputFile);
}
if (EVP_EncryptFinal_ex(ctx, outBuf, &outLen) != 1) {
handleErrors(); // Gère les erreurs de manière appropriée.
// Quitte ou nettoie les ressources.
}
fwrite(outBuf, 1, outLen, outputFile);
EVP_CIPHER_CTX_free(ctx);
fclose(inputFile);
fclose (fichier de sortie);
renvoyer 1 ; // Succès.
}