首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Delphi中将JSON密钥转换成PEM格式?

如何在Delphi中将JSON密钥转换成PEM格式?
EN

Stack Overflow用户
提问于 2021-03-07 19:34:52
回答 2查看 1.3K关注 0票数 2

早些时候我发现表示,在使用JWT图书馆中的签名之前,我需要将JSON密钥(JWK)转换为PEM格式。

JWK格式的原始私钥:

代码语言:javascript
运行
复制
{
  "kty": "EC",
  "d": "Rwyv99W3GnfjYbI0X-b5Umhvh88oRCKQkPxiwCPVGgg",
  "crv": "P-256",
  "x": "sDbcYT8HzBk1tUl849ZHrhpIn8ZV7HfD1DwYdsP1ip0",
  "y": "EWodfKWQ6oE0ppyi7tRO_61BgAQsZyDjDGj9kLZiUts"
}

需要获得PEM格式,如下所示:

代码语言:javascript
运行
复制
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIEcMr/fVtxp342GyNF/m+VJob4fPKEQikJD8YsAj1RoIoAoGCCqGSM49
AwEHoUQDQgAEsDbcYT8HzBk1tUl849ZHrhpIn8ZV7HfD1DwYdsP1ip0Rah18pZDq
gTSmnKLu1E7/rUGABCxnIOMMaP2QtmJS2w==
-----END EC PRIVATE KEY-----

有一个在线转换器可以满足我的需要。是否可以在Delphi中进行同样的转换?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-03 22:34:13

找到了解决办法。阅读详细信息这里

简化示例:

代码语言:javascript
运行
复制
uses
  JSON,
  EncdDecd;

function Base64urlToBase64(Base64urlStr: String): String;
begin
  Result := StringReplace(Base64urlStr,'_','/', [rfReplaceAll]);
  Result := StringReplace(Result,'-','+', [rfReplaceAll]);
end;

function JwkToPem(JWK: TJSONObject): String;
var
  BinKey: TBytes;
begin
  BinKey :=

  [$30] + // ASN.1
  [$77] + // Length of all following bytes (119 bytes)

  [$02] + // Type (integer)
  [$01] + // Length of integer (1 byte)
  [$01] + // Value of integer (1)

  [$04] + // Type (octet string)
  [$20] + // Length of string (32 bytes)
  DecodeBase64(Base64urlToBase64(JWK.Get('d').JsonValue.Value)) +  // Private Key

  [$A0] + // Tag 0
  [$0A] + // Length of tag (10 bytes)
  [$06] + // Type (Object ID)
  [$08] + // Length of the Object ID (8 bytes)
  [$2A, $86, $48, $CE, $3D, $03, $01, $07] + // - The object ID of the curve prime256v1

  [$A1] + // Tag 1
  [$44] + // Length of tag (68 bytes)
  [$03] + // Type – Bit string
  [$42] + // Length of the bit string (66 bytes)
  [$00] + // ???
  [$04] + // Uncompressed Public Key
  DecodeBase64(Base64urlToBase64(JWK.Get('x').JsonValue.Value))+ // Public Key X coord
  DecodeBase64(Base64urlToBase64(JWK.Get('y').JsonValue.Value)); // Public Key Y coord

  Result :=
  '-----BEGIN EC PRIVATE KEY-----'+#13#10+
  EncodeBase64(Pointer(BinKey), Length(BinKey))+#13#10+
  '-----END EC PRIVATE KEY-----';
end;
票数 0
EN

Stack Overflow用户

发布于 2021-03-07 20:19:06

在低级别的OpenSSL中,您将拥有所需的一切。

它的API有点神秘,但是您可以使用EC_POINT*()函数来完成它。

检查我们在mormot.crypt.openssl中使用低级别ECC私钥所做的工作,并将它们与OpenSSL集成:

  • ecdsa_sign_osl,它获取原始私钥并将其转换为OpenSSL PEC_KEY
  • OpenSslSaveKeys,它将该密钥保存为PEM。

您只需要导出"d": "Rwyv99W3GnfjYbI0X-b5Umhvh88oRCKQkPxiwCPVGgg"参数。它似乎是与TEccPrivateKey相同的布局,在ecdsa_sign_osl()中用作输入参数。

您还可以在mormot.crypt.ecc256r1.pas中找到一些纯粹的pascal代码计算ECC prime256v1。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66520594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档