Файл в кодировке PEM - это заголовок, нижний колонтитул и содержимое в кодировке base64 (которое для сертификатов, ключей и прочего представляет собой данные в кодировке BER / DER).
Когда OpenSSL записывает данные, он использует ограничения из DER (насколько я видел), поэтому для данных, записанных OpenSSL, вам просто нужно base64-декодировать содержимое. openssl base64 -d
сделает это (игнорируя верхний / нижний колонтитулы PEM)
openssl base64 -d -in pubkey.key -out pubkey.der
Если вы обеспокоены тем, что содержимое PEM является допустимым BER, но не допустимым DER (например, что в нем используются построенные значения неопределенной длины), вы можете попросить OpenSSL прочитать и записать его.
openssl rsa -pubin -in pubkey.key -outform der -out pubkey.der
или программно
FILE* fp = fopen("pubkey.key", "r");
EVP_PKEY* pkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL);
fclose(fp);
fp = fopen("pubkey.der", "wb");
i2d_PUBKEY_fp(fp, pkey);
fclose(fp);
EVP_PKEY_free(pkey);
Опционально с проверкой ошибок.