// 非推奨関数を使用する部分で警告を抑制 #pragma warning(disable : 4996) #include #include #include #include #include #include #include #define KEY_LENGTH 2048 int main() { // アルゴリズムを初期化する OpenSSL_add_all_algorithms(); // エラー文字列を初期化する ERR_load_crypto_strings(); // 1. 鍵の生成 RSA* keypair = RSA_generate_key(KEY_LENGTH, RSA_F4, NULL, NULL); if (keypair == NULL) { fprintf(stderr, "RSA key generation failed.\n"); return 1; } // 2. EVP_PKEY構造体の生成 EVP_PKEY* evp_key = EVP_PKEY_new(); if (evp_key == NULL) { fprintf(stderr, "Failed to create EVP_PKEY.\n"); RSA_free(keypair); return 1; } // 3. EVP_PKEYにRSA鍵を設定 EVP_PKEY_assign(evp_key, EVP_PKEY_RSA, keypair); // 4. 公開鍵のエクスポート BIO* pub = BIO_new_file("public.pem", "w"); if (PEM_write_bio_PUBKEY(pub, evp_key) != 1) { fprintf(stderr, "Failed to write public key.\n"); RSA_free(keypair); EVP_PKEY_free(evp_key); return 1; } BIO_free(pub); // 5. 秘密鍵のエクスポート BIO* pri = BIO_new_file("private.pem", "w"); if (PEM_write_bio_PrivateKey(pri, evp_key, NULL, NULL, 0, NULL, NULL) != 1) { fprintf(stderr, "Failed to write private key.\n"); RSA_free(keypair); EVP_PKEY_free(evp_key); return 1; } BIO_free(pri); // 6. 鍵の解放 EVP_PKEY_free(evp_key); printf("Key pair generated and saved.\n"); return 0; }