Microsoft CryptoAPI使用心得最近研究了一下MS CryptoAPI的用法,略有心得。如果需要使用非对称加密方案,MS CryptoAPI倒是一个不错的选择。
l 每个用户都可以在获取CSP(CryptAcquireContext)时通过指定Container的名称来创建自己的Key Container;也可以使用NULL参数获取缺省的Key Containner;通过Key Container用户可以创建或获取自己的公私钥对。
l 当用户首次使用自己的Key Container时需要创建自己的公私钥对(CryptGenKey)。注意:一旦创建了公私钥对,操作系统就会自动保存下来。
l CRYPTAPI提供两种公私钥对:“交换公私钥对”和“数字签名公私钥对”。
Exchange Public/Private Key Pair
思想:
² 发送者使用接收者的Public Key对Session Key进行加密,这样只有指定的接收者能够获得正确的Session Key;接收者需要预先将自己的Public Key交给发送者;
² 只对Session Key进行非对称加密,而整个消息使用session key进行对称加密;
² 使用Exchang public/private key pair可以确保消息只能被指定的接收者读取;
发送者步骤:
1. 获取或创建指定的CSP(CryptAcquireContext)。
2. 获取或创建自己的Key Container(CryptGetUserKey或CryptGenKey)。
3. 创建一个hash对象(CryptCreateHash)。
4. 根据原始消息生成Hash值(CryptHashData)。
5. 从上述Hash值派生出session key(CryptDeriveKey)。
6. 导入接收者的public key(CryptImportKey).
7. 使用session key对消息进行加密同时使用接收者的public key对session key进行加密。
接收者步骤:
1. 获取或创建指定的CSP(CryptAcquireContext)。
2. 获取或创建自己的Key Container(CryptGetUserKey或CryptGenKey)。
3. 使用自己的private key对session key进行解密,然后使用session key对消息进行解密(CryptDecrypt)。
Digital Signature Key Pair
思想:
² 发送者首先产生消息的摘要(注意消息本身并不加密),然后用自己的private key对此摘要进行加密。
² 加密后的摘要作为数字签名,与原始消息一起传递给接收者。
² 接收者使用发送者的public Key的对摘要进行解密并计算收到消息的摘要,然后通过比较确认签名是否正确。
² 使用Digital Signature Key Pair可以确保消息来自指定的发送者,而不是别的冒充者;但它并不保护消息内容不被泄漏
发送者步骤:
1. 获取或创建指定的CSP(CryptAcquireContext)。
2. 获取或创建自己的Key Container(CryptGetUserKey或CryptGenKey)。
3. 导出自己的public key给接收端(CryptExportKey)。
4. 创建一个HASH对象(CryptCreateHash)。
5. 计算原始的消息的Hash值(CryptHashData)。
6. 使用自己的private key对Hash值进行加密(CryptSignHash)。
7. 将原始消息和签名后的Hash值发送给接收端。
接收者步骤:
1. 获取或创建指定的CSP(CryptAcquireContext)。
2. 导入发送者的public key(CryptImportKey)。
3. 创建一个HASH对象(CryptCreateHash)。
4. 计算原始的消息的Hash值(CryptHashData)。
5. 验证签名是否属于指定的发送者(CryptVerifySignature)。
总结:
使用MS CryptoAPI的非对称加密方案时,应根据实际情况选择正确的Key Pair。
l Exchange Public/Private Key Pair适用于向特定接收者传输数据的情形,前提是发送者需要预知接收者的public key;
l Digital Signature Key Pair适用于需要验证发送者身份的情形,前提是接收者需要预知发送者的public key。