我们用于加密的特定库(.net dll)。但它使用了Win32例程。这里的问题是我们不能将它用于64位操作系统。至少我认为它是这样......我们在程序集中编写的代码如下:
Friend Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" (ByRef phProv As Integer, ByVal pszContainer As String, ByVal pszProvider As String, ByVal dwProvType As Integer, ByVal dwFlags As Integer) As Integer
我看到那里有一个32;所以我猜它不适用于64位机器。 :(
无论如何,我的最终目标是将整个解决方案转换为更便携的代码(因此它可以在32位和64位机器上运行),但我似乎无法理解如何编写等效的.net代码。经过大量的谷歌搜索,我发现了一个C ++实现,类似于旧的.net DLL中的事情。可以找到here
作为这个领域的新手,我很难理解这个过程。我想他们使用RSA算法。我猜这是一个对称算法,因为我们只传递一个密钥来进行加密/解密。如果您需要任何其他详细信息,请添加评论;我会尽力回应...
答案 0 :(得分:2)
不幸的是,您调用的函数不是常规加密函数,它用于获取cryptographic service provider(CSP)通常,除了通过本机代码调用之外,在.net≤4.0中不支持对CSP的访问。
如果没有你的代码,一旦你抓住它的句柄,我就无法弄清楚你正在对服务提供商做些什么。如果它是标准对称或非对称函数之一或类似的东西,您可以完全从托管代码中完成。
尝试查看System.security.cryptography。还有一组围绕CNG / CSP数据提供程序here的Microsoft写入包装器,它们可能直接公开暴露确切的CSP及其功能。最后,如果您想要真正可移植的代码,请尝试搜索可以处理win32,windows ce,win8和mono的充气城堡库。
答案 1 :(得分:0)
对于RSA,RSACryptoServiceProvider类是System.Security.Cryptography的一部分。
这可能会让你在.NET上相当便携(但不幸的是,.NET Compact Framework并不支持所有这些)。如果您想要更具可移植性,crypto++是本机C ++。
答案 2 :(得分:0)
如果使用IntPtr
将指针更改为平台上相同的大小,那么该函数在64位窗口上应该可以正常工作。您的指针固定为32位,这可能(很可能)在64位环境中导致问题。例如:
Friend Declare Function CryptAcquireContext Lib "advapi32.dll" Alias "CryptAcquireContextA" (ByRef phProv As IntPtr, ByVal pszContainer As String, ByVal pszProvider As String, ByVal dwProvType As Integer, ByVal dwFlags As Integer) As IntPtr
就是这样。 dwFlags
和dwProvType
保持整数,因为它们是32位而不管平台(DWORD)。您必须修复所有平台调用调用才能使用IntPtr
。例如,您对CryptReleaseContext
的调用也应该将IntPtr
作为第一个参数而不是整数。
或者,您可以将应用程序更改为始终以x86平台为目标而不是任何CPU,然后让WOW64处理它。然后,不需要更改代码。
如果您可以解释您需要此功能的内容,那么您可能需要更直接的.NET实现。例如,如果您尝试使用x509证书,则可能对X509Certificate2
类更感兴趣。
答案 3 :(得分:0)
advapi32.dll确实存在于我的win 7 x64盒子上,所以它仍然可以工作,否则System.Security如何不包含不等效的功能呢?