给文件简单加密

#include <iostream>
#include <string>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define BUFF_LEN 1024

using namespace std;

long file_len(string file_name);

void init(string file_name)
{
}

void release()
{
}

int get_random(int max_rand)
{
srand (time(NULL));
int r = rand() % max_rand + 1;
return r;
}

long file_len(string file_name)
{
FILE * pFile;
long size;

pFile = fopen (file_name.c_str(),"rb");
if (pFile==NULL) perror ("Error opening file");
else
{
fseek (pFile, 0, SEEK_END); // non-portable
size=ftell (pFile);
fclose (pFile);
printf ("Size of myfile.txt: %ld bytes.\n",size);
}
return size;
}

void buff_reverse(char *buff, size_t len, FILE *ou_f)
{
for (int i = len - 1; i >= 0; --i)
{
fputc(buff[i], ou_f);
}
}

void encry_file(string src_file, string tgt_file, int rand_seed)
{
FILE *in_f = fopen(src_file.c_str(), "rb");
FILE *ou_f = fopen(tgt_file.c_str(), "wb");
int r = get_random(rand_seed);
fwrite(&rand_seed, sizeof(int), 1, ou_f);
fwrite(&r, sizeof(int), 1, ou_f);
char buff[BUFF_LEN];
r = get_random(BUFF_LEN);

size_t len = fread(buff, sizeof(char), r, in_f);
while (!feof(in_f))
{
fwrite(&len, sizeof(int), 1, ou_f);
buff_reverse(buff, len, ou_f);
r = get_random(BUFF_LEN);
len = fread(buff, sizeof(char), r, in_f);
}
fwrite(&len, sizeof(int), 1, ou_f);
buff_reverse(buff, len, ou_f);
fclose(in_f);
fclose(ou_f);
}

int is_not_accu(int rand_seed, int c)
{
int g = get_random(rand_seed);
printf("rand_seed:%d, key:%d, guess:%d\n", rand_seed, c, g);
if (c == g) return 0;
else return 1;
}

int decry_file(string src_file, string tgt_file)
{
FILE *in_f = fopen(src_file.c_str(), "rb");

int rand_seed, c;
char buff[BUFF_LEN];
fread(&rand_seed, sizeof(int), 1, in_f);
fread(&c, sizeof(int), 1, in_f);
//verification part
if (is_not_accu(rand_seed, c)) {
printf("failed\n");
return 1;
}

FILE *ou_f = fopen(tgt_file.c_str(), "wb");
size_t len = fread(&c, sizeof(int), 1, in_f);
while (!feof(in_f))
{
size_t len_in = fread(buff, sizeof(char), c, in_f);
buff_reverse(buff, len_in, ou_f);
len = fread(&c, sizeof(int), 1, in_f);
}
size_t len_in = fread(buff, sizeof(char), c, in_f);
buff_reverse(buff, len_in, ou_f);
fclose(in_f);
fclose(ou_f);

printf("success\n");
return 0;
}

void args()
{
printf("encrypt src_file tgt_file rand_seed\n");
printf("decrypt src_file tgt_file\n");
}

int main(int argc, char **argv)
{
if (argc < 3)
{
args();
return 1;
}
string comm = string(argv[1]);
if (comm == "encrypt")
{
string src_file = string(argv[2]);
string tgt_file = string(argv[3]);
int rand_seed = atoi(argv[4]);
encry_file(src_file, tgt_file, rand_seed);
}
else if (comm == "decrypt")
{
string src_file = string(argv[2]);
string tgt_file = string(argv[3]);
decry_file(src_file, tgt_file);
}

}

转载于:https://www.cnblogs.com/fanzhijun/p/3702942.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值