?? inituser.c
字號:
//container.c 密鑰容器和密鑰生成實例
#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= NULL; // 可以輸入用戶名來作為密鑰容器名,最大100個字符
// 該值可選
//--------------------------------------------------------------------
//開始處理,實現獲取密鑰容器上下文
// 如果想創建一個新的密鑰容器,
// 可以在第二次調用CryptAcquireContext時替代第二個參數NULL,
if(CryptAcquireContext(
&hCryptProv, // CSP句柄
UserName, // 密鑰容器名
MS_DEF_PROV, // CSP名
PROV_RSA_FULL, // CSP類型
0)) // 標志值
{
printf("已經在密鑰容器 %s中獲得加密上下文\n", UserName);
}
else
{
//--------------------------------------------------------------------
//如果在獲取上下文的時候出現錯誤
// 則創建一個新的密鑰容器
if(CryptAcquireContext(
&hCryptProv,
UserName,
MS_DEF_PROV,
PROV_RSA_FULL,
CRYPT_NEWKEYSET))
{
printf("新的密鑰容器已經創建\n");
}
else
{
HandleError("不能創建新的密鑰容器\n");
}
} // End of else
//--------------------------------------------------------------------
// 已經有的加密上下文和密鑰容器,
// 獲取密鑰容器的名字
if(CryptGetProvParam(
hCryptProv, // CSP句柄
PP_CONTAINER, // 獲取密鑰容器名
(BYTE *)szUserName, // 指向密鑰容器名的指針
&dwUserNameLen, // 名字長度,預設為100
0))
{
printf("加密上下文已經獲取\n");
printf("密鑰容器名字為 %s\n\n",szUserName);
}
else
{
HandleError("上下文已經取得或創建\
,但獲取密鑰容器名字的時候出錯\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);
printf("所有的都創建成功\n");
printf("交換密鑰對和簽名密鑰對存在于%s密鑰容器中\n",UserName);
} // End of main
//錯誤處理函數
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 + -