#include #include #include #include #include #define AES_KEY_SIZE 128 #define BUFFER_SIZE 1024 // ファイルをAESで暗号化する関数 void encryptFile(const char* inputFile, const char* outputFile, const char* password) { // 入力と出力のファイルを開く FILE* inFile = fopen(inputFile, "rb"); FILE* outFile = fopen(outputFile, "wb"); // ファイルのオープンが成功したか確認 if (inFile == NULL || outFile == NULL) { perror("ファイルを開く際にエラーが発生しました"); exit(EXIT_FAILURE); } // パスワードを128ビットのキーに変換 unsigned char key[AES_KEY_SIZE / 8]; memset(key, 0, sizeof(key)); strncpy_s((char*)key, sizeof(key) / sizeof(key[0]), password, _TRUNCATE); // 暗号化コンテキストを作成し初期化 EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); if (ctx == NULL) { perror("暗号化コンテキストの作成にエラーが発生しました"); exit(EXIT_FAILURE); } // AES暗号を128ビットの鍵サイズでCBCモードで初期化し、 // 提供されたパスワードから導出されたキーを使用して、暗号化コンテキスト(ctx)を初期化する EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, NULL); // 暗号化ループ unsigned char buffer[BUFFER_SIZE]; size_t bytesRead = 0; // 'int'を'size_t'に変更 // ファイルのデータを読み込みつつ、 // それをAESアルゴリズムを用いて暗号化し、暗号化されたデータを別のファイルに書き込む while ((bytesRead = fread(buffer, 1, sizeof(buffer), inFile)) > 0) { EVP_EncryptUpdate(ctx, buffer, (int*)&bytesRead, buffer, (int)bytesRead); fwrite(buffer, 1, bytesRead, outFile); } // 暗号化の終了処理 EVP_EncryptFinal_ex(ctx, buffer, (int*)&bytesRead); fwrite(buffer, 1, bytesRead, outFile); // 暗号化コンテキストを解放 EVP_CIPHER_CTX_free(ctx); // ファイルを閉じる fclose(inFile); fclose(outFile); } // ファイルをAESで復号化する関数 void decryptFile(const char* inputFile, const char* outputFile, const char* password) { // 入力と出力のファイルを開く FILE* inFile = fopen(inputFile, "rb"); FILE* outFile = fopen(outputFile, "wb"); // ファイルのオープンが成功したか確認 if (inFile == NULL || outFile == NULL) { perror("ファイルを開く際にエラーが発生しました"); exit(EXIT_FAILURE); } // パスワードを128ビットのキーに変換 unsigned char key[AES_KEY_SIZE / 8]; memset(key, 0, sizeof(key)); strncpy_s((char*)key, sizeof(key) / sizeof(key[0]), password, _TRUNCATE); // 復号化コンテキストを作成し初期化 EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new(); if (ctx == NULL) { perror("復号化コンテキストの作成にエラーが発生しました"); exit(EXIT_FAILURE); } // AES暗号を128ビットの鍵サイズでCBCモードで初期化し、 // 提供されたパスワードから導出されたキーを使用して、復号化コンテキスト (ctx) を初期化する EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, NULL); // 復号化ループ unsigned char buffer[BUFFER_SIZE]; size_t bytesRead = 0; // 'int'を'size_t'に変更 // AESアルゴリズムを用いてそのデータを復号化し、復号化されたデータを別のファイルに書き込む while ((bytesRead = fread(buffer, 1, sizeof(buffer), inFile)) > 0) { EVP_DecryptUpdate(ctx, buffer, (int*)&bytesRead, buffer, (int)bytesRead); fwrite(buffer, 1, bytesRead, outFile); } // 復号化の終了処理 EVP_DecryptFinal_ex(ctx, buffer, (int*)&bytesRead); fwrite(buffer, 1, bytesRead, outFile); // 復号化コンテキストを解放 EVP_CIPHER_CTX_free(ctx); // ファイルを閉じる fclose(inFile); fclose(outFile); } // メイン関数 int main() { // ファイルパスとパスワード const char* inputFile = "plain.txt"; const char* encryptedFile = "encrypted.txt"; const char* decryptedFile = "decrypted.txt"; const char* password = "MySecretPassword"; // 暗号化 encryptFile(inputFile, encryptedFile, password); printf("ファイルが正常に暗号化されました。\n"); // 復号化 decryptFile(encryptedFile, decryptedFile, password); printf("ファイルが正常に復号化されました。\n"); return 0; }