前言
最近代码审计遇到了源码硬编码了公私钥,趁机学习一下 .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/