无法读取RSA公钥

时间:2014-09-03 02:59:43

标签: delphi encryption openssl rsa firemonkey

我试图读取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

1 个答案:

答案 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方法。

不确定这对您的情况是否有帮助。