📄 aeslib.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 + -