C# 加密异常:无法';t获取加密服务提供程序上下文

C# 加密异常:无法';t获取加密服务提供程序上下文,c#,winforms,encryption,cryptography,C#,Winforms,Encryption,Cryptography,转载自,因为我需要答案。我希望你们能帮我 所讨论的组件是Org.Mentalis.SecurityServices.dll 大家好。我有麻烦了 CryptographicException:无法获取加密服务提供程序上下文 堆栈跟踪: at Org.Mentalis.SecurityServices.Cryptography.CryptoHandle.CreateInternalHandle(IntPtr handle, String container) at ORG.Mentalis.Sec

转载自,因为我需要答案。我希望你们能帮我

所讨论的组件是Org.Mentalis.SecurityServices.dll


大家好。我有麻烦了

CryptographicException:无法获取加密服务提供程序上下文

堆栈跟踪:

at Org.Mentalis.SecurityServices.Cryptography.CryptoHandle.CreateInternalHandle(IntPtr handle, String container)
at ORG.Mentalis.SecurityServices.Cryptography.CryptoHandle.get_Handle()
at Org.Mentalis.SecurityServices.Cryptography.RC4CryptoServiceProvider.ctor()
at <place in my app where I try to create the RC4 CryptoServiceProvider>
位于Org.Mentalis.SecurityServices.Cryptography.CryptoHandle.CreateInternalHandle(IntPtr句柄,字符串容器)
在ORG.Mentalis.SecurityServices.Cryptography.CryptoHandle.get_Handle()上
在Org.Mentalis.SecurityServices.Cryptography.RC4CryptoServiceProvider.ctor()上
在
我不得不从一个客户发给我的截图上手工复制那个异常跟踪

实际上,我已经为XP创建了一个.NET 3.5 WinForms应用程序,它使用RC4CryptoServiceProvider在启动时从.ini文件加载加密的用户详细信息。好几个月来都很好用

大约一周前,我在电脑上收到了这条异常信息。我在网上做了一些搜索,但找不到太多——我找到的所有东西都与网站有关

我最终偶然发现了一个解决办法,使我的电脑能够正常工作。当我从以下三个文件夹中删除文件时:

C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\

C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\token\

C:\Documents and Settings\my\u username\Application Data\Microsoft\Crypto\RSA\token\

问题消失了。下次运行应用程序时,文件夹将重新填充新信息

我以为这只是我自己的开发环境所独有的东西——我下载了一些奇怪的东西,破坏了我的加密文件和文件夹。这不是一个我是专家的领域-我只是使用组件,它只是工作。好。。。直到现在

问题是,我公司的一位客户最近刚刚开始遇到同样的错误,我不愿意让他们在无法证明原因的情况下清除加密文件。而且,这似乎并不是因为我下载了一些奇怪的东西,因为这个例外出现在一系列商业终端服务器上

在这个问题上,我一直在四处寻找支持,但运气不太好。我会继续四处看看。外面有人能解释一下情况吗


谢谢您的时间。

您知道您的客户的计算机上是否安装了CSP吗?旧版本的Windows不会安装某些CSP。也有可能他们运行的是不支持强加密的外国版本的Windows(我认为法国版本可能不允许所有这些)


另一种可能是权限。可能运行代码的进程不再使用管理权限运行,或者与您的帐户关联的权限已更改。

调用CryptAcquireContext时,mental is库实际上应该设置CRYPT_VERIFYCONTEXT标志。由于它们不是,RC4CryptoServiceProvider的每个实例都会创建一个默认持久密钥容器的句柄(该容器存储在使用procmon定位的文件中)


您是否在多个线程(或从多个进程)中创建密钥?一个粗略的猜测是,您在锁定文件时遇到了一些问题。

最明显的出发点是找到解决方法的地方。有什么解释吗?我哪儿都找不到解决办法。首先,我使用procmon和DLLTool查找应用程序正在执行的操作。我注意到有一个指向C:\Documents and Settings\my_username\Application Data\Microsoft\Crypto\RSA\token\filename的引用-在这一点上,我刚刚尝试删除了该文件以及所有用户文件夹中的等效文件。在那之后,问题消失了。从来没有在网上找到任何推荐这个的东西-我只是尝试了一下,效果很好。谢谢你的编辑,顺便说一句。