上次我们讲了Microsoft CryptoAPI的构成以及会话密钥的使用。接下来我们将看一下公私密钥对的使用、HASH算法、数字签名等技术。
一、 公用密钥加密技术
公用密钥加密技术使用两个不同的密钥:公钥和私钥。私钥必须安全的保管好不能被外人知道,而公钥可以告诉任何人,只要他需要。通常公钥是以数字证书的形式发布的。
用公私密钥对中的一个密钥加密的数据只能用密钥对中的另一个密钥才能解密。也就是说用用户A的公钥加密的数据只能用A的私钥才能解密,同样,用A的私钥加密的数据只能用A的公钥才能解密。
如果用私钥签名一个消息,那么必须用与之对应的公钥去验证签名的有效性。
不幸的是公用密钥加密技术的效率非常低甚至只有对称加密的千分之一,所以不适合对大量的数据进行加密。实际上,公用密钥加密技术一般用来加密会话密钥,而数据加密可以用对称加密的方法。
好了,让我们回到Microsoft CryptoAPI。我们知道一个CSP有一个密钥库,这个密钥库有一个或多个密钥容器。而密钥容器中有什么呢?一般来说,一个密钥容器中有两对公私密钥对,一对用来加密会话密钥,而另一对用来进行数字签名,也就是大家知道的key exchange key pair和signature key pair。
http://photo.163.com/q/6681439/?mid=174326247
那么,怎么得到这些密钥对呢?
if(CryptGetUserKey(
hCryptProv, // 我们已经得到的CSP句柄
AT_SIGNATURE, // 这里想得到signature key pair
&hKey)) // 返回密钥句柄
{
printf("A signature key is available.
");
}
else //取signature key pair错误
{
printf("No signature key is available.
");
if(GetLastError() == NTE_NO_KEY) //密钥容器里不存在signature key pair
{
// 创建 signature key pair.
printf("The signature key does not exist.
");
printf("Create a signature key pair.
");
if(CryptGenKey(
hCryptProv, //CSP句柄
AT_SIGNATURE, //创建的密钥对类型为signature key pair
0, //key类型,这里用默认值
&hKey)) //创建成功返回新创建的密钥对的句柄
{
printf("Created a signature key pair.
");
}
else
{
printf ("Error occurred creating a signature key.
");
}
}
else
{
printf ("An error other than NTE_NO_KEY getting signaturekey.
");
}
} // end if
将参数AT_SIGNATURE换成AT_KEYEXCHANGE就可以得到key exchange key pair。
http://kan.weibo.com/kan/3613748024278892
http://kan.weibo.com/con/3613748263354301
http://event.weibo.com/1241408
http://kan.weibo.com/con/3613748720650106
http://event.weibo.com/1241478
http://kan.weibo.com/con/3613751979509156
http://event.weibo.com/1241560
http://kan.weibo.com/con/3613752235361800
http://kan.weibo.com/con/3613752524768915
http://kan.weibo.com/con/3613752717823483
http://t.qq.com/meilemeil2011
http://t.qq.com/hhhh5678123
http://photo.163.com/q/6681439/?mid=174326247
http://photo.163.com/q/6681450/?mid=174326247
http://photo.163.com/q/6681460/?mid=174326247
http://photo.163.com/q/6681472/?mid=174326247
http://photo.163.com/q/6681483/?mid=174326247
http://photo.163.com/q/6681493/?mid=174326247
http://photo.163.com/q/6681439/?mid=174326247