gpt4 book ai didi

c# - .Net 框架更新后 EncryptedXml DecryptDocument 方法错误

转载 作者:可可西里 更新时间:2023-11-01 08:48:10 25 4
gpt4 key购买 nike

我有一个 2013 年编写的旧函数,可以解密由另一个程序加密的 xml。

代码很简单

        public static void Decrypt(XmlDocument Doc)
{
// Check the arguments.
if (Doc == null)
throw new ArgumentNullException("Doc");

// Create a new EncryptedXml object.
EncryptedXml exml = new EncryptedXml(Doc);

// Decrypt the XML document.
exml.DecryptDocument();

}

直到最近,我们的一些客户开始将他们的框架升级到 4.6.2,所以 DecryptDocument() 方法停止工作了,这一直很有效。现在它抛出一个异常“算法组''无效”。如果我删除 .net Framework 4.6.2,它会再次运行。

link中的示例代码将重现错误,它将加密成功然后解密失败。

我使用的是 A3 证书、pendrive token 。有人遇到过这个问题吗?在 .net 4.6.2 中有任何解决方法吗?

编辑 1:

堆栈跟踪:

在 System.Security.Cryptography.CngAlgorithmGroup..ctor(字符串算法组)
在 System.Security.Cryptography.CngKey.get_AlgorithmGroup()
在 System.Security.Cryptography.RSACng..ctor(CngKey key )
在 System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPrivateKey(X509Certificate2 证书)
在 System.Security.Cryptography.CngLightup.GetRSAPrivateKey(X509Certificate2 证书)
在 System.Security.Cryptography.Xml.EncryptedXml.DecryptEncryptedKey(EncryptedKey encryptedKey)
在 System.Security.Cryptography.Xml.EncryptedXml.GetDecryptionKey(EncryptedData encryptedData,字符串 symmetricAlgorithmUri)
在 System.Security.Cryptography.Xml.EncryptedXml.DecryptDocument()
在 C:\Users\leoka\Documents\Visual Studio 2017\Projects\ConsoleApp4\Criptografar\Program.cs 中的 Criptografar.Program.Decrypt(XmlDocument Doc):第 152 行
在 C:\Users\leoka\Documents\Visual Studio 2017\Projects\ConsoleApp4\Criptografar\Program.cs:line 83 中的 Criptografar.Program.Main(String[] args)

最佳答案

我自己无法重现该问题 - 我没有我怀疑是问题所在的“pendrive token ” - 所以这是猜测。Windows 中有两代加密 API - the "old" one"new generation" one, known as CNG .现在,如果您查看 source code for the CngLightup type出现在堆栈跟踪的中途,特别是 DetectRsaCngSupport 方法,您将看到 .NET 框架尽可能尝试使用新一代 API。我的猜测是“pendrive token”设备不支持新的 API。您可以通过强制使用旧 API 来验证这一点。不幸的是,似乎没有控制它的公共(public)配置标志,因此您必须求助于基于反射的 hack。例如,您可以在程序的开头放置这样的内容,以便在您尝试解密操作之前运行一次:

    var cngLightupType = typeof(EncryptedXml).Assembly.GetType("System.Security.Cryptography.CngLightup");
var preferRsaCngField = cngLightupType.GetField("s_preferRsaCng", BindingFlags.Static | BindingFlags.NonPublic);
var getRsaPublicKeyField = cngLightupType.GetField("s_getRsaPublicKey", BindingFlags.Static | BindingFlags.NonPublic);
var getRsaPrivateKeyField = cngLightupType.GetField("s_getRsaPrivateKey", BindingFlags.Static | BindingFlags.NonPublic);
preferRsaCngField.SetValue(null, new Lazy<bool>(() => false));
getRsaPublicKeyField.SetValue(null, null);
getRsaPrivateKeyField.SetValue(null, null);

请注意,它非常 hacky,不是线程安全的,省略了错误处理等。如果您确认 CNG 的使用是问题所在,您可以要求“pendrive token ”供应商提供与 CNG 一起使用的驱动程序.或者您可以接受上面的 hack,为了更安全而重写。

关于c# - .Net 框架更新后 EncryptedXml DecryptDocument 方法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44250404/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com