摘要 本文介绍了有关CryptoAPI的一般概念,然后介绍了高级数据加密标准AES(ADVANCED ENCRYPTION STANDARD)。在此基础上进一步详细介绍了如何利用CryptoAPI来实现AES的应用,并封装成动态链接库以供其他程序调用。
关键词 CryptoAPI,AES,动态链接库
一、引言
CryptoAPI是一个应用程序编程接口,向开发人员提供信息安全方面的各种功能,包括各种加密算法、数字签名算法以及对密钥的管理等,这些功能实现了信息的保密性、完整性和抗抵赖性。CryptoAPI定义了很多函数以及与函数相关的常数、结构、对象,开发人员不用知道底层的细节就可以调用这些函数来实现相关功能。
AES是美国国家标准技术研究所(NIST)自1997年1月2日起到2000年10月2日在世界范围内公开征集,最后选择由比利时学者Vincent Rijmen和Joan Daemen发明的算法形成的新数据加密标准,于2001年11月26日由NIST正式向世界公布。AES将取代DES成为新的数据加密标准,NIST预测其在未来二十年或更久的时间内都能保证所加密信息的安全,所以AES将在政府、商业等领域得到越来越广泛地应用。本文介绍了一种通用、快速地实现AES加解密的技术。
二、程序简介
笔者采用的开发环境为Visual C++ 6.0。为了实现通用性,程序采用动态链接库封装,调用库中两个函数,分别是Encryptfile和Decryptfile,提供对文件的加密和解密功能,这样开发人员在C++、VB或其他语言编写的程序中都可以调用该库。
另外,要注意的是,CryptoAPI只是一个接口,它本身不进行实际的加解密,实际的加解密是由CSP(Cryptographic Service Provider)进行的。CSP是与CryptoAPI相互独立的操作系统的底层模块,里面包含密码标准和算法的具体实现,一般由一些动态链接库文件和签名文件构成。CSP有很多种,微软在Windows操作系统当中提供了一系列的CSPs,比如Microsoft Base Cryptographic Provider、Microsoft Enhanced Cryptographic Provider、Microsoft AES Cryptographic Provider等。这些CSPs支持的算法种类有些不同,分别适用于不同的场合,比如有的CSP提供数字签名服务而有的则提供数据加密服务。下表列出了Microsoft AES Cryptographic Provider支持的部分算法。应用程序可以选择CSP以实现特定的功能,但不能直接与CSP交互,而必须通过CryptoAPI中介。
Microsoft AES Cryptographic Provider支持的部分算法
算法 ID |
算法描述 |
注释 |
CALG_3DES |
三重DES. |
密钥长度: 168 bits. |
CALG_AES_128 |
AES分组加密 |
密钥长度: 128 bits. |
CALG_DES |
DES 加密. |
密钥长度: 56 bits. |
CALG_MD5 |
MD5 哈希 |
|
CALG_RC2 |
RC2 分组加密 |
密钥长度: 128 bits. |
CALG_RC4 |
RC4 流加密 |
密钥长度: 128 bits. |
CALG_RSA_SIGN |
RSA 公钥签名 |
默认密钥长度: 1,024 bits. |
CALG_SHA_512 |
SHA哈希 |
密钥长度: 512 bits. |
三、程序实现
1.动态链接库设计
库取名为crypt.dll,源文件主要有三个,crypt.def、crypt.h和crypt.cpp。
crypt.def中设置需要导出的库函数,这里我们要导出两个函数:
EXPORTS
Encryptfile
Decryptfile
crypt.h中定义一些常量,包含其他的头文件。实现的代码如下:
#include <windows.h> //CryptoAPI的函数、常量和结构的声明和定义
#include <stdio.h>
#include <stdlib.h>
//定义密钥的长度,前两个字节为长度,这里定义为128bit,长度越长,安全性越高,Microsoft //AES Provider支持128、192和256bit三种密钥长度
#define KEYLENGTH 0x00800000
//定义算法ID,不同算法的ID不同,AES的ID 为CALG_AES_128
#define ENCRYPT_ALGORITHM CALG_AES128
//定义分组长度,AES是分组加密,分组加密算法把大块数据分成若干个一定长度的分组作//为加密和解密的基本单元,不同的算法分组长度不同,RC2的分组为64bit,AES的分组
//比较灵活,官方推荐是128bit,即16个字节。
#define ENCRYPT_BLOCK_SIZE 16
Crypt.cpp中包含了三个函数,分别是DllMain、Encryptfile和Decryptfile。DllMain函数是DLL的入口点。代码如下:
int WINAPI DllMain(HINSTANCE hInstance,DWORD fdwReason,PVOID pvReserved)
{
return TRUE; //这里不需要其他的初始化,简单地返回True。
}