2011-10-13 55 views
0

有一個特定的庫(.net dll)我們用於加密。但它使用了Win32例程。這裏的問題是我們不能將它用於64位操作系統。至少我認爲它是這樣的...我們在彙編中寫有這樣的代碼:.net cryptography:尋找等效的c#代碼樣本頁面

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位機器上工作),但似乎無法理解如何編寫等效代碼。 net code。經過大量的谷歌搜索後,我發現了一個C++實現,類似於舊的.net dll中的事情。可以發現here

作爲這個領域的新手,我很難理解這個過程,我想他們使用的是RSA算法,我猜這是一個對稱算法,因爲我們只通過一個密鑰來進行加密/解密,如果你需要其他細節,請添加評論;我會嘗試當我可以迴應...

回答

2

不幸的是,您呼叫的功能不是一般的加密功能,它的東西用來獲取cryptographic service provider(CSP)一般情況下,訪問CSP的除了通過本機代碼的調用是在.NET 4.0 ≤不支持。

缺席你的代碼,我想不出你與服務提供者在做什麼,一旦你握住手柄將它。如果它是標準的對稱或非對稱函數之一或類似的東西,那麼你完全可以使用託管代碼完成它。

試着看看System.security.cryptography。還有一個微軟公司圍繞CNG/CSP數據提供商here編寫的一套包裝,可能會直接揭露CSP及其功能。最後,如果你真的想要真正的可移植代碼,試着搜索充氣城堡庫,它可以處理win32,windows ce,win8和mono。

0

,如果你改變你的指針是在該平臺上使用IntPtr相同大小的功能應該工作在64位Windows的罰款。您的指針固定在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 

就是這樣。 dwFlagsdwProvType保持整數,因爲它們是32位而不管平臺(DWORD)。您將必須修復全部平臺調用調用使用IntPtr。例如,您撥打CryptReleaseContext時也應該將IntPtr作爲第一個參數,而不是整數。

或者,你可以改變你的應用程序始終針對x86平臺,而不是任何CPU,只是讓WOW64處理它。然後,不需要更改代碼。

如果你能解釋一下你需要這個功能,有可能是一個更簡單的.NET實現的你正在嘗試做的。例如,如果您嘗試使用x509證書,則可能對X509Certificate2類更感興趣。

0

ADVAPI32.DLL不上我的勝利7 x64系統中,所以它仍然應該工作存在的,否則怎麼樣System.Security確實是不包含equivilent功能?