程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> Microsoft CryptoAPI加密技術(二)

Microsoft CryptoAPI加密技術(二)

編輯:vc教程

上次我們講了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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved