You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi中将JWK格式的RSA公钥转换为PEM格式?

解决方案:Delphi中将RSA JWK公钥转换为PEM格式

一、使用Delphi JOSE and JWT Library实现

该库原生支持JWK解析,完全适配仅含n和e字段的公钥场景,步骤如下:

  1. 确保已正确安装库,项目中引用JOSE.Core.JWK、JOSE.Core.JWS、JOSE.Encoding.Base64、System.SysUtils单元。
  2. 核心转换代码:
uses
  System.SysUtils, JOSE.Core.JWK, JOSE.Core.JWS, JOSE.Encoding.Base64, JOSE.OpenSSL.Headers;

function JWKToPEM(const JWKJson: string): string;
var
  LJWK: TJWK;
  LPublicKey: TBytes;
begin
  LJWK := TJWK.Create;
  try
    // 解析JWK JSON字符串
    LJWK.LoadFromJSON(JWKJson);
    // 导出为PKCS#8格式公钥字节数组
    LPublicKey := LJWK.ToPublicKey;
    // 转换为标准PEM格式
    Result := '-----BEGIN PUBLIC KEY-----'#13#10 +
              TBase64.Encode(LPublicKey, True) + // 自动添加换行符
              #13#10'-----END PUBLIC KEY-----';
  finally
    LJWK.Free;
  end;
end;

// 使用示例
procedure TForm1.Button1Click(Sender: TObject);
const
  JWK_JSON = '{'+
             '  "kty": "RSA",'+
             '  "e": "AQAB",'+
             '  "kid": "55c188a83546fc188e51576ba72836e0600e8b73",'+
             '  "n": "q0CrF3x3aYsjr0YOLMOAhEGMvyFp6o4RqyEdUrnTDYkhZbcud-fJEQafCTnjS9QHN1IjpuK6gpx5i3-Z63vRjs5EQX7lP1jG8Qg-CnBdTTLw4uJi7RmmlKPsYaO1DbNkFO2uEN62sOOzmJCh1od3CZXI1UYH5cvZ_sLJaN2A4TwvUTU3aXlXbUNJz_Hy3l0q1Jjta75NrJtJ7Pfj9tVXs8qXp15tZXrnbaM-AI0puswt35VsQbmLwUovFFGeToo5q2c_c1xYnV5uQYMadANekGPRFPM9JZpSSIvH0Lv_f15V2zRqmIgX7a3RcmTnr3-w3QNQTogdy-MogxPUdRbxow"'+
             '}';
begin
  ShowMessage(JWKToPEM(JWK_JSON));
end;

说明:库会自动处理JWK中e和n的Base64URL解码,组装成PKCS#8格式公钥后转换为PEM。

二、使用Mormot2库实现

Mormot2加密模块对JWK支持完善,无需依赖外部库,步骤如下:

  1. 项目中引用SynCrypto、SynEcc、SynJSON、System.SysUtils单元。
  2. 核心转换代码:
uses
  System.SysUtils, SynCrypto, SynEcc, SynJSON;

function JWKToPEM_Mormot(const JWKJson: string): string;
var
  LJson: TJSONObject;
  LRSA: TRSA;
  LN, LE: TBytes;
begin
  LJson := TJSONObject.ParseJSONValue(JWKJson) as TJSONObject;
  try
    // 解码JWK中的n和e字段
    LN := Base64URLDecode(LJson.Get('n').Value);
    LE := Base64URLDecode(LJson.Get('e').Value);
    // 初始化RSA公钥实例
    LRSA := TRSA.Create;
    try
      LRSA.PublicFromNE(LN, LE);
      // 直接导出为PEM格式
      Result := LRSA.PublicKeyToPEM;
    finally
      LRSA.Free;
    end;
  finally
    LJson.Free;
  end;
end;

// 使用示例
procedure TForm1.Button2Click(Sender: TObject);
const
  JWK_JSON = '{'+
             '  "kty": "RSA",'+
             '  "e": "AQAB",'+
             '  "kid": "55c188a83546fc188e51576ba72836e0600e8b73",'+
             '  "n": "q0CrF3x3aYsjr0YOLMOAhEGMvyFp6o4RqyEdUrnTDYkhZbcud-fJEQafCTnjS9QHN1IjpuK6gpx5i3-Z63vRjs5EQX7lP1jG8Qg-CnBdTTLw4uJi7RmmlKPsYaO1DbNkFO2uEN62sOOzmJCh1od3CZXI1UYH5cvZ_sLJaN2A4TwvUTU3aXlXbUNJz_Hy3l0q1Jjta75NrJtJ7Pfj9tVXs8qXp15tZXrnbaM-AI0puswt35VsQbmLwUovFFGeToo5q2c_c1xYnV5uQYMadANekGPRFPM9JZpSSIvH0Lv_f15V2zRqmIgX7a3RcmTnr3-w3QNQTogdy-MogxPUdRbxow"'+
             '}';
begin
  ShowMessage(JWKToPEM_Mormot(JWK_JSON));
end;

说明:Base64URLDecode专门处理JWK的编码格式,PublicFromNE直接用n、e字节数组初始化公钥,PublicKeyToPEM输出标准PEM内容。


内容的提问来源于stack exchange,提问作者Steve F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:37:31