【问题标题】:Couldn't read RSA public key无法读取 RSA 公钥
【发布时间】:2014-09-03 02:59:43
【问题描述】:

我正在尝试读取 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 libs 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

【问题讨论】:

    标签: delphi encryption openssl rsa firemonkey


    【解决方案1】:

    我已经有很长时间没有接触到这些了,但我永远无法让 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 方法对私钥使用了类似的例程。

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

    【讨论】:

    • 是的,这一定是最简单的方法。我对 libeay32.pas 做了一些更改(Indy 不知道 PEM_read_bio_PUBKEY,只有 PEM_read_bio_RsaPublicKey),它终于可以工作了!谢谢。
    • 啊,是的。我忘记了libeay32。我们为该项目拥有的 Indy 版本非常旧,因此我们制作了自己的 libeay32.pas 版本,将其部分内容委托给 IdSSLOpenSSLHeaders,然后我们添加了 EVP_ 例程和缺少的 PEM_ 方法。它确实涉及大量阅读 OpenSSL 源代码!
    猜你喜欢
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2010-11-19
    • 2012-07-05
    • 2014-09-12
    • 2019-05-10
    • 2019-01-13
    • 1970-01-01
    相关资源
    最近更新 更多