C语言简单的文件加密

昨天有个同事问我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;
	
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值