#include #include #include #include #include #define AES_KEY_LENGTH 256 #define BLOCK_SIZE 16 void encrypt(const char* input, const char* key, unsigned char* output) { EVP_CIPHER_CTX* ctx; int len; int ciphertext_len; // 初期化 // OpenSSLのEVP(Envelope Encryption)暗号コンテキスト(EVP_CIPHER_CTX)を // 新しく作成することが成功したかどうかを確認する if (!(ctx = EVP_CIPHER_CTX_new())) { // エラーハンドリング fprintf(stderr, "Error creating context\n"); return; } // AESのCBCモードを使用 // AES-256-CBC暗号化を行うためのOpenSSL関数 EVP_EncryptInit_ex の初期化呼び出しにおいて、 // エラーチェックを行う if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, (unsigned char*)key, NULL)) { // エラーハンドリング fprintf(stderr, "Error initializing encryption\n"); EVP_CIPHER_CTX_free(ctx); return; } // ランダムなIV(Initialization Vector)を生成 unsigned char iv[BLOCK_SIZE]; RAND_bytes(iv, sizeof(iv)); // IVを出力に追加 memcpy(output, iv, BLOCK_SIZE); // 暗号化 // AES-256-CBCモードでの暗号データの更新を行う if (1 != EVP_EncryptUpdate(ctx, output + BLOCK_SIZE, &len, (unsigned char*)input, (int)strlen(input))) { // エラーハンドリング fprintf(stderr, "Error encrypting data\n"); EVP_CIPHER_CTX_free(ctx); return; } ciphertext_len = len; if (1 != EVP_EncryptFinal_ex(ctx, output + BLOCK_SIZE + len, &len)) { // エラーハンドリング fprintf(stderr, "Error finalizing encryption\n"); EVP_CIPHER_CTX_free(ctx); return; } // その時点までの暗号文の合計の長さを保持する ciphertext_len += len; // 終了処理 EVP_CIPHER_CTX_free(ctx); } int main() { const char* input = "Hello, Encryption!"; const char* key = "ThisIsASecretKey"; // 暗号化結果を保存するためのバッファ unsigned char encryptedData[1024]; encrypt(input, key, encryptedData); // 暗号化されたデータを16進数で表示 for (int i = 0; i < BLOCK_SIZE + (int)strlen(input); ++i) { printf("%02x", encryptedData[i]); } printf("\n"); return 0; }