你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:文章管理 / 本期精品文章
利用CryptoAPI实现AES加解密的程序设计
 

关晨至  刘振亚

摘要 本文介绍了有关CryptoAPI的一般概念,然后介绍了高级数据加密标准AESADVANCED ENCRYPTION STANDARD)。在此基础上进一步详细介绍了如何利用CryptoAPI来实现AES的应用,并封装成动态链接库以供其他程序调用。

关键词 CryptoAPIAES,动态链接库

一、引言

       CryptoAPI是一个应用程序编程接口,向开发人员提供信息安全方面的各种功能,包括各种加密算法、数字签名算法以及对密钥的管理等,这些功能实现了信息的保密性、完整性和抗抵赖性。CryptoAPI定义了很多函数以及与函数相关的常数、结构、对象,开发人员不用知道底层的细节就可以调用这些函数来实现相关功能。

AES是美国国家标准技术研究所(NIST)199712起到2000102在世界范围内公开征集,最后选择由比利时学者Vincent RijmenJoan Daemen发明的算法形成的新数据加密标准,于20011126NIST正式向世界公布。AES将取代DES成为新的数据加密标准,NIST预测其在未来二十年或更久的时间内都能保证所加密信息的安全,所以AES将在政府、商业等领域得到越来越广泛地应用。本文介绍了一种通用、快速地实现AES加解密的技术。

二、程序简介

笔者采用的开发环境为Visual C++ 6.0。为了实现通用性,程序采用动态链接库封装,调用库中两个函数,分别是EncryptfileDecryptfile,提供对文件的加密和解密功能,这样开发人员在C++VB或其他语言编写的程序中都可以调用该库。

另外,要注意的是,CryptoAPI只是一个接口,它本身不进行实际的加解密,实际的加解密是由CSPCryptographic Service Provider进行的。CSP是与CryptoAPI相互独立的操作系统的底层模块,里面包含密码标准和算法的具体实现,一般由一些动态链接库文件和签名文件构成。CSP有很多种,微软在Windows操作系统当中提供了一系列的CSPs,比如Microsoft Base Cryptographic ProviderMicrosoft Enhanced Cryptographic ProviderMicrosoft 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.defcrypt.hcrypt.cpp

crypt.def中设置需要导出的库函数,这里我们要导出两个函数:

EXPORTS

       Encryptfile

       Decryptfile

crypt.h中定义一些常量,包含其他的头文件。实现的代码如下:

#include <windows.h>   //CryptoAPI的函数、常量和结构的声明和定义

#include <stdio.h>

#include <stdlib.h>

//定义密钥的长度,前两个字节为长度,这里定义为128bit,长度越长,安全性越高,Microsoft //AES Provider支持128192256bit三种密钥长度

#define KEYLENGTH  0x00800000

//定义算法ID,不同算法的ID不同,AESID CALG_AES_128

#define ENCRYPT_ALGORITHM   CALG_AES128

//定义分组长度,AES是分组加密,分组加密算法把大块数据分成若干个一定长度的分组作//为加密和解密的基本单元,不同的算法分组长度不同,RC2的分组为64bitAES的分组

//比较灵活,官方推荐是128bit,即16个字节。

#define ENCRYPT_BLOCK_SIZE   16

       Crypt.cpp中包含了三个函数,分别是DllMainEncryptfileDecryptfileDllMain函数是DLL的入口点。代码如下:

int WINAPI DllMain(HINSTANCE hInstance,DWORD fdwReason,PVOID pvReserved)                            

{                                                                                                  

return TRUE;   //这里不需要其他的初始化,简单地返回True                                                                          

}

  推荐精品文章

·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 
·2023年7月目录
·2023年6月目录 
·2023年5月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089