對“用CryptoAPI進行數據加密”一文的補充

發表于:2007-07-04來源:作者:點擊數: 標簽:
武漢 程義軍 讀了貴刊2000年第19期B16版“用CryptoAPI進行數據加密”一文,覺得很有所獲,急忙將其鍵入,編譯、運行,卻出現了錯誤。當然,并不是原文提供的代碼有錯,而是原文的作者忽略了一個重要的問題。如果你的機器曾運行過這種數據加密程序,那當然可以
武漢 程義軍

  讀了貴刊2000年第19期B16版“用CryptoAPI進行數據加密”一文,覺得很有所獲,急忙將其鍵入,編譯、運行,卻出現了錯誤。當然,并不是原文提供的代碼有錯,而是原文的作者忽略了一個重要的問題。如果你的機器曾運行過這種數據加密程序,那當然可以正確地運行。如果是第一次才運行此程序,那將會出現問題,錯誤就在 CryptAcquireContext的調用上。

  在調用CryptEncrypt進行數據加密之前,需要取得當前機器缺省的密鑰容器,而CryptAcquireContext(&hProv,NULL,NULL,PROV_RSA_FULL,0)就是用于連接缺省的CSP的,如果當前機器未曾設置過缺省的密鑰容器, CryptAcquireContext 調用就會出錯。因此必須為機器創建缺省的密鑰容器。

  創建缺省的密鑰容器也需要調用CryptoAPI進行。下面介紹一種創建缺省的密鑰容器的控制臺程序InitUser.c。本程序的功能為: 用你的機器名稱UserName創建一個缺省的密鑰容器。 在密鑰容器中創建一個數字簽名密鑰對。 在密鑰容器中創建一個密鑰交換對。

  本程序在一臺機器上只須執行一次,執行之后,你將會看到在系統注冊表的HKEY_CURRENT_USER\Software\microsoft下多了一個主鍵: Cryptography\UserKeys,并填入一些十六進制的值。之后,你就可以順利地使用數據加密程序了,甚至可以使用數字簽名了。

  程序清單: < InitUser.c > #include < windows.h > #include < stdio.h > #include < stdlib.h > #include < wincrypt.h > //主程序不需要任何參數 void _cdecl main(void) { HCRYPTPROV hProv; HCRYPTKEY hKey; CHAR szUserName[100]; DWORD dwUserNameLen = 100; // 試圖獲取缺省的密鑰容器, 若失敗,則創建一個缺省容器 if(!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0)) { //若獲取缺省密鑰容器發生錯誤, 就創建一個缺省密鑰容器, 使用參數 CRYPT_NEWKEYSET if(!CryptAcquireContext (&hProv,NULL,MS_DEF_PROV, PROV_RSA_FULL,CRYPT_NEWKEYSET)) { printf(“創建缺省密鑰容器發生錯誤!\n"); exit(1); } // 取得缺省密鑰容器名 if(!CryptGetProvParam(hProv, PP_CONTAINER, szUserName, &dwUserNameLen, 0)) { // 出錯誤時容器名置空 szUserName[0] = 0; } printf(“Create key container ‘%s'\n",szUserName); } // 試圖獲取簽名密鑰的名柄 if(!CryptGetUserKey(hProv, AT_SIGNATURE, &hKey)) { if(GetLastError() == NTE_NO_KEY) { // 創建數字簽名密鑰對 printf(“Create signature key pair\n"); if(!CryptGenKey(hProv,AT_SIGNATURE,0,&hKey)) { printf(“錯誤代碼: %x 創建數字簽名 密鑰對發生錯誤!\n", GetLastError()); exit(1); } else { CryptDestroyKey(hKey); } } else { printf(“錯誤代碼: %x during CryptGetUserKey!\n", GetLastError()); exit(1); } } // 試圖取得交換密鑰的句柄, 沒有交換密鑰時,創建交換密鑰 if(!CryptGetUserKey(hProv,AT_KEYEXCHANGE,&hKey)) { if(GetLastError()==NTE_NO_KEY) {//沒有交換密鑰時,創建交換密鑰對 printf(“創建交換密鑰\n"); if(!CryptGenKey(hProv,AT_KEYEXCHANGE,0,&hKey)) { printf(“Error %x during CryptGenKey!\n", GetLastError()); exit(1); } else { CryptDestroyKey(hKey); } } else { printf(“Error %x duringCryptGetUserKey!\n", GetLastError()); exit(1); } } CryptReleaseContext(hProv,0); //釋放句柄 printf(“OK\n"); exit(0); }

  以上程序在WinNT4.0及Win98、VC5++上編譯通過,機器環境為賽揚333。若編譯時發生HCRYPTPROV、HCRYPTKEY類型等錯誤,請打開 vc\include\wincrypt.h,將其頭部的#if(_WIN32_WINNT >= 0x0400)及尾部的#endif /* _WIN32_WINNT >= 0x0400 */兩行注釋掉,存盤,即可編譯成功。    

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97