?? createkey.cpp
字號:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void HandleError(char *s);
void main(void)
{
//--------------------------------------------------------------------
// 申明、初始化變量
HCRYPTPROV hCryptProv; // CSP句柄
HCRYPTKEY hKey; // 公私密鑰對句柄
CHAR szUserName[100]; // 密鑰容器名稱
DWORD dwUserNameLen = 100; // 密鑰容器名稱長度
LPCSTR UserName= "ticai"; // 用戶名,作為密鑰容器名
//--------------------------------------------------------------------
// 創建默認密鑰容器。若需要創建一個密鑰容器則替換CryptAcquireContext函數中的“NULL”
if(CryptAcquireContext(
&hCryptProv, // CSP句柄
UserName, // 密鑰容器名
NULL, // 使用默認CSP
PROV_RSA_FULL, // CSP類型
0)) // 標志位
{
printf("一個名為 %s 的密鑰容器的句柄 \n", UserName);
printf("已經獲取.\n\n");
}
else
{
//--------------------------------------------------------------------
// 如果獲取CSP出現錯誤,則創建一個新的默認密鑰容器
if(CryptAcquireContext(
&hCryptProv,
UserName,
NULL,
PROV_RSA_FULL,
CRYPT_NEWKEYSET)) //創建密鑰容器
{
printf("一個新的密鑰容器已經被創建.\n");
}
else
{
HandleError("不能創建新的密鑰容器.\n");
}
} // End of else
//--------------------------------------------------------------------
// 已獲取包含密鑰容器的CSP,獲取其密鑰容器名。
if(CryptGetProvParam(
hCryptProv, // CSP句柄
PP_CONTAINER, // 獲取參數類型,密鑰容器名
(BYTE *)szUserName, // 密鑰容器名指針
&dwUserNameLen, // 密鑰容器名長度,設為100
0))
{
printf("一個已經包含密鑰容器的CSP句柄已被獲取并且 \n");
printf("所包含的密鑰容器的名稱為 %s.\n\n",szUserName);
}
else
{
// 獲取其密鑰容器名出錯
HandleError("一個CSP句柄已經獲取或創建, 但是\
在獲取密鑰容器名稱的時候發生了錯誤.\n");
}
//--------------------------------------------------------------------
// 密鑰容器已存在
if(CryptGetUserKey(
hCryptProv, // CSP句柄
AT_SIGNATURE, // 密鑰類型,簽名密鑰
&hKey)) // 密鑰句柄
{
printf("簽名密鑰已經存在.\n");
}
else
{
printf("沒有簽名密鑰存在.\n");
if(GetLastError() == NTE_NO_KEY)
{
//----------------------------------------------------------------
// 當錯誤為:密鑰不存在時,重新創建簽名密鑰對。
printf("簽名密鑰已經不存在.\n");
printf("創建一個簽名密鑰對.\n");
if(CryptGenKey(
hCryptProv,
AT_SIGNATURE,
0,
&hKey))
{
printf("已經創建了一個簽名密鑰對.\n");
}
else
{
HandleError("創建簽名密鑰出錯.\n");
}
}
else
{
HandleError("在獲得簽名密鑰時發生了一個不同于 NTE_NO_KEY 的錯誤.\n");
}
} // End of if
printf("一個簽名密鑰對已經存在或被創建.\n\n");
CryptDestroyKey(hKey);
// 檢查交換密鑰
if(CryptGetUserKey(
hCryptProv,
AT_KEYEXCHANGE,
&hKey))
{
printf("有一對交換密鑰存在. \n");
}
else
{
printf("沒有交換密鑰存在.\n");
// 檢查交換密鑰是否存在
if(GetLastError()==NTE_NO_KEY)
{
// 創建交換密鑰
printf("交換密鑰不存在.\n");
printf("正在試圖創建一個交換密鑰對.\n");
if(CryptGenKey(
hCryptProv,
AT_KEYEXCHANGE,
0,
&hKey))
{
printf("交換密鑰對已經存在.\n");
}
else
{
HandleError("在試圖創建交換密鑰時發生錯誤.\n");
}
}
else
{
HandleError("發生了一個不同于 NTE_NO_KEY 的錯誤.\n");
}
}
printf("一個交換密鑰對已經存在或被創建.\n\n");
CryptDestroyKey(hKey); //銷毀密鑰句柄
CryptReleaseContext(hCryptProv,0); //釋放CSP句柄
printf("一切就緒.\n");
printf("在 %s 密鑰容器中存在\n",szUserName);
printf("一個簽名密鑰對和一個交換密鑰對.\n");
} // End of main
// HandleError:錯誤處理函數,打印錯誤信息,并退出程序
void HandleError(char *s)
{
printf("程序執行發生錯誤!\n");
printf("%s\n",s);
printf("錯誤代碼為: %x.\n",GetLastError());
printf("程序終止執行!\n");
exit(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -