Chilkat .NET v9.5.0.99能否接收AES-128-GCM加密邮件?
问题解答
1. 报错原因与是否为bug
1.2.840.113549.1.9.16.1.23是CMS Enveloped Data AES-GCM加密格式的标准OID。你遇到的问题并非逻辑bug,而是Chilkat v9.5.0.99版本的功能缺失:该版本的Chilkat.Email和Chilkat.Pkcs7模块未实现对CMS AES-GCM加密格式的支持,虽然Chilkat.Crypt2单独支持GCM模式,但邮件解密的自动PKCS7/CMS解析流程无法识别这个OID,导致报错。
2. 能否强制使用GCM模式解密?
直接通过Chilkat.Email的自动解密流程无法强制指定GCM模式,但可以通过以下方案解决:
方案一:升级Chilkat版本
这是最便捷的解决方案。Chilkat后续版本(如v9.5.0.100及之后)已添加对CMS AES-GCM格式的支持,升级后Chilkat.Email的自动解密功能即可正常处理这类邮件,无需额外修改代码。
方案二:手动拆分加密内容+Chilkat.Crypt2解密
如果无法升级版本,可手动提取邮件中的PKCS7加密数据,解析出GCM所需参数后用Chilkat.Crypt2解密:
- 提取PKCS7加密数据
Chilkat.Email email = new Chilkat.Email(); email.LoadEml("encrypted_email.eml"); // 根据实际邮件结构获取加密的MIME部分(索引可能需要调整) Chilkat.MimePart encryptedPart = email.GetPart(0); byte[] pkcs7Der = encryptedPart.GetBodyBinary(); - 借助OpenSSL提取GCM参数
由于v9.5.0.99的Chilkat.Pkcs7无法解析AES-GCM结构,可通过OpenSSL命令行提取密钥、IV、Tag和密文:# 导出PKCS7中的会话密钥(需用私钥解密) openssl cms -decrypt -in encrypted_pkcs7.der -inform DER -inkey private_key.pem -out content_key.bin -nocerts # 提取IV、密文和Tag(需结合DER结构解析或OpenSSL的详细输出) - 用
Chilkat.Crypt2执行GCM解密Chilkat.Crypt2 crypt = new Chilkat.Crypt2(); crypt.CryptAlgorithm = "aes"; crypt.KeyLength = 128; crypt.CipherMode = "gcm"; crypt.SetEncodedKey(contentKey, "raw"); crypt.SetEncodedIV(ivBytes, "raw"); // 设置GCM附加数据(如果有) crypt.SetEncodedAad(aadBytes, "raw"); // 解密密文并验证Tag byte[] decryptedData = crypt.DecryptBytes(ciphertextBytes);
方案三:直接调用OpenSSL解密
既然已确认OpenSSL可正常解密,可通过.NET的Process类调用OpenSSL命令行完成解密:
using System.Diagnostics; ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = "openssl"; psi.Arguments = "cms -decrypt -in encrypted_email.eml -out decrypted_email.eml -inkey private_key.pem"; psi.RedirectStandardOutput = true; psi.UseShellExecute = false; psi.CreateNoWindow = true; using (Process process = Process.Start(psi)) { process.WaitForExit(); // 处理解密后的邮件文件 }
内容的提问来源于stack exchange,提问作者Andrei Sokolovski
相关产品推荐
相关产品推荐

