CSP介紹、以及使用CryptoAPI枚舉CSP並擷取其屬性,cryptoapicsp

來源:互聯網
上載者:User

CSP介紹、以及使用CryptoAPI枚舉CSP並擷取其屬性,cryptoapicsp

CSP,全名為“Data Encryption Service提供者(Cryptographic Service Provider)”,是微軟定義的一套密碼服務API。目前常用的密碼規範或者標準有3套:CSP,PKCS#11和國密標準。前兩者主要是為RSA演算法提供服務,當然PKCS#11最新的擴充也開始支援ECC演算法。而國家密碼管理制定的國密標準,主要提供SM2(實際上也是ECC)服務,當然國密標準同時支援RSA,不過大多數情況下RSA的應用還是使用CSP和PKCS#11來實現。


一、CSP為一個獨立的密鑰服務模組

CSP可以是軟體,比如Windows內建的“Microsoft Base Cryptographic Provider v1.0”和“Microsoft Enhanced Cryptographic Provider v1.0”。

CSP也可以是硬體裝置,通常是USBKey,比如飛天誠信等廠商生產的。


二、一個CSP對應一個密鑰容器

CSP沒有裝置(Key)的概念,這點和PKCS11以及國密規範都不一樣。一個CSP直接對應一個密鑰容器。通過CSP名和容器名直接定位密鑰模組,如果不指定容器名,則是定位預設的容器(一般情況下為第一個容器)。所以對CSP來說,最好容器名要求唯一,一般是使用GUID來作為容器名的。

如果同一個CSP有多個裝置,在需要確定使用哪個裝置時(比如建立容器),CSP會彈出選擇框,根據裝置的SN來選擇使用哪個裝置。


三、一個密鑰容器可以包含一對簽名密鑰、一對加密鑰、一個簽署憑證以及一個加密認證

通常CSP的一個密鑰容器只包含一對金鑰組和對應的認證,但是理論上可以把簽名金鑰組和加密金鑰對放在同一個容器,然後通過AT_SIGNATURE和AT_KEYEXCHANGE來尋找密鑰。


四、枚舉系統中的CSP

系統中的CSP,都在註冊表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider目錄下,我們可以通過API:CryptEnumProviders()來枚舉想要的CSP,如下面代碼所示:

void CTestCSPDlg::EnumCSP(){DWORD dwIndex = 0;DWORD dwType = 0;DWORD dwNameLen = 0;CComboBox* pCSPList = (CComboBox*)GetDlgItem(IDC_COMBO_CSPLIST);pCSPList->ResetContent();while (CryptEnumProviders(dwIndex, NULL, 0, &dwType, NULL, &dwNameLen)){DWORD dwItem = 0;TCHAR * pName = new TCHAR[dwNameLen + 1 ];if (CryptEnumProviders(dwIndex++, NULL, 0, &dwType, pName, &dwNameLen)){dwItem = pCSPList->AddString(pName);pCSPList->SetItemData(dwItem, dwType);}delete []pName;}pCSPList->SetCurSel(0);OnCbnSelchangeComboCsplist();}

五、擷取CSP屬性

得到CSP控制代碼之後,可以通過API:CryptGetProvParam()擷取CSP的屬性,比如該CSP具有的容器名、實作類別型、支援演算法等等。

比如下面的代碼為擷取當前CSP使用的容器名:

//擷取CSP容器名稱dwParamLen = 2048;memset(btParamData, 0, 2048);pList->InsertItem(dwIndex, _T("PP_CONTAINER"), 0);pList->SetItemText(dwIndex, 1, _T("密鑰容器名稱"));if (CryptGetProvParam(hProv, PP_CONTAINER, btParamData, &dwParamLen, 0)){TCHAR *tcValue = NULL;#ifdef UNICODEtcValue = A2W((char*)btParamData);#elsetcValue = (char*)btParamData;#endifpList->SetItemText(dwIndex, 2, tcValue);}else{pList->SetItemText(dwIndex, 2, _T("Failed!"));}

下面的代碼枚舉CSP所有的容器名:

//擷取CSP所有的容器名稱dwParamLen = 2048;memset(btParamData, 0, 2048);pList->InsertItem(dwIndex, _T("PP_ENUMCONTAINERS"), 0);pList->SetItemText(dwIndex, 1, _T("所有容器名"));if (CryptGetProvParam(hProv, PP_ENUMCONTAINERS, btParamData, &dwParamLen, CRYPT_FIRST)){CString strContianers;TCHAR *tcValue = NULL;#ifdef UNICODEtcValue = A2W((char*)btParamData);#elsetcValue = btParamData;#endifstrContianers += tcValue;dwParamLen = 2048;memset(btParamData, 0, 2048);while (CryptGetProvParam(hProv, PP_ENUMCONTAINERS, btParamData, &dwParamLen, CRYPT_NEXT)){#ifdef UNICODEtcValue = A2W((char*)btParamData);#elsetcValue = btParamData;#endifstrContianers += _T("/");strContianers += tcValue;}pList->SetItemText(dwIndex, 2, strContianers);}else{pList->SetItemText(dwIndex, 2, _T("Failed!"));}


下面的代碼擷取CSP的所支援的演算法:

//擷取CSP所支援的演算法資訊dwParamLen = 2048;memset(btParamData, 0, 2048);pList->InsertItem(dwIndex, _T("PP_ENUMALGS"), 0);pList->SetItemText(dwIndex, 1, _T("支援的演算法資訊"));if (CryptGetProvParam(hProv, PP_ENUMALGS, btParamData, &dwParamLen, CRYPT_FIRST)){CString strAlgs;PROV_ENUMALGS* alg = (PROV_ENUMALGS*)btParamData;TCHAR *tcValue = NULL;#ifdef UNICODEtcValue = A2W(alg->szName);#elsetcValue = alg->szName;#endifstrAlgs += tcValue;dwParamLen = 2048;memset(btParamData, 0, 2048);while (CryptGetProvParam(hProv, PP_ENUMALGS, btParamData, &dwParamLen, CRYPT_NEXT)){alg = (PROV_ENUMALGS*)btParamData;#ifdef UNICODEtcValue = A2W(alg->szName);#elsetcValue = alg->szName;#endifstrAlgs += _T("/");strAlgs += tcValue;}pList->SetItemText(dwIndex, 2, strAlgs);}else{pList->SetItemText(dwIndex, 2, _T("Failed!"));}

等等。


如果需要詳細代碼,請下載本人枚舉CSP的例子,下載串連為:枚舉CSP並擷取屬性

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.