我试图读取RSA公钥,但 PEM_read_bio_RsaPublicKey 返回0; 私钥的相同代码( PEM_read_bio_RsaPrivateKey )可以正常工作。
function TForm1.ReadPublicKey(AFileName: TFileName): pRSA;
var
keyfile: pBIO;
begin
keyfile := BIO_new(BIO_s_file());
BIO_read_filename(keyfile, PAnsiChar(UTF8Encode(AFileName)));
result := PEM_read_bio_RsaPublicKey(keyfile, nil, nil, nil);
if result = nil then
raise Exception.Create('Unable to read public key. ' + GetErrorMessage);
end;
我使用Delphi XE6 + OpenSSL库1.0.1i + Indy标头IdSSLOpenSSLHeaders,IdSSLOpenSSLHeaders_static。
使用此命令行生成私钥和公钥...
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
......看起来像:
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDyYSxGmR95H9tO2Be82RyFd0KzqCH64D0ssUtURbYw4qJTeKln
..cut..
fKcHkq+cl7KKVi+nocAO8sUzzzBFy9TlXbx8cgN/PIFwvw==
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDyYSxGmR95H9tO2Be82RyFd0Kz
..cut..
WdCa/uFKyfIJHsQiuwIDAQAB
-----END PUBLIC KEY-----
现在让我疯狂了3天。如果有人知道这里有什么问题或者其他解密MacOS / Firemonkey中使用PHP在线生成的RSA字符串的方法 - 请告诉我!我尝试了一些我可以安装的Lockbox版本,但它与OpenSSL密钥不兼容......
更新:错误代码
error:0906D06C:lib(9):func(109):reason(108)
error:0906D06C:PEM routines:PEM_read_bio:no start line
答案 0 :(得分:0)
自从我触及其中任何一个已经很长一段时间但是我永远无法让PEM_read_bio_RsaPublicKey在Delphi中工作。我尝试了很长时间但最终使用了类似以下内容的公钥:
function LoadPublicKey(const AFileName: string): PEVP_PKEY;
var
bp: pBIO;
utf8file: RawByteString;
begin
// This is for SubjectPublicKeyInfo keys. ie those that
// start -----BEGIN PUBLIC KEY-----
utf8file := UTF8Encode(AFileName);
bp := BIO_new(BIO_s_file());
BIO_read_filename(bp, PAnsiChar(utf8file));
result := PEM_read_bio_PUBKEY(bp, nil, nil, nil);
if result = nil then
raise Exception.Create(sLoadPublicKeyFailed + GetSSLErrorMessage);
end;
这将返回一个PEVP_KEY,然后我可以在EVP *例程中使用它。事实证明,使用这种方法比使用EVP_PKEY_assign(...)将RSA密钥转换为EVP密钥更容易。
我还使用类似的私有密钥例程和PEM_read_bio_PrivateKey方法。
不确定这对您的情况是否有帮助。