昨天有个同事问我linux下有没有什么简单的加密文件的开源组件,找了一下没找到,索性自己写一个,反正要求不高,能隐藏ascii码的明文就OK了。
纯属娱乐:懒得文字描述如何加密的,一切看代码,简简单单~
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#define BLOCK 4*1024 // 4K
#define MAGIC 0xFF88AA99
#define DEBUG 1
static int error=0; /* flag for error */
struct file_head
{
int magic;
int separate;
unsigned char secret;
};
void usage(char *name)
{
printf("Usage:%s [command] [sourcefilename] [destfilename]\n",name);
printf("command: E(ncrypt)|D(ecrypt) \n");
}
int my_encrypt(char *src, char *dest);
int my_decrypt(char *src, char *dest);
unsigned char create_secret()
{
srand((int)time(0));
return (unsigned char)(1+(int)(rand()*0XFF/(0xFF+1.0)));
}
int main(int argc, char **argv)
{
if(argc<4)
{
usage(argv[0]);
return -1;
}
switch(*argv[1])
{
case 'E':
my_encrypt(argv[2],argv[3]);
break;
case 'D':
my_decrypt(argv[2], argv[3]);
break;
default:
printf("%s:Unknow command!\n",argv[1]);
usage(argv[0]);
break;
}
if(error)
{
unlink(argv[3]);
}
return 0;
}
int my_encrypt(char *src, char *dest)
{
unsigned char buf[BLOCK]={0};
int ret_r=0,i,ret_w=0;
struct file_head head;
int rfd=-1,wfd=-1;
if((rfd = open(src,O_RDONLY))<0)
{
printf("Open %s: %s\n",src,strerror(errno));
return -1;
}
if((wfd = open(dest,O_WRONLY | O_CREAT | O_EXCL , 0666)) <0 )
{
printf("Create %s: %s\n",dest,strerror(errno));
close(rfd);
return -1;
}
// fill the file head
head.magic = MAGIC;
head.separate = create_secret()%88;
head.secret = create_secret();
if((ret_w=write(wfd, &head, sizeof(struct file_head))) != sizeof(struct file_head))
{
perror("write:");
error = 1;
return -1;
}
#ifdef DEBUG
printf("head: magic=%x separate=%d secret=%x\n",head.magic, head.separate, head.secret);
#endif
// end
while((ret_r=read(rfd,buf,BLOCK)) > 0 )
{
for(i=0; i<ret_r; i++)
{
if(i%(head.separate) == 0)
{
buf[i] = ~buf[i];
}
else
{
buf[i] ^= head.secret;
}
}
if((ret_w=write(wfd,buf,ret_r)) != ret_r)
{
perror("write:");
error = 1;
return -1;
}
bzero(buf, BLOCK);
}
if(rfd>0)
{
close(rfd);
}
if(wfd>0)
{
close(wfd);
}
return 0;
}
int my_decrypt(char *src, char *dest)
{
unsigned char buf[BLOCK]={0};
int ret_r=0,i,ret_w=0;
struct file_head head;
int rfd=-1,wfd=-1;
if((rfd = open(src,O_RDONLY))<0)
{
printf("Open %s: %s\n",src,strerror(errno));
return -1;
}
if((wfd = open(dest,O_WRONLY | O_CREAT | O_EXCL , 0666)) <0 )
{
printf("Create %s: %s\n",dest,strerror(errno));
close(rfd);
return -1;
}
if((ret_r=read(rfd, &head, sizeof(struct file_head))) != sizeof(struct file_head))
{
perror("read");
error = 1;
close(rfd);
close(wfd);
return -1;
}
#ifdef DEBUG
printf("head: magic=%x separate=%d secret=%x\n",head.magic, head.separate, head.secret);
#endif
if(head.magic!=MAGIC|| head.separate <0 || head.separate >88 || head.secret<0)
{
printf("error:%s is illegal encrypt file!\n",src);
close(rfd);
close(wfd);
error = 1;
return -1;
}
while((ret_r=read(rfd,buf,BLOCK)) > 0 )
{
for(i=0; i<ret_r; i++)
{
if(i%(head.separate) == 0)
{
buf[i] = ~buf[i];
}
else
{
buf[i] ^= head.secret;
}
}
if((ret_w=write(wfd,buf,ret_r)) != ret_r)
{
perror("write:");
error = 1;
return -1;
}
bzero(buf, BLOCK);
}
if(rfd>0)
{
close(rfd);
}
if(wfd>0)
{
close(wfd);
}
return 0;
}