如何在Delphi中将JWK格式的RSA公钥转换为PEM格式?
解决方案:Delphi中将RSA JWK公钥转换为PEM格式
一、使用Delphi JOSE and JWT Library实现
该库原生支持JWK解析,完全适配仅含n和e字段的公钥场景,步骤如下:
- 确保已正确安装库,项目中引用
JOSE.Core.JWK、JOSE.Core.JWS、JOSE.Encoding.Base64、System.SysUtils单元。 - 核心转换代码:
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支持完善,无需依赖外部库,步骤如下:
- 项目中引用
SynCrypto、SynEcc、SynJSON、System.SysUtils单元。 - 核心转换代码:
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
相关产品推荐
相关产品推荐

