.NET RSA 算法的 XML 格式简介及其转换 PEM 格式


前言

最近代码审计遇到了源码硬编码了公私钥,趁机学习一下 .NET 中的 RSA 算法的 XML格式及其互转常见的 PEM 格式

常见 .NET 的 XML 格式 公私钥格式

公钥

<RSAKeyValue><Modulus>xxxxxxxxxx</Modulus><Exponent>xxxx</Exponent></RSAKeyValue>

在这个 XML 格式中包含了 RSA 的 Modulus(模数)和 Exponent(指数)。

  • <Modulus> 标签包含了 RSA 公钥的模数,它是一个大整数,通常以 Base64 编码表示。
  • <Exponent> 标签包含了 RSA 公钥的指数,也是一个整数,通常以 Base64 编码表示。

私钥

<RSAKeyValue>
    <Modulus>...</Modulus>
    <Exponent>...</Exponent>
    <P>...</P>
    <Q>...</Q>
    <DP>...</DP>
    <DQ>...</DQ>
    <InverseQ>...</InverseQ>
    <D>...</D>
</RSAKeyValue>

在这个 XML 格式中包含了 RSA 的 Modulus(模数)、Exponent(指数)以及私钥的一些其他参数。

  • <Modulus> 标签包含了 RSA 私钥的模数,它是一个大整数,通常以 Base64 编码表示。
  • <Exponent> 标签包含了 RSA 私钥的指数,也是一个整数,通常以 Base64 编码表示。
  • <P><Q><DP><DQ><InverseQ><D> 标签包含了用于私钥运算的其他参数,包括质因数、CRT 参数等。这些参数一起构成了私钥的完整信息。

在给定的 XML 中,除了 Modulus 和 Exponent 外,还包含了 <P><Q><DP><DQ><InverseQ><D> 等参数,这些参数用于 RSA 私钥的计算过程。
这个 XML 格式描述了 RSA 私钥的关键参数,如果需要在 .NET 中使用这个私钥进行 RSA 加密或解密等操作,可以将这个 XML 格式的私钥加载到相应的 .NET RSA 密钥容器中。

XML 转 PEM

XML 格式的 RSA 私钥转换为通用的 PEM 格式的私钥(Privacy Enhanced Mail)。PEM 格式是一种 ASCII 编码的文本格式,常用于存储和传输密钥和证书。

将 XML 格式的私钥内容提取出来,去除掉标签 <RSAKeyValue></RSAKeyValue>

将提取出的内容进行 Base64 解码,得到二进制数据。

将二进制数据转换为 PEM 格式的字符串,并在开头和结尾添加 -----BEGIN RSA PRIVATE KEY----------END RSA PRIVATE KEY----- 标签。

下面是一个示例 Python 代码,用于将 XML 格式的私钥转换为 PEM 格式的私钥:

import base64

xml_private_key = """
<RSAKeyValue>
    <Modulus>...</Modulus>
    <Exponent>...</Exponent>
    <P>...</P>
    <Q>...</Q>
    <DP>...</DP>
    <DQ>...</DQ>
    <InverseQ>...</InverseQ>
    <D>...</D>
</RSAKeyValue>
"""

# 提取私钥内容并进行 Base64 解码
private_key_content = """
...  # 提取出 Modulus、Exponent、P、Q、DP、DQ、InverseQ、D 的值
"""
private_key_binary = base64.b64decode(private_key_content)

# 转换为 PEM 格式并添加标签
pem_private_key = f"-----BEGIN RSA PRIVATE KEY-----\n{private_key_binary.decode('ascii')}\n-----END RSA PRIVATE KEY-----"

print(pem_private_key)

也可以使用在线的 XML 转 PEM 格式工具,如 https://www.ssleye.com/ssltool/pem_xml.html
转换后即可使用 常用的RSA工具进行加解密,如 http://travistidwell.com/jsencrypt/demo/



扫描二维码,在手机上阅读

推荐阅读:

linglong:一款甲方资产巡航扫描系统的JWT硬编码密钥之殇

PHP 中与或运算符优先级导致的安全问题

评 论
更换验证码