⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aeslib.c

📁 简单好用的AES算法
💻 C
字号:
#if _MSC_VER > 1000
#pragma once
#endif

#include <windows.h>
#include <stdio.h>

#include "aes.h"

int aesEncryptFile(char* szSrcFile,char* szDesFile,char* szPassword)
{
    aes alg;
	FILE *fpSrc=NULL,*fpDes=NULL;
	byte InBuffer[4096],OutBuffer[4096],Block[BLOCK_SIZE],Enc[BLOCK_SIZE],*p;
	int  nRead=0,nWrite=0,nReturn=0,i=0,nPacking=0;
	unsigned char szPwd[16];

	alg.mode = 0;

	//有效密码最长为16字节
	memset(szPwd,'\0',sizeof(szPwd));
	p=szPassword;
	i=0;
	while(p&&*p)
	{
		szPwd[i]=*p;
		p++;
		i++;
		if(i>=16) break;
	}
	set_key( szPwd, 16, enc, &alg);
	//打开源文件
	fpSrc=fopen(szSrcFile,"rb");
	if(!fpSrc)
	{
		nReturn = -1;
		goto H_CLEANUP;
	}
	//打开目标文件
	fpDes=fopen(szDesFile,"wb");
	if(!fpDes) 
	{
		nReturn = -2;
		goto H_CLEANUP;
	}
	//加密数据
	while(!feof(fpSrc))
	{
		memset(InBuffer,0,sizeof(InBuffer));
		nRead=fread(InBuffer,1,sizeof(InBuffer),fpSrc);
		if(nRead>0)
		{
			//将读取内容按16字节分块,对最末块中不足的部分用(16 - 差数)填充,如:
			//最末块读取了10字节,则11至16字节都填充6
			if(feof(fpSrc))
			{
				nPacking=BLOCK_SIZE - nRead%BLOCK_SIZE;
				for(i=nRead;i<(nRead+BLOCK_SIZE);i++) *(InBuffer+i)=nPacking;
				//printf("nPacking=%d %d\r\n",nPacking,*(InBuffer+nRead+3));
			}

			memset(OutBuffer,0,sizeof(OutBuffer));
			i=0;
			while(i<nRead)
			{
				memcpy(Block,InBuffer+i,BLOCK_SIZE);
				encrypt(Block,Enc,&alg);
				memcpy(OutBuffer+i,Enc,BLOCK_SIZE);
				i+=BLOCK_SIZE;
			}
			nWrite=fwrite(OutBuffer,1,i,fpDes);
			if(nWrite<=0)
			{
				nReturn = -3;
				break;
			}
		}
	}

H_CLEANUP:
	if(fpSrc) fclose(fpSrc);
	if(fpDes) fclose(fpDes);

	return nReturn;
}

int aesDecryptFile(char* szSrcFile,char* szDesFile,char* szPassword)
{
	aes alg;
	FILE *fpSrc=NULL,*fpDes=NULL;
	byte InBuffer[4096],OutBuffer[4096],Block[BLOCK_SIZE],Dec[BLOCK_SIZE],*p;
	int  nRead=0,nWrite=0,nReturn=0,i=0,j=0,nPacking=0;
	unsigned char szPwd[16];

	alg.mode = 0;

	//有效密码最长为16字节
	memset(szPwd,'\0',sizeof(szPwd));
	p=szPassword;
	i=0;
	while(p&&*p)
	{
		szPwd[i]=*p;
		p++;
		i++;
		if(i>=16) break;
	}
	set_key( szPwd, 16, dec, &alg);
	//打开源文件
	fpSrc=fopen(szSrcFile,"rb");
	if(!fpSrc) 
	{
		nReturn = -1;
		goto H_CLEANUP;
	}
	//打开目标文件
	fpDes=fopen(szDesFile,"wb");
	if(!fpDes)
	{
		nReturn = -2;
		goto H_CLEANUP;
	}
	//解密数据
	while(!feof(fpSrc))
	{
		memset(InBuffer,0,sizeof(InBuffer));
		nRead=fread(InBuffer,1,sizeof(InBuffer),fpSrc);
		if(nRead>0)
		{
			memset(OutBuffer,0,sizeof(OutBuffer));
			i=0;
			while(i<nRead)
			{
				memcpy(Block,InBuffer+i,BLOCK_SIZE);
				decrypt(Block,Dec,&alg);
				memcpy(OutBuffer+i,Dec,BLOCK_SIZE);
				i+=BLOCK_SIZE;
			}
			//最末块中去掉加密前引入的填充位(块大小为16字节)
			if(feof(fpSrc)){
				//for(j=1;j<=16;j++) printf("OutBuffer[%d]=%d\r\n",i-j,OutBuffer[i-j]);
				j=0;
				p=OutBuffer+i-1;//块中最后一字节
				nPacking=(int)*p;
				while(*p==nPacking){
					j++;
					p--;
					if(j>=nPacking) break;
				}
				//printf("j=%d i=%d\r\n",j,i);
				if(j>0) i-=j;
			}
			//nWrite=fwrite(OutBuffer,1,nRead,fpDest);//写到目的文件
			nWrite=fwrite(OutBuffer,1,i,fpDes);//写到目的文件
			if(nWrite<i)
			{
				nReturn = -3;
				break;
			}
		}
	}

H_CLEANUP:
	if(fpSrc) fclose(fpSrc);
	if(fpDes) fclose(fpDes);

	return nReturn;
}

int aesEncryptBlock(const unsigned char in_blk[],unsigned int in_blk_len,unsigned char out_blk[],unsigned int *out_blk_len,char* szPassword)
{
    aes alg;
	byte Block[BLOCK_SIZE],Enc[BLOCK_SIZE],*p;
	int  nReturn=0,i=0,j=0,nPacking=0,nMode=0,nCount=0;
	unsigned char szPwd[16];

	if(*out_blk_len<in_blk_len) return -1;
	if(*out_blk_len%BLOCK_SIZE!=0) return -2;

	alg.mode = 0;

	//有效密码最长为16字节
	memset(szPwd,'\0',sizeof(szPwd));
	p=szPassword;
	i=0;
	while(p&&*p)
	{
		szPwd[i]=*p;
		p++;
		i++;
		if(i>=16) break;
	}
	set_key( szPwd, 16, enc, &alg);

	//加密数据
	if(in_blk_len>0)
	{
		memset(out_blk,0,*out_blk_len);
		i=0;
		for(nCount=(int)(in_blk_len/BLOCK_SIZE);nCount>0;nCount--)
		{
			memcpy(Block,in_blk+i,16);
			encrypt(Block,Enc,&alg);
			memcpy(out_blk+i,Enc,16);
			i+=16;
		}

		//将读取内容按16字节分块,对最末块中不足的部分用(16 - 差数)填充,如:
		//最末块读取了10字节,则11至16字节都填充6
		nMode=in_blk_len%BLOCK_SIZE;
		if(nMode>0)
		{
			memset(Block,0,BLOCK_SIZE);
			memcpy(Block,in_blk+i,nMode);
			nPacking=BLOCK_SIZE - nMode;
			for(j=nMode;j<BLOCK_SIZE;j++) *(Block+j)=nPacking;
			encrypt(Block,Enc,&alg);
			memcpy(out_blk+i,Enc,16);
			i+=16;
		}
		*out_blk_len=i;
	}

	return nReturn;
}

int aesDecryptBlock(const unsigned char in_blk[],unsigned int in_blk_len,unsigned char out_blk[],unsigned int *out_blk_len,char* szPassword)
{
	aes alg;
	byte Block[BLOCK_SIZE],Dec[BLOCK_SIZE],*p;
	int  nReturn=0,i=0,j=0,nPacking=0,nCount=0;
	unsigned char szPwd[16];

	if(*out_blk_len<in_blk_len) return -1;
	if(*out_blk_len%BLOCK_SIZE!=0) return -2;

	alg.mode = 0;

	//有效密码最长为16字节
	memset(szPwd,'\0',sizeof(szPwd));
	p=szPassword;
	i=0;
	while(p&&*p)
	{
		szPwd[i]=*p;
		p++;
		i++;
		if(i>=16) break;
	}
	set_key( szPwd, 16, dec, &alg);

	//解密数据
	memset(out_blk,0,*out_blk_len);
	i=0;
	for(nCount=(int)(in_blk_len/BLOCK_SIZE);nCount>0;nCount--)
	{
		memcpy(Block,in_blk+i,BLOCK_SIZE);
		decrypt(Block,Dec,&alg);
		if(nCount==1)//最末块中去掉加密前引入的填充位(块大小为16字节)
		{
			//for(j=1;j<=BLOCK_SIZE;j++) printf("Dec[%d]=%d\r\n",i-j,Dec[i-j]);
			j=0;
			p=Dec+BLOCK_SIZE-1;//块中最后一字节
			nPacking=(int)*p;
			while(*p==nPacking){
				j++;
				p--;
				if(j>=nPacking) break;
			}
			//printf("j=%d i=%d\r\n",j,i);
			memcpy(out_blk+i,Dec,BLOCK_SIZE-j);
			*out_blk_len=i+BLOCK_SIZE-j;
		}else
		{
			memcpy(out_blk+i,Dec,BLOCK_SIZE);
			*out_blk_len=i+BLOCK_SIZE;
		}
		i+=BLOCK_SIZE;
	}

	return nReturn;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -