top
Loading...
使用VisualC++創建Crypto加/解密組件
簡介
這篇文章將教你如何使用 Visual C++ 和 ATL 工具和 Microsoft CryptoAPI 建立一個能加/解密數據的組件。
Crypto 101
本文使用Microsoft® Cryptographic Application Programming Interface (CryptoAPI),將苦澀難懂的邏輯算法操作隱藏起來,如果想知道詳細信息請參看MSDN Library.如果想知道更多的密碼系統,我推薦你看看這本書 Bruce Schneier's Applied Cryptography: Protocols, Algorithms, and Source Code in C

建立組件
首先,用"ATL COM AppWizard”建立一個新project。在這個例子中,我將其命名為”CryptoProj”。在 server type中選擇”Dynamic Link Library (DLL)”,點按”Finish”繼續。

定義界面
在 insert 菜單中點按"New ATL Object...",選擇 “Simple Object”,然后按 Next。

在 “Names” 欄中,設 short name 為 “Crypto”,其他項照下面的填寫。

在 Attributes 欄,確定 Apartment Threading Model 被選上,Support IsupportErrorInfo 選項勾上,然后按 OK.

按右鍵點擊 Icrypto ,點”Add Method”加一個方法.

將該方法取名為”Encrypt”,在參數欄輸入"[in] BSTR bstrPlainText, [in] BSTR bstrPassword, [out, retval] VARIANT *vCipherText".

再加一個方法,取名為”Decrypt”,參數為"[in] VARIANT vCipherText, [in] BSTR bstrPassword, [out, retval] BSTR *bstrPlainText"

實現加密方法
需要包括 CryptoAPI 庫,在 Crypto.cpp 頭加一句: #include <wincrypt.h>


現在來定義我們需要的各種變量。STDMETHODIMP CCrypto::Encrypt(BSTR bstrPlainText,
BSTR bstrPassword,
VARIANT *vCipherText)
{
BYTE *pbData;
BYTE *pbPassword;
SAFEARRAY* psa;
HCRYPTPROV hProv = 0;
HCRYPTHASH hHash = 0;
HCRYPTKEY hKey = 0;
DWORD dwCryptDataLen = 0;
DWORD dwDataLen = 0;
DWORD dwError = 0;
char buffer[200];

USES_CONVERSION;


由于許多CryptoAPI 調用要用注冊表,所以需要執行一句RevertToSelf().RevertToSelf();


下一步,我們需要將輸入變量轉化為我們能用的格式。dwDataLen = SysStringLen(bstrPlainText);
pbData = (BYTE*)OLE2A(bstrPlainText);
pbPassword = (BYTE*)OLE2A(bstrPassword);


然后,用CryptAcquireContext function取得省缺 Crypto provider的句柄。// Get handle to the default provider.
if (! CryptAcquireContext(&hProv,
"aspZoneCryptoComponent

北斗有巢氏 有巢氏北斗