linux crypto cbc 接口,【原创】前几天在linux下面写了个AES CBC 128位的加密工具

/*

From :http://voip01.cublog.cn

Author :Andy_yang

E-mail :happyyangxu@163.com

Date :2009/01/23

Descriptions: AES CBC 128 加密算法。可以批量加密路径里面所以文件。其中不满16byte的用0x00填充。最好是加密txt文件,否则pad的位会出问题。如果加密二进制文件的话重新写下 PadData()函数。例如pad最后一位添上需要pad的长度,然后解密时依照最后一位的值来还原加密前的长度。

Require : OpenSSL lib

Compile CLI :gcc -o aes_cbc_128 aes_cbc_128.c -lcrypto -static

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

unsigned int PadData (unsigned char *ibuf, unsigned int ilen, int blksize)

{

unsigned int i; /* loop counter*/

unsigned char pad; /* pad character (calculated)*/

unsigned char *p; /*pointer to end of data*/

/* calculate pad character*/

pad = (unsigned char) (blksize - (ilen % blksize));

/* append pad to end of string*/

p = ibuf + ilen;

for (i = 0; i < (int) pad; i++) {

*p = 0x00;

++p;

}

return (ilen + pad);

}

unsigned int NoPadLen (unsigned char *ibuf, unsigned int ilen)

{

unsigned int i; /* adjusted length*/

unsigned char *p; /* pointer to last character*/

p = ibuf + (ilen - 1);

i = ilen - (unsigned int) *p;

return (i);

}

void myfree(void *a)

{

if(a)free(a);

a = NULL;

}

int OpenReadInFile(char *fullname,unsigned char *OutBuf,int *rtn_size)

{

int ifd;

struct stat istat;

unsigned int inSize, bit4,count;

unsigned char *srcPtr = NULL;

*rtn_size = 0;

ifd = open(fullname,O_RDONLY,S_IREAD);

if( ifd < 0 )

{

printf("Error: Unable to open %s\n", fullname);

return(0);

}

/* Get the input file properties*/

fstat(ifd,&istat);

/* Create the input buffer*/

inSize = istat.st_size;

bit4 = inSize%4;

if(inSize+4-bit4 > 0x16000)

{

printf("File is too big.Max is 0x16000\n");

close(ifd);

return 0;

}

srcPtr = (unsigned char *) malloc(inSize+(4-bit4));

if( srcPtr == NULL )

{

printf("Error: Unable to create input buffer size of %d\n", inSize);

close(ifd);

return(0);

}

memset(srcPtr,0x0,inSize+(4-bit4));

/* Read the buffer from file to local buffer*/

count = read(ifd, (void *)srcPtr, istat.st_size);

if( count != istat.st_size )

{

printf("Debug: Need to handle multi-reads/error to buffer\n");

printf("Debug: Read returned 0x%0x\n", (unsigned int) count);

free(srcPtr);

close(ifd);

return(0);

}

memcpy(OutBuf,srcPtr,count);

*rtn_size = count;

close(ifd);

return 1;

}

int OpenWriteFile(char *fullname,char *Buffer,int size)

{

int ifd;

struct stat istat;

unsigned int inSize, bit4,count;

unsigned char *srcPtr = Buffer;

ifd = creat(fullname, S_IRUSR | S_IWUSR);

if(ifd < 0)

{

printf("Error: Unable to create %s\n", fullname );

return(0);

}

count = write(ifd, srcPtr, size);

if( size )

{

close(ifd);

printf("Error: Write size error!\n", fullname );

return(0);

}

close(ifd);

return 1;

}

void hexdump(const char *title,const unsigned char *s, int len)

{

int i;

printf("\n%s\n",title);

for(i = 0 ; i < len ; i++)

{

if((i % 16)==0)

printf("\n%04x",i);

printf(" %02x",s[i]);

}

printf("\n");

}

int Encrypty(char *Key,char *InputBuf,int in_length,unsigned char *outputBuf,int *out_length)

{

int result=0;

unsigned char iv[16];

unsigned char *Output = NULL;

unsigned char *InBuf_ptr = InputBuf;

AES_KEY ass_key;

int length_in_pad=0;

/***********************

printf("#####Key =%s\n",Key);

printf("#####input len =%d\n",in_length);*/

length_in_pad=PadData(InBuf_ptr,in_length,16);

/*printf("#####length_in_pad =%d\n",length_in_pad);

*encrypt text*/

memset(&ass_key,0x00,sizeof(AES_KEY));

result=AES_set_encrypt_key((const char *)Key,128,&ass_key);

if(result<0)

{

printf("!!!!!!!!AES_set_encrypt_key Error!!!!!!!!!!\n ");

return 0;

}

memset(iv,0,sizeof(iv));

if((Output = (unsigned char *)malloc(length_in_pad+4)) == NULL)

{

printf("malloc error!\n");

return 0;

}

memset(Output,0x00,length_in_pad+4);

AES_cbc_encrypt(InBuf_ptr,Output,length_in_pad,&ass_key,iv,AES_ENCRYPT);

memcpy(outputBuf,Output,length_in_pad);

*out_length=length_in_pad;

myfree(Output);

/**outputBuf = Output;*/

/*printf("#####encrypt out len =%d\n",*out_length);*/

return 1;

}

int main(int argc,char *argv[])

{

unsigned char Input[0x16000];

unsigned char Output[0x16000];

int OutputSize;

char ifname[256];

char fullname[256];

char ofname[256];

char dirname[256];

char dst_dirname[256];

char Key[17];/*16+1 : key length is 16 and 128 bits*/

struct dirent *ptr = NULL;

DIR * dir;

int pathlen;

int len;

if(argc != 4)

{

printf("%s \n",argv[0]);

return 0;

}

memset(Key,0,sizeof(Key));

strcpy(Key,argv[1]);

if(strlen(Key) != 16)

{

printf("Length of key must be 16 char!\n");

return 0;

}

memset(Input,0x00,0x16000);

memset(Output,0x00,0x16000);

dir =opendir(argv[2]);

strcpy(dirname,argv[2]);

if(dir == NULL)

{

/*printf("open dir %s error!Not directory!\n",argv[2]);*/

if(OpenReadInFile(argv[2],Input,&len) == 0)

{

printf("Openfile %s error!\n",argv[2]);

return 0;

}

/*printf("len:%d,Inputfile:\n%s\n",len,Input);*/

if(Encrypty(Key,Input,len,Output,&OutputSize) == 0)

{

printf("Encrypt file %s fail!\n",argv[2]);

return 0;

}

/*printf("outlen:%d\n",OutputSize);*/

/*hexdump("\nOutputfile:\n",Output,OutputSize);*/

if(OpenWriteFile(argv[3],Output,OutputSize) == 0)

{

printf("Creat encrypt file %s fail\n",argv[3]);

return 0;

}

printf("Encrypt file %s succesfull!\n",argv[2]);

return 1;

}

strcpy(dst_dirname,argv[3]);

pathlen = strlen(dst_dirname);

if(dst_dirname[pathlen] != '/')

strcat(dst_dirname,"/");

while((ptr = readdir(dir))!=NULL)

{

memset(Input,0x00,0x16000);

memset(Output,0x00,0x16000);

strcpy(ifname, ptr->d_name);

if(strcmp(ifname,".") == 0 || strcmp(ifname,"..") == 0 || strstr(ifname,".txt") == NULL)

continue;

snprintf(fullname,256,"%s%s",dirname,ifname);

/*printf("open full path file %s !\n",fullname);*/

snprintf(ofname, 256,"%s%s.ser",dst_dirname,ifname);

/*printf("open file %s !\n",ifname);*/

if(OpenReadInFile(fullname,Input,&len) == 0)

{

printf("Open file %s fail!\n",fullname);

continue;

}

if(Encrypty(Key,Input,len,Output,&OutputSize) == 0)

{

printf("Encrypt file %s fail!\n",fullname);

continue;

}

if(OpenWriteFile(ofname,Output,OutputSize) == 0)

{

printf("Creat encrypt file %s fail!\n",fullname);

continue;

}

printf("Encrypt file %s succesfull!\n",fullname);

}

closedir(dir);

return 1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值