文件加密二进制版本

这个 还希望如果有高玩的话,帮忙看一下,不知道为什么实现不了非文本文件的加解密。

我觉得问题就在下面标红加下划线的地方。分别在 code.c 跟 decode.c里面。

main.c

#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)
#include "code.h"
#include "decode.h"

void workflow(const int argc, const char **argv);
void judgeCodeOrDecode(const int argc, const char **argv);
/** 
    二进制文件加解密,模仿之前那个高级的版本做一个,这次要求不同的代码块要分开。
    最后一个参数是一个八进制的码。这个密码强度感觉比之前那个数字的要牛。但是不知道是否经得起检验试试看吧。如果一个几十Mb的东西没问题,估计就没问题了。
*/
int main(int argc,char **argv){

    workflow(argc,argv);

    return 0;
}

void workflow(const int argc, const char **argv){

    if (argc < 5){
        printf("参数过少,需要5个参数
");
    }
    else if (argc>5){
        printf("参数过多,需要5个参数
");
    }
    else {
        //justCopy();
        judgeCodeOrDecode(argc,argv);
    }
}
void judgeCodeOrDecode(const int argc, const char **argv){
    if (strcmp(argv[3], "code") == 0){
        codeFile(argv);
    }
    else if (strcmp(argv[3], "decode") == 0){
        decodeFile(argv);
    }
    else{
        printf("请输入 code 或者 decode,来进行 编码 或者 解码 操作。");
    }

}

code.h

#ifndef _CODEH
#define _CODEH

void coding(char *, const int, const char *key);
void codeFile(const char **argv);

#endif

code.c

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)

/** 
    实质上就是 一个文件写入操作。
*/
void coding(char *,const int,const char *key);
void codeFile(const char **argv);
/** 
    argv[0]是exe名字.
    argv[1]是 文件的第一个名字。
    argv[2] 是文件的第二个名字。
    argv[3] 选择是否编解码
    argv[4] 秘钥 这个地方有点儿问题 先不做那么麻烦的。先弄成10进制数字吧。
    所以 这里code需要345.
*/


void codeFile(const char **argv){


    FILE *src = fopen(argv[1], "rb");
    if (src==NULL){
        printf("加密失败,源文件未找到
");
    }
    FILE *dest = fopen(argv[2], "wb");
    
    char buf[1024 * 4] = { 0 };
    while (!feof(src)){
        size_t size = fread(buf, 1, sizeof(buf), src);
        coding(buf,size,argv[4]);
        fwrite(buf, 1, size, dest);
    }


}
void coding(char *str,const int len,const char *key){
    int i = 0;
    int mykey = atoi(key);
    //printf(mykey);
    //getchar();
    for (; i < len; i++){
        str[i] += mykey;
    }
}

decode.h

#ifndef _DECODEH
#define _DECODEH

void decoding(char *, const int, const char *key);
void decodeFile(const char **argv);

#endif

decode.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#pragma warning(disable:4996)

/**
实质上就是 一个文件写入操作。
*/
void decoding(char *, const int, const char *key);
void decodeFile(const char **argv);
/**
argv[0]是exe名字.
argv[1]是 文件的第一个名字。
argv[2] 是文件的第二个名字。
argv[3] 选择是否编解码
argv[4] 秘钥 这个地方有点儿问题 先不做那么麻烦的。先弄成10进制数字吧。
所以 这里code需要345.
*/


void decodeFile(const char **argv){


    FILE *src = fopen(argv[1], "rb");
    if (src == NULL){
        printf("解密失败,源文件未找到
");
    }
    FILE *dest = fopen(argv[2], "wb");

    char buf[1024 * 4] = { 0 };
    while (!feof(src)){
        size_t size = fread(buf, 1, sizeof(buf), src);
        decoding(buf, size, argv[4]);
        fwrite(buf, 1, size, dest);
    }


}
void decoding(char *str, const int len, const char *key){
    int i = 0;
    int mykey = atoi(key);
    //printf(mykey);
    //getchar();
    for (; i < len; i++){
        str[i] -= mykey;
    }
}
原文地址:https://www.cnblogs.com/letben/p/5252200.html