{"id":277078,"date":"2016-03-28T11:44:02","date_gmt":"2016-03-28T07:44:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=277078"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=277078","title":{"rendered":"RSA \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 OpenSSL \u0432 Delphi"},"content":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/63e\/38c\/dc5\/63e38cdc545c4eb0995687d2c7c63a0a.PNG\"\/><\/p>\n<p>  \u041f\u043e \u0434\u043e\u043b\u0433\u0443 \u0441\u043b\u0443\u0436\u0431\u044b \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u0445 \u043f\u043e\u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c RSA, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447\u0438 \u0432 PEM \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u041f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 OpenSSL. \u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 Delphi. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0432 \u041e\u0421 Windows, \u0441\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Borland Delphi 7.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u0421 \u0447\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c?<\/h4>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043f\u0430\u043a\u0435\u0442 openssl, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libeay32.dll. \u0418 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u044e\u043d\u0438\u0442 <a href=\"https:\/\/github.com\/ddlencemc\/RSA-via-OpenSSL-libeay32\/blob\/master\/libeay32.pas\">libeay32.pas<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443. \u0412 \u043c\u043e\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0441\u043d\u0438\u0437\u0443 \u0441\u0442\u0430\u0442\u044c\u0438. \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447\u0435\u0439 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0441\u0430\u043c openssl \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438 \u0438\u0437 cmd:<\/p>\n<pre><code class=\"bash\">openssl genrsa 1024 &gt; private.pem openssl rsa -in private.pem -pubout &gt; public.pem <\/code><\/pre>\n<p>  \u0413\u0434\u0435 1024 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0438\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043b\u044e\u0447\u0430. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u043e\u0442 \u0431\u0438\u0442\u043d\u043e\u0441\u0442\u0438 \u043a\u043b\u044e\u0447\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0438 \u0434\u043b\u0438\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u043a\u043b\u044e\u0447 1024 \u0431\u0438\u0442\u0430, \u0442\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043c\u043e\u0436\u0435\u043c \u0432\u0441\u0435\u0433\u043e 128 \u0431\u0430\u0439\u0442, \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0440\u0430\u0432\u0435\u043d \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u043a\u043b\u044e\u0447\u0430. \u041d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430\u0436\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b RSA \u043a\u043b\u044e\u0447\u0430. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435. \u0414\u0430\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u0441\u044f \u043d\u0430 11 \u0431\u0430\u0439\u0442, \u0435\u0441\u043b\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <b>padding<\/b>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0430 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 <b>PKCS#1<\/b>. <\/p>\n<p>  \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0432 \u043a\u043b\u044e\u0447 \u0432 2048 \u0431\u0438\u0442, \u0441\u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c 256 \u0431\u0430\u0439\u0442. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d \u0432\u0441\u0435\u0433\u043e 1 \u0431\u0430\u0439\u0442. <\/p>\n<p>  \u0414\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u044b\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e 117 \u0431\u0430\u0439\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u043c\u0435\u0449\u0430\u043b\u0438\u0441\u044c \u043a\u0430\u0440\u0442\u043e\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a \u0432 \u0431\u0430\u0437\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0440\u043e\u0441. \u041d\u043e \u0442\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c.<\/p>\n<h4>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <\/h4>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435, \u0447\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u2014 \u044d\u0442\u043e:<\/p>\n<h6>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0440\u0438\u043f\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h6>\n<p>  <\/p>\n<pre><code class=\"delphi\">OpenSSL_add_all_algorithms; OpenSSL_add_all_ciphers; OpenSSL_add_all_digests; ERR_load_crypto_strings; ERR_load_RSA_strings; <\/code><\/pre>\n<p>  Destroy<\/p>\n<pre><code class=\"delphi\">EVP_cleanup;  ERR_free_strings; <\/code><\/pre>\n<p>  <\/p>\n<h6>\u0427\u0442\u0435\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0435\u0439<\/h6>\n<p>  <\/p>\n<pre><code class=\"delphi\">\/\/\u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 PEM, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 RSA \/\/\u0413\u0434\u0435 bp \u0444\u0430\u0439\u043b \u043a\u043b\u044e\u0447\u0430, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0432 RSA \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 x, cb \u2013 \u0430\u0434\u0440\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c\u0430\u044f \u043f\u0430\u0440\u043e\u043b\u044c \u043a \u043a\u043b\u044e\u0447\u0443.  function PEM_read_bio_PrivateKey(bp: pBIO; var x: pEVP_PKEY;     cb: TPWCallbackFunction; u: pointer): pEVP_PKEY; cdecl;  \/\/\u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 PEM, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 RSA function PEM_read_bio_PUBKEY(bp: pBIO; var x: pEVP_PKEY;     cb: TPWCallbackFunction; u: pointer): pEVP_PKEY; cdecl; <\/code><\/pre>\n<p>  <\/p>\n<h6>\u0418 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0448\u0438\u0444\u0440\u0430\u0446\u0438\u0438\/\u0434\u0435\u0448\u0438\u0444\u0440\u0430\u0446\u0438\u0438<\/h6>\n<p>  <\/p>\n<pre><code class=\"delphi\">\/\/\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435\/\u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 flen \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 from \u0432 \u0431\u0443\u0444\u0435\u0440 _to \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 RSA \u043a\u043b\u044e\u0447\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u0435\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f  \/\/\u0434\u0430\u043d\u043d\u044b\u0445 padding. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u043b\u0438\u043d\u0443 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e\/\u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u043b\u0438 -1 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \/\/\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c function RSA_public_encrypt(flen: integer; from: PCharacter; _to: PCharacter; rsa: pRSA; padding: integer): integer; cdecl;  \/\/\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c function RSA_private_encrypt(flen: integer; from: PCharacter; _to: PCharacter; rsa: pRSA; padding: integer): integer; cdecl;  \/\/\u0414\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c function RSA_public_decrypt(flen: integer; from: PCharacter; _to: PCharacter; rsa: pRSA; padding: integer): integer; cdecl;  \/\/\u0414\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043a\u043b\u044e\u0447\u043e\u043c function RSA_private_decrypt(flen: integer; from: PCharacter; _to: PCharacter; rsa: pRSA; padding: integer): integer; cdecl; <\/code><\/pre>\n<p>  <\/p>\n<h4>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/h4>\n<p>  \u0418\u0442\u0430\u043a, \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u044e\u0447\u0438, dll-\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 \u043f\u0430\u043f\u043a\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c, liblea32.pas \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u0432 uses. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 openssl:<\/p>\n<pre><code class=\"delphi\">procedure LoadSSL; begin   OpenSSL_add_all_algorithms;   OpenSSL_add_all_ciphers;   OpenSSL_add_all_digests;   ERR_load_crypto_strings;   ERR_load_RSA_strings; end;  procedure FreeSSL; begin   EVP_cleanup;   ERR_free_strings; end; <\/code><\/pre>\n<p>  <\/p>\n<h5>\u041f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u043b\u044e\u0447\u0435\u0439.<\/h5>\n<p>  KeyFile \u2013 \u043f\u0443\u0441\u0442\u044c \u0434\u043e \u043a\u043b\u044e\u0447\u0430 (&#8216;C:\\key.pem&#8217;):<\/p>\n<pre><code class=\"delphi\">function LoadPublicKey(KeyFile: string) :pEVP_PKEY ; var   mem: pBIO;   k: pEVP_PKEY; begin   k:=nil;   mem := BIO_new(BIO_s_file()); \/\/BIO \u0442\u0438\u043f\u0430 \u0444\u0430\u0439\u043b   BIO_read_filename(mem, PAnsiChar(KeyFile)); \/\/ \u0447\u0442\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043a\u043b\u044e\u0447\u0430 \u0432 BIO   try     result := PEM_read_bio_PUBKEY(mem, k, nil, nil); \/\/\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 BIO  \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 pEVP_PKEY, \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0443\u043a\u0430\u0437\u0430\u043d nil, \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0434\u043b\u044f \u043a\u043b\u044e\u0447\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c   finally     BIO_free_all(mem);   end; end;  function LoadPrivateKey(KeyFile: string) :pEVP_PKEY; var   mem: pBIO;   k: pEVP_PKEY; begin   k := nil;   mem := BIO_new(BIO_s_file());   BIO_read_filename(mem, PAnsiChar(KeyFile));   try     result := PEM_read_bio_PrivateKey(mem, k, nil, nil);   finally     BIO_free_all(mem);   end; end; <\/code><\/pre>\n<p>  <\/p>\n<h6>\u0412\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h6>\n<p>  <\/p>\n<pre><code class=\"delphi\">var FPublicKey: pEVP_PKEY; FPrivateKey: pEVP_PKEY; err: Cardinal; \u2026 FPublicKey := LoadPublicKey(\u2018C:\\public.key\u2019);  FPrivateKey := LoadPrivateKey(\u2018C:\\private.key\u2019);    \/\/if FPrivateKey = nil then \/\/ \u0435\u0441\u043b\u0438 \u043a\u043b\u044e\u0447 \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f, \u0442\u043e \u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443 if FPublicKey = nil then    begin \terr := ERR_get_error; \trepeat \t\tlog.Lines.Add(string(ERR_error_string(err, nil))); \t\terr := ERR_get_error; \tuntil err = 0; \tend; <\/code><\/pre>\n<p>  <\/p>\n<h5>\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 <\/h5>\n<p>  <\/p>\n<pre><code class=\"delphi\">var \trsa: pRSA; \/\/ \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 RSA \tsize: Integer; \tFCryptedBuffer: pointer; \/\/ \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440  \tb64, mem: pBIO;  \tstr, data: AnsiString;  \tlen, b64len: Integer;  \tpenc64: PAnsiChar; \tsize: Integer; \terr: Cardinal begin \trsa := EVP_PKEY_get1_RSA(FPrivateKey); \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 RSA \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \tEVP_PKEY_free(FPrivateKey); \/\/ \u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 pEVP_PKEY \tsize := RSA_size(rsa); \/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u043b\u044e\u0447\u0430 \tGetMem(FCryptedBuffer, size); \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0432\u044b\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \tstr := AnsiString(\u2018Some text to encrypt\u2019); \/\/ \u0421\u0442\u0440\u043e\u043a\u0430 \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f  \t\/\/\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \tlen := RSA_private_encrypt(Length(str),  \/\/ \u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \t\t\t\t\t\t\t  PAnsiChar(str),  \/\/ \u0421\u0442\u0440\u043e\u043a\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \t\t\t\t\t\t\t  FCryptedBuffer,  \/\/ \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 \t\t\t\t\t\t\t  rsa, \/\/ \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043b\u044e\u0447\u0430 \t\t\t\t\t\t\t  RSA_PKCS1_PADDING \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \t\t\t\t\t\t\t  );  \tif len &gt; 0 then \/\/ \u0434\u043b\u0438\u043d\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \t  begin \t  \/\/ \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0432 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 base64 \t\tb64 := BIO_new(BIO_f_base64); \/\/ BIO \u0442\u0438\u043f\u0430 base64 \t\tmem := BIO_push(b64, BIO_new(BIO_s_mem)); \/\/ Stream \t\ttry \t\t\tBIO_write(mem, FCryptedBuffer, len); \/\/ \u0417\u0430\u043f\u0438\u0441\u044c \u0432 Stream \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \t\t\tBIO_flush(mem); \t\t\tb64len := BIO_get_mem_data(mem, penc64); \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 base64 \t\t\tSetLength(data, b64len); \/\/ \u0437\u0430\u0434\u0430\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0443\u0444\u0435\u0440\u0443 \t\t\tMove(penc64^, PAnsiChar(data)^, b64len); \/\/ \u041f\u0435\u0440\u0435\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0432 \u0431\u0443\u0444\u0435\u0440 data \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 base64  \t\tfinally \t\t\tBIO_free_all(mem); \t\tend; \t  end \t  else \t  begin \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 -1 \t\terr := ERR_get_error; \t\trepeat \t\t\tlog.Lines.Add(string(ERR_error_string(err, nil))); \t\t\terr := ERR_get_error; \t\tuntil err = 0; \t  end; \tRSA_free(rsa); end; <\/code><\/pre>\n<p>  <\/p>\n<h5>\u0414\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h5>\n<p>  <\/p>\n<pre><code class=\"delphi\">var   rsa: pRSA;   out_: AnsiString;   str, data: PAnsiChar;   len, b64len: Integer;   penc64: PAnsiChar;   b64, mem, bio_out, bio: pBIO;   size: Integer;   err: Cardinal; begin \t\/\/ACryptedData : string; \/\/ \u0421\u0442\u0440\u043e\u043a\u0430 \u0432 base64 \trsa := EVP_PKEY_get1_RSA(FPublicKey); \tsize := RSA_size(rsa); \tGetMem(data, size);  \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0431\u0443\u0444\u0435\u0440\u0443 \u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \tGetMem(str, size); \/\/ \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0431\u0443\u0444\u0435\u0440\u0443 \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438\u0437 base64  \t\/\/Decode base64 \tb64 := BIO_new(BIO_f_base64); \tmem := BIO_new_mem_buf(PAnsiChar(ACryptedData), Length(ACryptedData)); \tBIO_flush(mem); \tmem := BIO_push(b64, mem); \tBIO_read(mem, str , Length(ACryptedData)); \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \tBIO_free_all(mem); \t\/\/ \u0414\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \tlen := RSA_public_decrypt(size, PAnsiChar(str), data, rsa, RSA_PKCS1_PADDING); \tif len &gt; 0 then \tbegin\t \t\/\/ \u0432 \u0431\u0443\u0444\u0435\u0440 data \u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441 \u00ab\u043c\u0443\u0441\u043e\u0440\u043e\u043c\u00bb \u0432 \u043a\u043e\u043d\u0446\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0447\u0438\u0449\u0430\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 out_ \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043d\u0435\u0435 \u043d\u0443\u0436\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0439\u0442 \u0438\u0437 data \t\tSetLength(out_, len);  \t\tMove(data^, PAnsiChar(out_ )^, len); \tend \telse     begin \/\/ \u0447\u0438\u0442\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u0434\u043b\u0438\u043d\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 -1 \t\terr := ERR_get_error; \t\trepeat \t\t\tlog.Lines.Add(string(ERR_error_string(err, nil))); \t\t\terr := ERR_get_error; \t\tuntil err = 0; \tend; end; <\/code><\/pre>\n<p>  <\/p>\n<h5>\u0418 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430 \u00ab\u0437\u0430\u0448\u0438\u0442\u043e\u0433\u043e\u00bb \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/h5>\n<p>  <\/p>\n<pre><code class=\"delphi\">var   mem, keybio: pBIO;   k: pEVP_PKEY;   keystring: AnsiString; begin   keystring :=   '-----BEGIN RSA PRIVATE KEY-----' + #10 +   'MIICXgIBAAKBgQCfydli2u2kJfb2WetkOekjzQIg7bIuU7AzAlBUPuA72UYXWnQ\/' + #10 +   'XcdSzEEMWSBLP7FO1vyVXR4Eb0\/WqthF0ZViOK5bCN9CnR\/1GMMiSqmIdByv\/gUe' + #10 +   'Z\/UjGrKmxeQOoa2Yt0MJC64cNXgnKmYC7ui3A12LlvNdBBEF3WpcDbv+PQIDAQAB' + #10 +   'AoGBAJnxukKHchSHjxthHmv9byRSyw42c0g20LcUL5g6y4Zdmi29s+moy\/R1XOYs' + #10 +   'p\/RXdNfkQI0WnWjgZScIij0Z4rSs39uh7eQ5qxK+NH3QIWeR2ZNIno9jAXPn2bkQ' + #10 +   'odS8FPzbZM9wHhpRvKW4FNPXqTc3ZkTcxi4zOwOdlECf9G+BAkEAzsJHgW1Isyac' + #10 +   'I61MDu2qjMUwOdOBYS8GwEBfi\/vbn\/duwZIBXG\/BZ7Pn+cBwImfksEXwx0MTkgF3' + #10 +   'gyaChUSu+QJBAMXX3d94TwcF7lG9zkzc+AR\/Onl4Z5UAb1GmUV57oYIFVgW1RIOk' + #10 +   'vqynXWrTjTOg9C9j+VEpBG67LcnkwU16JmUCQH7pukKz9kAhnw43PcycDmhCUgvs' + #10 +   'zCn\/V8GCwiOHAZT7qLyhBrzazHj\/cZFYknxMEZAyHk3x2n1w8Q9MACoVsuECQQDF' + #10 +   'U7cyara31IyM7vlS5JpjMdrKyPLXRKXDFFXYHQtLubLA4rlBbBHZ9txP7kzJj+G9' + #10 +   'WsOS1YxcPUlAM28xrYGZAkEArVKJHX4dF8UUtfvyv78muXJZNXTwmaaFy02xjtR5' + #10 +   'uXWT1QjVN2a6jv6AW7ukXiSoE\/spgfvdoriMk2JSs88nUw==' + #10 +   '-----END RSA PRIVATE KEY-----' ;   k := nil;     keybio := BIO_new_mem_buf(Pchar(keystring), -1);   mem := BIO_new(BIO_s_mem());   BIO_read(mem, PAnsiChar(keystring), length(PAnsiChar(keystring)));   try     result := PEM_read_bio_PrivateKey(keybio, k, nil, nil);   finally     BIO_free_all(mem);   end; end; <\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 <a href=\"https:\/\/github.com\/ddlencemc\/RSA-via-OpenSSL-libeay32\">Github<\/a>.<\/p>\n<h5>\u0418\u0442\u043e\u0447\u043d\u0438\u043a\u0438:<\/h5>\n<p>  <\/p>\n<ul>\n<li>\u0421\u0442\u0430\u0442\u044c\u044f \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u0430 \u041c\u0435\u0448\u043a\u043e\u0432\u0430 <a href=\"https:\/\/www.opennet.ru\/docs\/RUS\/use_openssl\/\">\u00ab\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 OpenSSL \u0434\u043b\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0437\u0430\u0449\u0438\u0442\u044b \u0434\u0430\u043d\u043d\u044b\u0445\u00bb<\/a><\/li>\n<li><a href=\"http:\/\/www.disi.unige.it\/person\/FerranteM\/delphiopenssl\/RSAEncrypt.html\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430<\/a><\/li>\n<li><a href=\"http:\/\/www.disi.unige.it\/person\/FerranteM\/delphiopenssl\/AskPassphrase.html\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0430 \u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043f\u0430\u0440\u043e\u043b\u044f \u043e\u0442 \u0430\u0432\u0442\u043e\u0440\u0430 libeay32.pas<\/a><\/li>\n<li><a href=\"http:\/\/www.disi.unige.it\/person\/FerranteM\/delphiopenssl\/\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u044b \u043a\u043b\u044e\u0447\u0435\u0439, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430 SHA1 \u0438 \u043a\u043e\u0435 \u0447\u0442\u043e \u0435\u0449\u0435<\/a><\/li>\n<\/ul>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/280302\/\"> https:\/\/habrahabr.ru\/post\/280302\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>       <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/63e\/38c\/dc5\/63e38cdc545c4eb0995687d2c7c63a0a.PNG\"\/><\/p>\n<p>  \u041f\u043e \u0434\u043e\u043b\u0433\u0443 \u0441\u043b\u0443\u0436\u0431\u044b \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u0445 \u043f\u043e\u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c RSA, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447\u0438 \u0432 PEM \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u041f\u0440\u0438 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0432\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 OpenSSL. \u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 Delphi. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438\u0441\u044c \u0432 \u041e\u0421 Windows, \u0441\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Borland Delphi 7.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-277078","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/277078","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=277078"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/277078\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=277078"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=277078"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=277078"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}