Accueil > > > CHIFFREMENT AES UTILISANT LES API WINDOWS (CSP)
CHIFFREMENT AES UTILISANT LES API WINDOWS (CSP)
Information sur la source
Description
Un petit exemple démontrant l'utilisation des fonctions cryptographiques intégrés à Windows, en utilisant les API fournies par Microsoft. L'exemple génère une clef AES 128 bits, la stocke dans un fichier, chiffre ensuite un autre fichier avec cette clef, puis effectue l'opération inverse. L'avantage de cette méthode comparée à une implémentation brute de l'algorithme AES est que les fonctions cryptographiques fournies par microsoft sont certifiées FIPS 140-1 niveau 1. Attention, l'AES ne fonctionne pas à priori sous Windows 2000 et NT, pas de problèmes avec XP ou 2003. Le zip contient en plus le projet Visual Studio.
Source
- #include <Windows.h>
- #include <Wincrypt.h>
- #include <stdio.h>
- #include <math.h>
-
- // Configuration de la démo.
- #define NOM_FICHIER_CLEF "maClefAES.txt"
- #define NOM_FICHIER_DATA_CLAIR "monFichierClair.txt"
- #define NOM_FICHIER_DATA_CHIFFRE "monFichierChiffre.aes"
- #define NOM_FICHIER_DATA_DECHIFFRE "monFichierDechiffre.txt"
-
- // Déclaration des variables globales
- HCRYPTPROV cryptographicServiceProvider = 0;
- HCRYPTKEY clef = 0;
-
- void Erreur(char* fonction)
- {
- fprintf(stderr, "Erreur %s 0x%x\n", fonction, GetLastError());
- }
-
- void Message(char* message)
- {
- fprintf(stdout, "%s", message);
- }
-
- void Initialiser()
- {
- // Initialisation
- Message("\n[Initialisation]\n");
-
- Message("CryptAcquireContext...\n");
- if(!CryptAcquireContext(&cryptographicServiceProvider,
- NULL,
- NULL,
- PROV_RSA_AES,
- CRYPT_VERIFYCONTEXT))
- Erreur("CryptAcquireContext");
- }
-
- void Nettoyer()
- {
- // Nettoyage
- Message("\n[Nettoyage]\n");
-
- if (clef)
- {
- Message("CryptDestroyKey...\n");
- CryptDestroyKey(clef);
- clef = 0;
- }
-
- if (cryptographicServiceProvider)
- {
- Message("CryptReleaseContext...\n");
- CryptReleaseContext(cryptographicServiceProvider, 0);
- cryptographicServiceProvider = 0;
- }
- }
-
- void GenererClef()
- {
- DWORD modeChiffrement = CRYPT_MODE_CBC;
-
- Message("\n[Generation de la clef]\n");
-
- Message("CryptGenKey...\n");
- if(!CryptGenKey(cryptographicServiceProvider,
- CALG_AES_128,
- CRYPT_EXPORTABLE,
- &clef))
- Erreur("CryptGenKey");
-
- CryptSetKeyParam(clef, KP_MODE,(BYTE*)&modeChiffrement, NULL);
- }
-
- void ExporterClef(char* nomFichier)
- {
- // Déclaration des variables locales
- DWORD longueurClefFormatTexte = 0;
- LPBYTE clefFormatTexte = 0;
- HANDLE fichier = 0;
- DWORD nombreOctetsEcrits = 0;
-
- // Premiere partie du Traitement
- Message("\n[Formatage de la clef]\n");
-
- // Obtenir la taille de la clef
- Message("CryptExportKey...\n");
- if (!CryptExportKey(clef, NULL, PLAINTEXTKEYBLOB, 0, NULL, &longueurClefFormatTexte))
- Erreur("CryptExportKey");
-
- // Creer une zone tampon de la taille récupérée
- Message("malloc...\n");
- if (!(clefFormatTexte = (BYTE *)malloc(longueurClefFormatTexte)))
- Erreur("malloc");
-
- // Récupérer la clef
- Message("CryptExportKey...\n");
- if (!CryptExportKey(clef, NULL, PLAINTEXTKEYBLOB, 0, clefFormatTexte, &longueurClefFormatTexte))
- Erreur("CryptExportKey");
-
- // Seconde partie du traitement
- Message("\n[Exportation de la clef]\n");
-
- // Créér le fichier qui va stocker la clef
- Message("CreateFile...\n");
- if ((fichier = CreateFile(nomFichier,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)) == INVALID_HANDLE_VALUE)
- Erreur("CreateFile");
-
- // Ecrire la clef dans le fichier
- Message("WriteFile...\n");
- if (!WriteFile(fichier, (LPCVOID)clefFormatTexte, longueurClefFormatTexte, &nombreOctetsEcrits, NULL))
- Erreur("WriteFile");
-
- // Derniere partie du traitement.
- Message("\n[Exportation de la clef terminee]\n");
-
- // Fermer le fichier
- if (fichier)
- {
- Message("CloseHandle...\n");
- CloseHandle(fichier);
- }
-
- // Libérer le tampon stockant la clef sous forme de texte
- if (clefFormatTexte)
- {
- Message("free...\n");
- free(clefFormatTexte);
- }
- }
-
- void ImporterClef(char* nomFichier)
- {
- // Déclaration des variables locales
- DWORD longueurClefFormatTexte = 0;
- LPBYTE clefFormatTexte = 0;
- HANDLE fichier = 0;
-
- // Premiere partie du Traitement
- Message("\n[Formatage de la clef]\n");
-
- // Ouvrir le fichier contenant la clef
- Message("CreateFile...\n");
- if ((fichier = CreateFile(nomFichier, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL)) == INVALID_HANDLE_VALUE)
- Erreur("CreateFile");
-
- // Obtenir la taille du fichier
- Message("GetFileSize...\n");
- if ((longueurClefFormatTexte = GetFileSize(fichier, NULL)) == INVALID_FILE_SIZE)
- Erreur("GetFileSize");
-
- // Creer une zone tampon pour stocker la clef
- Message("malloc...\n");
- if (!(clefFormatTexte = (BYTE *)malloc(longueurClefFormatTexte)))
- Erreur("malloc");
-
- // Lire la clef à partir du fichier
- Message("ReadFile...\n");
- if (!ReadFile(fichier, clefFormatTexte, longueurClefFormatTexte, &longueurClefFormatTexte, NULL))
- Erreur("ReadFile");
-
- // Seconde partie du Traitement
- Message("\n[Importation de la clef]\n");
-
- // Importer la clef dans le CSP
- Message("CryptImportKey...\n");
- if (!CryptImportKey(cryptographicServiceProvider, clefFormatTexte, longueurClefFormatTexte, 0, 0, &clef))
- Erreur("CryptImportKey");
-
- // Derniere partie du traitement.
- Message("\n[Importation de la clef terminee]\n");
-
- // Fermer le fichier
- if (fichier)
- {
- Message("CloseHandle...\n");
- CloseHandle(fichier);
- }
-
- // Libérer le tampon stockant la clef sous forme de texte
- if (clefFormatTexte)
- {
- Message("free...\n");
- free(clefFormatTexte);
- }
- }
-
- void Chiffrer(char* nomFichierClair, char* nomFichierChiffre)
- {
- // Déclaration des variables locales
- HANDLE fichierClair = 0;
- HANDLE fichierChiffre = 0;
- LPBYTE texteClair = 0;
- LPBYTE texteChiffre = 0;
- DWORD longueurTexteClair = 0;
- DWORD longueurBlocTexte = 0;
- DWORD longueurTexteChiffre = 0;
- DWORD nombreOctetsEcrits = 0;
-
- // Ouvrir le fichier clair
- Message("CreateFile...\n");
- if ((fichierClair = CreateFile(nomFichierClair, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL)) == INVALID_HANDLE_VALUE)
- Erreur("CreateFile");
-
- //Obtenir la taille du fichier
- Message("GetFileSize...\n");
- if ((longueurTexteClair = GetFileSize(fichierClair, NULL)) == INVALID_FILE_SIZE)
- Erreur("GetFileSize");
-
- // Creer une zone tampon pour stocker le texte clair
- Message("malloc...\n");
- if (!(texteClair = (BYTE *)malloc(longueurTexteClair)))
- Erreur("malloc");
-
- // Lire le texte à partir du fichier
- Message("ReadFile...\n");
- if (!ReadFile(fichierClair, texteClair, longueurTexteClair, &longueurTexteClair, NULL))
- Erreur("ReadFile");
-
- // Obtenir la taille d'un bloc de texte chiffré
- Message("CryptEncrypt...\n");
- if (!CryptEncrypt(clef, NULL, TRUE, 0, NULL, &longueurBlocTexte, 0))
- Erreur("CryptEncrypt");
-
- // Déterminer la taille du tampon de sortie selon la règle suivante:
- // If the key is a block cipher key, the data is padded to a multiple of the
- // block size of the cipher. If the data length equals the block size of the
- // cipher, one additional block of padding is appended to the data.
- double longueurTemp = (static_cast <double> (longueurTexteClair)) / (static_cast <double> (longueurBlocTexte));
- longueurTexteChiffre = longueurBlocTexte + (longueurBlocTexte * (static_cast <unsigned int> (floor(longueurTemp))));
-
- // Allouer l'espace mémoire pour le tampon de sortie
- Message("malloc...\n");
- if (!(texteChiffre = (BYTE *) malloc(longueurTexteChiffre)))
- Erreur("malloc");
-
- // Initialiser tampon de sortie
- DWORD longueurDonnees = longueurTexteClair;
- memset(texteChiffre, ' ', longueurTexteChiffre);
- memcpy(texteChiffre, texteClair, longueurDonnees);
-
- // Chiffrer le texte
- Message("CryptEncrypt...\n");
- if (!CryptEncrypt(clef,0,TRUE,0,texteChiffre,&longueurDonnees,longueurTexteChiffre))
- Erreur("CryptEncrypt");
-
- // Creer un fichier où seront sauvegardées les données chiffrées
- Message("CreateFile...\n");
- if ((fichierChiffre = CreateFile(nomFichierChiffre, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
- Erreur("CreateFile");
-
- // Ecrire les données chiffrées dans le fichier
- Message("WriteFile...\n");
- if (!WriteFile(fichierChiffre, (LPCVOID)texteChiffre, longueurDonnees, &nombreOctetsEcrits, NULL))
- Erreur("WriteFile");
-
- // Fermer le fichier de destination
- if (fichierChiffre)
- {
- Message("CloseHandle...\n");
- CloseHandle(fichierChiffre);
- }
-
- // Fermer le fichier d'origine
- if (fichierClair)
- {
- Message("CloseHandle...\n");
- CloseHandle(fichierClair);
- }
-
- // Libérer le tampon stockant le bloc de texte
- if (texteChiffre)
- {
- Message("free...\n");
- free(texteChiffre);
- }
-
- // Libérer le tampon stockant le texte
- if (texteClair)
- {
- Message("free...\n");
- free(texteClair);
- }
- }
-
- void Dechiffrer(char* nomFichierChiffre, char* nomFichierClair)
- {
- // Déclaration des variables locales
- HANDLE fichierClair = 0;
- HANDLE fichierChiffre = 0;
- LPBYTE texteClair = 0;
- LPBYTE texteChiffre = 0;
- DWORD longueurTexteClair = 0;
- DWORD longueurTexteChiffre = 0;
- DWORD nombreOctetsEcrits = 0;
-
- // Ouvrir le fichier chiffré
- Message("CreateFile...\n");
- if ((fichierChiffre = CreateFile(nomFichierChiffre, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL)) == INVALID_HANDLE_VALUE)
- Erreur("CreateFile");
-
- //Obtenir la taille du fichier
- Message("GetFileSize...\n");
- if ((longueurTexteChiffre = GetFileSize(fichierChiffre, NULL)) == INVALID_FILE_SIZE)
- Erreur("GetFileSize");
-
- // Creer une zone tampon pour stocker le texte chiffré
- Message("malloc...\n");
- if (!(texteChiffre = (BYTE *)malloc(longueurTexteChiffre)))
- Erreur("malloc");
-
- // Lire le texte à partir du fichier
- Message("ReadFile...\n");
- if (!ReadFile(fichierChiffre, texteChiffre, longueurTexteChiffre, &longueurTexteChiffre, NULL))
- Erreur("ReadFile");
-
- // Déterminer la taille du tampon de sortie
- longueurTexteClair = longueurTexteChiffre;
-
- // Allouer l'espace mémoire pour le tampon de sortie
- Message("malloc...\n");
- if (!(texteClair = (BYTE *) malloc(longueurTexteClair)))
- Erreur("malloc");
-
- // Initialiser tampon de sortie
- DWORD longueurDonnees = longueurTexteClair;
- memset(texteClair, ' ', longueurTexteClair);
- memcpy(texteClair, texteChiffre, longueurDonnees);
-
- // Déchiffrer les données
- Message("CryptDecrypt...\n");
- if (!CryptDecrypt(clef, NULL, TRUE, 0, texteClair, &longueurDonnees))
- Erreur("CryptDecrypt");
-
- // Creer un fichier où seront sauvegardées les données déchiffrées
- Message("CreateFile...\n");
- if ((fichierClair = CreateFile(nomFichierClair, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
- Erreur("CreateFile");
-
- // Ecrire les données déchiffrées dans le fichier
- Message("WriteFile...\n");
- if (!WriteFile(fichierClair, (LPCVOID)texteClair, longueurDonnees, &nombreOctetsEcrits, NULL))
- Erreur("WriteFile");
-
- // Fermer le fichier d'origine
- if (fichierChiffre)
- {
- Message("CloseHandle...\n");
- CloseHandle(fichierChiffre);
- }
-
- // Fermer le fichier de destination
- if (fichierClair)
- {
- Message("CloseHandle...\n");
- CloseHandle(fichierClair);
- }
-
- // Libérer le tampon stockant le texte
- if (texteClair)
- {
- Message("free...\n");
- free(texteClair);
- }
-
- // Libérer le tampon stockant le bloc de texte
- if (texteChiffre)
- {
- Message("free...\n");
- free(texteChiffre);
- }
- }
-
- int main(int argc, char* argv[])
- {
- Message("****************************************"
- "\n* Generer une clef et l'exporter dans un fichier\n"
- "****************************************");
- Initialiser();
- GenererClef();
- ExporterClef(NOM_FICHIER_CLEF);
- Nettoyer();
- Message("****************************************\n");
-
- Message("\n****************************************"
- "\nImporter la clef a partir d'un fichier, et chiffrer le fichier cible\n"
- "****************************************");
- Initialiser();
- ImporterClef(NOM_FICHIER_CLEF);
- Chiffrer(NOM_FICHIER_DATA_CLAIR,NOM_FICHIER_DATA_CHIFFRE);
- Nettoyer();
- Message("****************************************\n");
-
- Message("\n****************************************"
- "\nImporter la clef a partir d'un fichier, et dechiffrer le fichier cible\n"
- "****************************************");
- Initialiser();
- ImporterClef(NOM_FICHIER_CLEF);
- Dechiffrer(NOM_FICHIER_DATA_CHIFFRE,NOM_FICHIER_DATA_DECHIFFRE);
- Nettoyer();
- Message("****************************************\n");
-
- // Permettre à l'utilisateur de visualiser les messages.
- system("pause");
- }
#include <Windows.h>
#include <Wincrypt.h>
#include <stdio.h>
#include <math.h>
// Configuration de la démo.
#define NOM_FICHIER_CLEF "maClefAES.txt"
#define NOM_FICHIER_DATA_CLAIR "monFichierClair.txt"
#define NOM_FICHIER_DATA_CHIFFRE "monFichierChiffre.aes"
#define NOM_FICHIER_DATA_DECHIFFRE "monFichierDechiffre.txt"
// Déclaration des variables globales
HCRYPTPROV cryptographicServiceProvider = 0;
HCRYPTKEY clef = 0;
void Erreur(char* fonction)
{
fprintf(stderr, "Erreur %s 0x%x\n", fonction, GetLastError());
}
void Message(char* message)
{
fprintf(stdout, "%s", message);
}
void Initialiser()
{
// Initialisation
Message("\n[Initialisation]\n");
Message("CryptAcquireContext...\n");
if(!CryptAcquireContext(&cryptographicServiceProvider,
NULL,
NULL,
PROV_RSA_AES,
CRYPT_VERIFYCONTEXT))
Erreur("CryptAcquireContext");
}
void Nettoyer()
{
// Nettoyage
Message("\n[Nettoyage]\n");
if (clef)
{
Message("CryptDestroyKey...\n");
CryptDestroyKey(clef);
clef = 0;
}
if (cryptographicServiceProvider)
{
Message("CryptReleaseContext...\n");
CryptReleaseContext(cryptographicServiceProvider, 0);
cryptographicServiceProvider = 0;
}
}
void GenererClef()
{
DWORD modeChiffrement = CRYPT_MODE_CBC;
Message("\n[Generation de la clef]\n");
Message("CryptGenKey...\n");
if(!CryptGenKey(cryptographicServiceProvider,
CALG_AES_128,
CRYPT_EXPORTABLE,
&clef))
Erreur("CryptGenKey");
CryptSetKeyParam(clef, KP_MODE,(BYTE*)&modeChiffrement, NULL);
}
void ExporterClef(char* nomFichier)
{
// Déclaration des variables locales
DWORD longueurClefFormatTexte = 0;
LPBYTE clefFormatTexte = 0;
HANDLE fichier = 0;
DWORD nombreOctetsEcrits = 0;
// Premiere partie du Traitement
Message("\n[Formatage de la clef]\n");
// Obtenir la taille de la clef
Message("CryptExportKey...\n");
if (!CryptExportKey(clef, NULL, PLAINTEXTKEYBLOB, 0, NULL, &longueurClefFormatTexte))
Erreur("CryptExportKey");
// Creer une zone tampon de la taille récupérée
Message("malloc...\n");
if (!(clefFormatTexte = (BYTE *)malloc(longueurClefFormatTexte)))
Erreur("malloc");
// Récupérer la clef
Message("CryptExportKey...\n");
if (!CryptExportKey(clef, NULL, PLAINTEXTKEYBLOB, 0, clefFormatTexte, &longueurClefFormatTexte))
Erreur("CryptExportKey");
// Seconde partie du traitement
Message("\n[Exportation de la clef]\n");
// Créér le fichier qui va stocker la clef
Message("CreateFile...\n");
if ((fichier = CreateFile(nomFichier,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)) == INVALID_HANDLE_VALUE)
Erreur("CreateFile");
// Ecrire la clef dans le fichier
Message("WriteFile...\n");
if (!WriteFile(fichier, (LPCVOID)clefFormatTexte, longueurClefFormatTexte, &nombreOctetsEcrits, NULL))
Erreur("WriteFile");
// Derniere partie du traitement.
Message("\n[Exportation de la clef terminee]\n");
// Fermer le fichier
if (fichier)
{
Message("CloseHandle...\n");
CloseHandle(fichier);
}
// Libérer le tampon stockant la clef sous forme de texte
if (clefFormatTexte)
{
Message("free...\n");
free(clefFormatTexte);
}
}
void ImporterClef(char* nomFichier)
{
// Déclaration des variables locales
DWORD longueurClefFormatTexte = 0;
LPBYTE clefFormatTexte = 0;
HANDLE fichier = 0;
// Premiere partie du Traitement
Message("\n[Formatage de la clef]\n");
// Ouvrir le fichier contenant la clef
Message("CreateFile...\n");
if ((fichier = CreateFile(nomFichier, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL)) == INVALID_HANDLE_VALUE)
Erreur("CreateFile");
// Obtenir la taille du fichier
Message("GetFileSize...\n");
if ((longueurClefFormatTexte = GetFileSize(fichier, NULL)) == INVALID_FILE_SIZE)
Erreur("GetFileSize");
// Creer une zone tampon pour stocker la clef
Message("malloc...\n");
if (!(clefFormatTexte = (BYTE *)malloc(longueurClefFormatTexte)))
Erreur("malloc");
// Lire la clef à partir du fichier
Message("ReadFile...\n");
if (!ReadFile(fichier, clefFormatTexte, longueurClefFormatTexte, &longueurClefFormatTexte, NULL))
Erreur("ReadFile");
// Seconde partie du Traitement
Message("\n[Importation de la clef]\n");
// Importer la clef dans le CSP
Message("CryptImportKey...\n");
if (!CryptImportKey(cryptographicServiceProvider, clefFormatTexte, longueurClefFormatTexte, 0, 0, &clef))
Erreur("CryptImportKey");
// Derniere partie du traitement.
Message("\n[Importation de la clef terminee]\n");
// Fermer le fichier
if (fichier)
{
Message("CloseHandle...\n");
CloseHandle(fichier);
}
// Libérer le tampon stockant la clef sous forme de texte
if (clefFormatTexte)
{
Message("free...\n");
free(clefFormatTexte);
}
}
void Chiffrer(char* nomFichierClair, char* nomFichierChiffre)
{
// Déclaration des variables locales
HANDLE fichierClair = 0;
HANDLE fichierChiffre = 0;
LPBYTE texteClair = 0;
LPBYTE texteChiffre = 0;
DWORD longueurTexteClair = 0;
DWORD longueurBlocTexte = 0;
DWORD longueurTexteChiffre = 0;
DWORD nombreOctetsEcrits = 0;
// Ouvrir le fichier clair
Message("CreateFile...\n");
if ((fichierClair = CreateFile(nomFichierClair, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL)) == INVALID_HANDLE_VALUE)
Erreur("CreateFile");
//Obtenir la taille du fichier
Message("GetFileSize...\n");
if ((longueurTexteClair = GetFileSize(fichierClair, NULL)) == INVALID_FILE_SIZE)
Erreur("GetFileSize");
// Creer une zone tampon pour stocker le texte clair
Message("malloc...\n");
if (!(texteClair = (BYTE *)malloc(longueurTexteClair)))
Erreur("malloc");
// Lire le texte à partir du fichier
Message("ReadFile...\n");
if (!ReadFile(fichierClair, texteClair, longueurTexteClair, &longueurTexteClair, NULL))
Erreur("ReadFile");
// Obtenir la taille d'un bloc de texte chiffré
Message("CryptEncrypt...\n");
if (!CryptEncrypt(clef, NULL, TRUE, 0, NULL, &longueurBlocTexte, 0))
Erreur("CryptEncrypt");
// Déterminer la taille du tampon de sortie selon la règle suivante:
// If the key is a block cipher key, the data is padded to a multiple of the
// block size of the cipher. If the data length equals the block size of the
// cipher, one additional block of padding is appended to the data.
double longueurTemp = (static_cast <double> (longueurTexteClair)) / (static_cast <double> (longueurBlocTexte));
longueurTexteChiffre = longueurBlocTexte + (longueurBlocTexte * (static_cast <unsigned int> (floor(longueurTemp))));
// Allouer l'espace mémoire pour le tampon de sortie
Message("malloc...\n");
if (!(texteChiffre = (BYTE *) malloc(longueurTexteChiffre)))
Erreur("malloc");
// Initialiser tampon de sortie
DWORD longueurDonnees = longueurTexteClair;
memset(texteChiffre, ' ', longueurTexteChiffre);
memcpy(texteChiffre, texteClair, longueurDonnees);
// Chiffrer le texte
Message("CryptEncrypt...\n");
if (!CryptEncrypt(clef,0,TRUE,0,texteChiffre,&longueurDonnees,longueurTexteChiffre))
Erreur("CryptEncrypt");
// Creer un fichier où seront sauvegardées les données chiffrées
Message("CreateFile...\n");
if ((fichierChiffre = CreateFile(nomFichierChiffre, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
Erreur("CreateFile");
// Ecrire les données chiffrées dans le fichier
Message("WriteFile...\n");
if (!WriteFile(fichierChiffre, (LPCVOID)texteChiffre, longueurDonnees, &nombreOctetsEcrits, NULL))
Erreur("WriteFile");
// Fermer le fichier de destination
if (fichierChiffre)
{
Message("CloseHandle...\n");
CloseHandle(fichierChiffre);
}
// Fermer le fichier d'origine
if (fichierClair)
{
Message("CloseHandle...\n");
CloseHandle(fichierClair);
}
// Libérer le tampon stockant le bloc de texte
if (texteChiffre)
{
Message("free...\n");
free(texteChiffre);
}
// Libérer le tampon stockant le texte
if (texteClair)
{
Message("free...\n");
free(texteClair);
}
}
void Dechiffrer(char* nomFichierChiffre, char* nomFichierClair)
{
// Déclaration des variables locales
HANDLE fichierClair = 0;
HANDLE fichierChiffre = 0;
LPBYTE texteClair = 0;
LPBYTE texteChiffre = 0;
DWORD longueurTexteClair = 0;
DWORD longueurTexteChiffre = 0;
DWORD nombreOctetsEcrits = 0;
// Ouvrir le fichier chiffré
Message("CreateFile...\n");
if ((fichierChiffre = CreateFile(nomFichierChiffre, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL)) == INVALID_HANDLE_VALUE)
Erreur("CreateFile");
//Obtenir la taille du fichier
Message("GetFileSize...\n");
if ((longueurTexteChiffre = GetFileSize(fichierChiffre, NULL)) == INVALID_FILE_SIZE)
Erreur("GetFileSize");
// Creer une zone tampon pour stocker le texte chiffré
Message("malloc...\n");
if (!(texteChiffre = (BYTE *)malloc(longueurTexteChiffre)))
Erreur("malloc");
// Lire le texte à partir du fichier
Message("ReadFile...\n");
if (!ReadFile(fichierChiffre, texteChiffre, longueurTexteChiffre, &longueurTexteChiffre, NULL))
Erreur("ReadFile");
// Déterminer la taille du tampon de sortie
longueurTexteClair = longueurTexteChiffre;
// Allouer l'espace mémoire pour le tampon de sortie
Message("malloc...\n");
if (!(texteClair = (BYTE *) malloc(longueurTexteClair)))
Erreur("malloc");
// Initialiser tampon de sortie
DWORD longueurDonnees = longueurTexteClair;
memset(texteClair, ' ', longueurTexteClair);
memcpy(texteClair, texteChiffre, longueurDonnees);
// Déchiffrer les données
Message("CryptDecrypt...\n");
if (!CryptDecrypt(clef, NULL, TRUE, 0, texteClair, &longueurDonnees))
Erreur("CryptDecrypt");
// Creer un fichier où seront sauvegardées les données déchiffrées
Message("CreateFile...\n");
if ((fichierClair = CreateFile(nomFichierClair, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
Erreur("CreateFile");
// Ecrire les données déchiffrées dans le fichier
Message("WriteFile...\n");
if (!WriteFile(fichierClair, (LPCVOID)texteClair, longueurDonnees, &nombreOctetsEcrits, NULL))
Erreur("WriteFile");
// Fermer le fichier d'origine
if (fichierChiffre)
{
Message("CloseHandle...\n");
CloseHandle(fichierChiffre);
}
// Fermer le fichier de destination
if (fichierClair)
{
Message("CloseHandle...\n");
CloseHandle(fichierClair);
}
// Libérer le tampon stockant le texte
if (texteClair)
{
Message("free...\n");
free(texteClair);
}
// Libérer le tampon stockant le bloc de texte
if (texteChiffre)
{
Message("free...\n");
free(texteChiffre);
}
}
int main(int argc, char* argv[])
{
Message("****************************************"
"\n* Generer une clef et l'exporter dans un fichier\n"
"****************************************");
Initialiser();
GenererClef();
ExporterClef(NOM_FICHIER_CLEF);
Nettoyer();
Message("****************************************\n");
Message("\n****************************************"
"\nImporter la clef a partir d'un fichier, et chiffrer le fichier cible\n"
"****************************************");
Initialiser();
ImporterClef(NOM_FICHIER_CLEF);
Chiffrer(NOM_FICHIER_DATA_CLAIR,NOM_FICHIER_DATA_CHIFFRE);
Nettoyer();
Message("****************************************\n");
Message("\n****************************************"
"\nImporter la clef a partir d'un fichier, et dechiffrer le fichier cible\n"
"****************************************");
Initialiser();
ImporterClef(NOM_FICHIER_CLEF);
Dechiffrer(NOM_FICHIER_DATA_CHIFFRE,NOM_FICHIER_DATA_DECHIFFRE);
Nettoyer();
Message("****************************************\n");
// Permettre à l'utilisateur de visualiser les messages.
system("pause");
}
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Implémentation d'AES dans NS2 [ par Louk88 ]
Bonjour S'il vous plait, j'ai un problème dans l’implémentation de l'AES en NS2. En fait, je voudrai appeler la fonction de chiffrement et de d
api webcam [ par alessan ]
bonjour,je recherche une api gratuite pour pouvoir piloter, prendre des fotos (sans que cela s'affiche sur l'ecran) une webcam.merci d'avance!
Registre ou API windows [ par Will ]
Je souhaite recuperer les infos d'un pc (c a d la carte reseau, la carte son, le type de clavier etc...).Que dois-je utiliser, la base de registe wind
API capte l'écran [ par Bin Laden ]
Salut, Je cherche une fonction API qui capte le contenu de l'écran.
QU'EST-CE QU'UNE API ? [ par ronan ]
Je suis débutant et j'aimerais bien avoir une définition d'une Api. J'en entends beaucoup parler mais je sais pas trop ce que sais.Merci.
API qui recupere son propre path [ par NetCommando ]
je veux savoir comment une API recupere son prapre pathdu genre c:\app.exe , pour une aplication nomé "app"merci
API pour visualiser des pages HTML???????? [ par Tropdemalaveclesapi ]
QQN connait une api pour afficher à l'écran une page HTML? merci à tous de réfléchir à la question!
UTILISATIONS D'API [ par DEL ]
comment utiliser les api findwindow, findwindowex et sendmessage en C ?merci d'avance =) ++DEL
plusieurs dialog [API] [ par Xs ]
voila, je faisait un prog, et pis tout d'un coup, j'ai eu envie de changer son design, qui été deja sous API WIN32.ce design consiste a avoir une dial
police, style,etc...[API] [ par Xs ]
salut !!je voudrais savoir avec quelle fonction API on change la taille, le style, la police, etc.. d'un texte.Y compris et surtout la couleur !!!j'ai
|
Derniers Blogs
[TECHDAYS2012] OUI J'Y SERAI![TECHDAYS2012] OUI J'Y SERAI! par JeremyJeanson
Bonsoir, Certes, je l'annonce avec un peu de retard, mais je serai effectivement au Techdays demain. Comme l'an dernier, je participerai au programme ATE (Ask The Expert). Si vous avez des questions Workflow, WCF, AppFabric ou plus généralement .net, n'hé...
Cliquez pour lire la suite de l'article par JeremyJeanson TFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICESTFS INTEGRATION TOOLS - SUIVI DES SYNCHRONISATIONS AVEC REPORTING SERVICES par vfabing
Afin de s'assurer du bon fonctionnement des différentes synchronisations effectuées par les TFS Integration Tools, 2 rapports sont présents dès l'installation. Il suffit alors d'effectuer les manipulations suivantes pour pouvoir les visualiser : Loca...
Cliquez pour lire la suite de l'article par vfabing CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT)CSS CONTENT STATE SELECTORS (PERSONNAL DRAFT) par FREMYCOMPANY
Bonjour à tous, Je viens de publier une proposition comprenant 5 pseudo-classes pour le CSS Working Group ayant trait à l'état de chargement d'un élément (ex: IMG,VIDEO,AUDIO,OBJECT pour l'HTML.). Si le c½ur vous en dit, vous pouvez retrouver cette p...
Cliquez pour lire la suite de l'article par FREMYCOMPANY MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ?MBA : POURQUOI FAIRE ET COMMENT LE CHOISIR ? par ROMELARD Fabrice
Formation initiale Durant la formation, le découpage classique est le suivant (je donnerai les équivalences Suisse lorsque je les connaîtrais) : Ecole primaire jusqu'au Collège : Formation générale permettant d'obtenir les méthodes...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice Y'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENTY'A DES ERREURS QUI PEUVENT RENDRE LE DéVELOPPEUR VIOLENT par Aleks
Quand on a ce genre d'erreur sans log :
Et bas on a juste envie de choper le gas de Microsoft qu'a développé ça et lui foutre des baffes de Coboye ! ...
Cliquez pour lire la suite de l'article par Aleks
Forum
RE : ARBRE BINAIRERE : ARBRE BINAIRE par pacotheking
Cliquez pour lire la suite par pacotheking
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|