DER 编码 Public cryptopp 创建的密钥与 openssl 不同
DER Encoding Public Key created by cryptopp is different then openssl
我一直在尝试使用 RSA 私钥创建 DER 编码的 public 密钥。我通常创建它的方式是使用命令行:
openssl rsa -pubout -outform DER -in ~/.keys/api_key.pem -out der_pub.der
当我使用 CryptoPP 创建此文件时,它们略有不同。它似乎有一个额外的部分。由 openssl 创建的那个有一点额外的部分。我假设这是 CryptoPP API 中提到的 BIT STRING。 https://www.cryptopp.com/docs/ref/class_r_s_a_function.html
void DEREncodePublicKey (BufferedTransformation &bt) const
encode subjectPublicKey part of subjectPublicKeyInfo, without the BIT STRING header
这是我的代码的样子:
...
CryptoPP::RSA::PrivateKey rsaPrivate;
rsaPrivate.BERDecodePrivateKey(queue, false /*paramsPresent*/, queue.MaxRetrievable());
CryptoPP::ByteQueue bq;
rsaPrivate.DEREncodePublicKey(bq);
CryptoPP::FileSink fs1("cryptopp_pub.der", true);
bq.TransferTo(fs1);
CryptoPP::RSA::DEREncodePublicKey encodes subjectPublicKey part of subjectPublicKeyInfo, without the BIT STRING header
尝试CryptoPP::RSA::PublicKey::DEREncode
。注意仅将此应用于 public 键,因为 RSA::PrivateKey 确实会重载 DEREncode 方法。
这里我使用的是 CryptoPP 8.2
从磁盘加载 DER 编码私钥
CryptoPP::RSA::PrivateKey private_key;
{
CryptoPP::FileSource file{"my.key", true};
private_key.BERDecodePrivateKey(file, false, -1);
}
保存出DER编码的public密钥
CryptoPP::FileSink sink{"my.pub", true};
CryptoPP::RSA::PublicKey{private_key}.DEREncode(sink);
OpenSSL:
# generate a new RSA private key (DER format)
openssl genrsa | openssl rsa -outform DER -out my.key
# hash/fingerprint the public key
openssl rsa -in my.key -inform DER -pubout -outform DER | openssl sha256
writing RSA key
362945ad4a5f87f27d3db3b4adbacaee0ebc3f778ee2fe76ef4fb09933148372
# compare against hash of our code sample's generated public key
cat my.pub | openssl sha256
362945ad4a5f87f27d3db3b4adbacaee0ebc3f778ee2fe76ef4fb09933148372
再举个例子;如果我们希望 CryptoPP 生成 SHA256 指纹:
std::string hash_out_str;
{
CryptoPP::SHA256 sha256;
CryptoPP::HashFilter filter{
sha256,
new CryptoPP::HexEncoder{
new CryptoPP::StringSink{hash_out_str}
}
};
CryptoPP::RSA::PublicKey{private_key}.DEREncode(filter); // intentionally slice to ensure we aren't exposing a public key
filter.MessageEnd();
}
std::cout << hash_out_str << '\n';
输出:
362945AD4A5F87F27D3DB3B4ADBACAEE0EBC3F778EE2FE76EF4FB09933148372
也就是说,我们需要copy/slice到一个RSA::PublicKey来调用OpenSSL兼容的DER编码方法
我一直在尝试使用 RSA 私钥创建 DER 编码的 public 密钥。我通常创建它的方式是使用命令行:
openssl rsa -pubout -outform DER -in ~/.keys/api_key.pem -out der_pub.der
当我使用 CryptoPP 创建此文件时,它们略有不同。它似乎有一个额外的部分。由 openssl 创建的那个有一点额外的部分。我假设这是 CryptoPP API 中提到的 BIT STRING。 https://www.cryptopp.com/docs/ref/class_r_s_a_function.html
void DEREncodePublicKey (BufferedTransformation &bt) const
encode subjectPublicKey part of subjectPublicKeyInfo, without the BIT STRING header
这是我的代码的样子:
...
CryptoPP::RSA::PrivateKey rsaPrivate;
rsaPrivate.BERDecodePrivateKey(queue, false /*paramsPresent*/, queue.MaxRetrievable());
CryptoPP::ByteQueue bq;
rsaPrivate.DEREncodePublicKey(bq);
CryptoPP::FileSink fs1("cryptopp_pub.der", true);
bq.TransferTo(fs1);
CryptoPP::RSA::DEREncodePublicKey encodes subjectPublicKey part of subjectPublicKeyInfo, without the BIT STRING header
尝试CryptoPP::RSA::PublicKey::DEREncode
。注意仅将此应用于 public 键,因为 RSA::PrivateKey 确实会重载 DEREncode 方法。
这里我使用的是 CryptoPP 8.2
从磁盘加载 DER 编码私钥
CryptoPP::RSA::PrivateKey private_key; { CryptoPP::FileSource file{"my.key", true}; private_key.BERDecodePrivateKey(file, false, -1); }
保存出DER编码的public密钥
CryptoPP::FileSink sink{"my.pub", true}; CryptoPP::RSA::PublicKey{private_key}.DEREncode(sink);
OpenSSL:
# generate a new RSA private key (DER format)
openssl genrsa | openssl rsa -outform DER -out my.key
# hash/fingerprint the public key
openssl rsa -in my.key -inform DER -pubout -outform DER | openssl sha256
writing RSA key
362945ad4a5f87f27d3db3b4adbacaee0ebc3f778ee2fe76ef4fb09933148372
# compare against hash of our code sample's generated public key
cat my.pub | openssl sha256
362945ad4a5f87f27d3db3b4adbacaee0ebc3f778ee2fe76ef4fb09933148372
再举个例子;如果我们希望 CryptoPP 生成 SHA256 指纹:
std::string hash_out_str;
{
CryptoPP::SHA256 sha256;
CryptoPP::HashFilter filter{
sha256,
new CryptoPP::HexEncoder{
new CryptoPP::StringSink{hash_out_str}
}
};
CryptoPP::RSA::PublicKey{private_key}.DEREncode(filter); // intentionally slice to ensure we aren't exposing a public key
filter.MessageEnd();
}
std::cout << hash_out_str << '\n';
输出:
362945AD4A5F87F27D3DB3B4ADBACAEE0EBC3F778EE2FE76EF4FB09933148372
也就是说,我们需要copy/slice到一个RSA::PublicKey来调用OpenSSL兼容的DER编码方法