fudiwei / DotNetCore.SKIT.FlurlHttpClient.Wechat

可能是全网最完整的 C# 版微信 SDK,封装全部已知的微信 OpenAPI,包含微信公众平台(订阅号+服务号+小程序+小游戏+小商店+视频号)、微信开放平台、微信商户平台(微信支付+微企付)、企业微信、微信广告平台、微信智能对话开放平台等模块,可跨平台。持续随官方更新,欢迎 Star/Fork/PR。QQ 交流群 875580418【满】、930461548【满】、611974621。
https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient
MIT License
1.5k stars 289 forks source link

企业微信会话存档解密 rsa密钥前后不一致 #127

Closed QY-WindRises closed 6 months ago

QY-WindRises commented 6 months ago

关于问题的简单描述

添加密钥时开头-----BEGIN RSA PRIVATE KEY-----包含 RSA 解密时判断中开头不包含RSA


与问题相关的源代码

文档:

manager.AddEntry(new EncryptionKeyEntry(1, "-----BEGIN RSA PRIVATE KEY----- 消息加解密私钥 PKCS#1 PEM 内容 -----END RSA PRIVATE KEY-----"));

解密方法

 byte[] privateKeyBytes = ConvertPrivateKeyPemToByteArray(privateKeyPem);
private static byte[] ConvertPrivateKeyPemToByteArray(string privateKeyPem)
{
    if (!privateKeyPem.StartsWith("-----BEGIN PRIVATE KEY-----"))
    using TextReader reader = new StringReader(privateKeyPem);
    using PemReader pemReader = new PemReader(reader);
    object obj = pemReader.ReadObject();
...
}

异常堆栈或异常原因 运行到object obj = pemReader.ReadObject();这行时报错 Org.BouncyCastle.OpenSsl.PemException:“malformed sequence in RSA private key”


发生问题的运行环境

请在此填写以下几项内容:

  1. 操作系统:Windows 10
  2. .NET 版本:.NET Framework4.8.0
  3. 使用的模块及版本:SKIT.FlurlHttpClient.Wechat.Work 3.1.0

补充说明

fudiwei commented 6 months ago

这里的判断是为了同时兼容 PKCS#1 和 PKCS#8 两种格式。

抛这个异常大概率是你把两种格式混在一起了,你有 PKCS#1 格式的 PEM 你就传 PKCS#1 格式的私钥,你有 PKCS#8 格式的 PEM 那就传 PKCS#8 格式的私钥。但不能拿着 PKCS#8 格式的 PEM,自己把开头的 BEGIN PUBLIC KEY 改成 BEGIN RSA PUBLIC KEY

QY-WindRises commented 6 months ago

这里的判断是为了同时兼容 PKCS#1 和 PKCS#8 两种格式。

抛这个异常大概率是你把两种格式混在一起了,你有 PKCS#1 格式的 PEM 你就传 PKCS#1 格式的私钥,你有 PKCS#8 格式的 PEM 那就传 PKCS#8 格式的私钥。但不能拿着 PKCS#8 格式的 PEM,自己把开头的 BEGIN PUBLIC KEY 改成 BEGIN RSA PUBLIC KEY

感谢解答。可能是这样,生成密钥时稀里糊涂的就操作了,没有看密钥格式。