Crypto 加密的基本流程
来源:互联网 发布:深圳儿童编程培训 编辑:程序博客网 时间:2024/06/10 07:04
前言:
Crypto是微软的加密API,如果看懂了,使用起来是很简单的一件事,不过就是最开始没有看懂,被虐了两天。然后又被其他问题给虐了两天。最后做出来的东西也不是让自己十分满意。不过还好,最后的结果还不算太糟。
本想对代码进行一次整理,写一个demo代码,不过现在有些慵懒了,还是随便贴些笔记好了。
PS:
发现Delphi盒子要卖了。这似乎也验证了一句话,有商业价值的东西才会有持续的生命力。
Crypto 加密的基本流程
- 创建/获取一个密码容器CSP
- 创建/获取/导入一个密钥
- 使用密钥进行加密/解密
加密具体流程:
- 创建/获取一个密码容器CSP。这一部分基本上所有程序都一样,直接复制过来到程序里就可以了。
//以下获得一个CSP句柄
if(CryptAcquireContext(
&hProv, //out 密码容器
NULL, //NULL表示使用默认密钥容器,默认密钥容器名为用户登陆名。
NULL,
PROV_RSA_FULL, //in 使用RSA密钥
0))
{
printf("A cryptographic provider has been acquired. \n");
}
else//密钥容器不存在
{
if(CryptAcquireContext(
&hProv,
NULL,
NULL,
PROV_RSA_FULL,
CRYPT_NEWKEYSET))//创建密钥容器
{
//创建密钥容器成功,并得到CSP句柄
printf("A new key container has been created.\n");
}
else
{
HandleError("Could not create a new key container.\n");
}
}
- 创建/获取一个密钥。这里有些程序里会创建一个sessionKey会话密钥用于对称加密,这里创建的是非对称加密的密钥。
//--------------------------------------------------------------------
// 从密钥容器中取交换密钥
if(CryptGetUserKey(
hProv, //CSP句柄,也就是在一里面创建的,密码容器。
AT_KEYEXCHANGE, //密钥的类型,这里指名的是交换密钥。还有一个AT_SIGNATURE,这个是数字签名用的。
&hKey)) //out 获取到的密钥
{
printf("The signature key has been acquired. \n");
}
else
{
if(GetLastError() == NTE_NO_KEY) //密钥容器里不存在key pair创建之
{
if(CryptGenKey(
hProv, //in CSP句柄
AT_SIGNATURE, //in 创建的密钥对类型为signature key pair
0, //key类型,这里用默认值
&hKey)) //out 创建成功返回新创建的密钥对的句柄
{
printf("Created a signature key pair.\n");
}
else
{