上次我們講了Microsoft CryptoAPI的構成以及會話密鑰的使用。接下來我們將看一下公私密鑰對的使用、HASH算法、數字簽名等技術。
一、 公用密鑰加密技術
公用密鑰加密技術使用兩個不同的密鑰:公鑰和私鑰。私鑰必須安全的保管好不能被外人知道,而公鑰可以告訴任何人,只要他需要。通常公鑰是以數字證書的形式發布的。
用公私密鑰對中的一個密鑰加密的數據只能用密鑰對中的另一個密鑰才能解密。也就是說用用戶A的公鑰加密的數據只能用A的私鑰才能解密,同樣,用A的私鑰加密的數據只能用A的公鑰才能解密。
如果用私鑰簽名一個消息,那麼必須用與之對應的公鑰去驗證簽名的有效性。
不幸的是公用密鑰加密技術的效率非常低甚至只有對稱加密的千分之一,所以不適合對大量的數據進行加密。實際上,公用密鑰加密技術一般用來加密會話密鑰,而數據加密可以用對稱加密的方法。
好了,讓我們回到Microsoft CryptoAPI。我們知道一個CSP有一個密鑰庫,這個密鑰庫有一個或多個密鑰容器。而密鑰容器中有什麼呢?一般來說,一個密鑰容器中有兩對公私密鑰對,一對用來加密會話密鑰,而另一對用來進行數字簽名,也就是大家知道的key exchange key pair和signature key pair。
那麼,怎麼得到這些密鑰對呢?
if(CryptGetUserKey(
hCryptProv, // 我們已經得到的CSP句柄
AT_SIGNATURE, // 這裡想得到signature key pair
&hKey)) // 返回密鑰句柄
{
printf("A signature key is available.\n");
}
else //取signature key pair錯誤
{
printf("No signature key is available.\n");
if(GetLastError() == NTE_NO_KEY) //密鑰容器裡不存在signature key pair
{
// 創建 signature key pair.
printf("The signature key does not exist.\n");
printf("Create a signature key pair.\n");
if(CryptGenKey(
hCryptProv, //CSP句柄
AT_SIGNATURE, //創建的密鑰對類型為signature key pair
0, //key類型,這裡用默認值
&hKey)) //創建成功返回新創建的密鑰對的句柄
{
printf("Created a signature key pair.\n");
}
else
{
printf ("Error occurred creating a signature key.\n");
}
}
else
{
printf ("An error other than NTE_NO_KEY getting signature\key.\n");
}
} // end if
將參數AT_SIGNATURE換成AT_KEYEXCHANGE就可以得到key exchange key pair。