我有以下用Java实现的代码。该方法以字符串形式接收base64 PKCS8编码的密钥,并向后吐出RSA私钥(这是我的解释,我是crypto的新手,请耐心等待)
public static PrivateKey getPrivateKey(final String
Base64EncodedPkcs8String) {
PKCS8EncodedKeySpec privateKeySpec = new
PKCS8EncodedKeySpec(Base64.decodeBase64(base64EncodedPkcs8String));
try {
return KeyFactory.getInstance("RSA").generatePrivate(privateKeySpec);
}
catch (NoSuchAlgorithmException e) {
logger.error("NoSuchAlgorithmException", e);
return null;
}
catch (InvalidKeySpecException e) {
logger.error("InvalidKeySpecException", e);
return null;
}
}
我正在尝试使用OpenSSL做类似的事情:
EVP_PKEY* pPrivateKeyInfo = nullptr;
std::string copy = "\n"; //<-- I don't know if this is right
copy += strBase64EncodedPrivateKey;
copy += "\n"; //<-- or this
auto c_string = copy.c_str();
unsigned char* pszDecodedMessage = nullptr;
size_t stEncodedMessageLength{};
this->DecodeBase64Message(c_string, pszDecodedMessage, &stEncodedMessageLength);
auto pKeybio = BIO_new_mem_buf((void*)(pszDecodedMessage), -1);
if (nullptr == pKeybio)
{
return nullptr;
}
pPrivateKeyInfo = PEM_read_bio_PrivateKey(pKeybio, &pPrivateKeyInfo, nullptr, nullptr);
if (nullptr == pPrivateKeyInfo)
{
return nullptr;
}
对PEM_read_bio_PrivateKey的调用始终失败。我还尝试过使用PEM_read_bio_PKCS8_PRIV_KEY_INFO,该操作也会失败。
有人看到此代码有任何明显的问题吗?有一个更好的方法吗? (更简单?)