📄 xaes.h
字号:
//---------------------------------------------------------------------------
// AES加密算法
// 2004-09-16 Netsys封装,mike888@163.net
//---------------------------------------------------------------------------
/*
告别DES 迎接AES
你的数据需要加密保护吗?你还在使用DES,3DES吗?
旧的数据加密标准DES自二十世纪七十年代采用以来,基本上算是不错的数据加密算法。
不过由于它使用的密钥相对较小(56位),采用强力攻击下DES有被攻破的纪录。
实际上,现在对安全性能要求较高的用户愿意采用加强型的DES,叫做3DES。用3DES进行
加密,需要对一小段数据运算3次,不言而喻,加密的速率大大降低。
随着Internet、智能卡、手机和掌上电脑等应用日益普及,对通信安全的要求也增强了。
不过这些小型设备需要的是,用更少代码,占用更少资源的数据加密算法,所以3DES不是今后
这方面需求的解决办法。
美国国家技术标准委员会(NIST)1996年启动了“先进加密标准”AES的制定工作,经过三
年漫长的过程,最终于2000年10月选定了比利时的研究成果“Rijndael”作为AES的基础(最
后的备选方案有五套,向全世界公布方案,征求破解,最后取胜的Rijndael以高安全度,高
速度和易于计算机处理而中选)。
AES和3DES比较
AES 3DES
------------------------------------------------------------------------
算法类型(数据加密) 对称block密码 对称feistel密码
密钥大小 128、192、256位 112位或168位
速度 高 低
解密时间(每秒尝试255个) 1490000亿年 46亿年
资源消耗 低 中
------------------------------------------------------------------------
坚固的安全性能
AES内部有更简洁精确的数学算法,而加密数据只需一次通过。AES被设计成高速,坚固的
安全性能,而且能够支持各种小型设备。AES与3DES相比,不仅是安全性能有重大差别,使用
性能和资源有效利用上也有很大差别。
RSA公司是已广泛运用的数据加密算法和开发工具包的开发商,已经宣布支持AES。(RSA
也参与了AES的竞选,只是它的加密算法未被选中。
Cisco公司也已经发表支持AES的文章,对虚拟专用网(VPN)来说,IETF已经制定了在IP安
全标准中AES的实施细则。
IT业界愿意在网络中使用AES的原因是AES能提供更快的数据加密方法,且与各种不同的
产品兼容。如无线E-mail、财务交易和一些特殊应用场合。
遵循AES标准,IT界的最大收益是使产品标准化并降低成本,取得更广的兼容性、更多的
创新和更强的灵活性。
IT部门要采取的一个重要步骤是,针对要加密的数据处理设备制定方案时,与AES标准兼
容并符合AES要求。如果目前还不能支持AES,最好制定一个时间表,以便到时能免费升级。
对AES感兴趣的朋友可去看这本书:
《高级加密标准(AES)算法—Rijndael的设计》
出版社 : 清华大学出版社
http://www.huachu.com.cn/itbook/itbookinfo.asp?lbbh=BI99652365
*/
//---------------------------------------------------------------------------
#ifndef XAesH
#define XAesH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
//---------------------------------------------------------------------------
class PACKAGE TXAes : public TComponent
{
private:
int FKeyLen;
void __fastcall SetKeyLen( int AKeyLen );
protected:
public:
__fastcall TXAes(TComponent* Owner);
//---------------------------------------------------------------------------
/* 辅助函数 */
//---------------------------------------------------------------------------
// 将16进制转换为字符串,例如:输入0x12,0x34,0x56,0x78,输出"12345678"
char * __fastcall HexToStr(BYTE *src,char *dest,int inlen);
// 将字符串转换为16进制,不足前补0,例如:输入"12345678",输出0x12,0x34,0x56,0x78)
bool __fastcall StrToHex(char *src,int inlen,BYTE *dest,int outlen);
//---------------------------------------------------------------------------
// 加解密函数
//---------------------------------------------------------------------------
// (1) 数据块长度必须是 16 byte 的整数倍
// (2) 输入和输出可以使用相同的buf
//---------------------------------------------------------------------------
// 加密一块
bool __fastcall AESEncBlk(const BYTE in_blk[], BYTE out_blk[], BYTE key[]);
// 解密一块
bool __fastcall AESDecBlk(const BYTE in_blk[], BYTE out_blk[], BYTE key[]);
// 加密多块(CBC,IV长度16 bytes,可设为全0x0)
bool __fastcall AESEncBuf( BYTE in_buf[], UINT inlen, BYTE out_buf[], BYTE key[], BYTE IV[]);
// 解密多块(CBC,IV长度16 bytes,可赋为全0x0)
bool __fastcall AESDecBuf( BYTE in_buf[], UINT inlen, BYTE out_buf[], BYTE key[], BYTE IV[]);
// 加密文件,输入和输出文件名不能相同
bool __fastcall AESEncFile( char *filein, char *fileout,BYTE key[] );
// 解密文件,输入和输出文件名不能相同
// 返回: 1:成功, 0:文件打开错;-1:密钥错; -2: 文件长度错;-3:读错
int __fastcall AESDecFile( char *filein, char *fileout,BYTE key[] );
__published:
__property int KeyLen = { read = FKeyLen, write = SetKeyLen}; // 密钥长度,只能选16,24,32 byte
};
//---------------------------------------------------------------------------
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -