通过对文件的内容进行异或运算来实现对文件简单的加密解密。

原理

异或运算
百度百科:异或

1.在百度百科的介绍中异或运算有如下的运算性质:

同一变量与另一变量和其异或值异或等于另一个数
即:(a^b)^b=a

2.则可容易得出:

将一个变量与另一个变量进行两次异或运算会得到原变量

3.利用这个性质
加密:对文件所有字节与key(key是任意字符串)进行一次异或运算,得到加密后的文件
解密:对加密后的文件所有字节与key再次进行一次异或运算,得到原文件

流程


加密

  • 以二进制打开文件,读文件的前N个字节
  • 对每个字节和key进行异或运算
  • 用运算过的字节覆盖原来的字节
  • 关闭文件

解密
由于我们是通过异或加密文件的,所以解密文件只需要在使用原来加密的key再执行一次lock()就行了

具体实现


bool lock(const char* filepath, const char* key, size_t lock_len)
{
    FILE* read_fp = nullptr;
    errno_t errcode = fopen_s(&read_fp, filepath, "rb+");
    if (errcode != 0)
    {
        printf("打开文件失败!!!");
        return false;
    }
    if (read_fp == nullptr)
    {
        return false;
    }

    rewind(read_fp);
    char* dat = new char[lock_len];


    fread_s(dat, lock_len, lock_len, 1, read_fp);

    fclose(read_fp);
    //--------------------加密部分---------------------------
    size_t j = 0;
    size_t max = strlen(key) - 1;

    for (size_t i = 0; i < lock_len; i++)
    {
        j == max ? j = 0 : j++;
        dat[i] = dat[i] ^ key[j];
    }

    //-------------------------------------------------------
    FILE* write_fp = nullptr;
    errcode = fopen_s(&write_fp, filepath, "rb+");
    if (errcode != 0)
    {
        printf("打开文件失败!!!");
        return false;
    }
    if (write_fp == nullptr)
    {
        return false;
    }

    rewind(write_fp);
    fwrite(dat, lock_len, 1, write_fp);
    
    fclose(write_fp);

    delete[] dat;
    return true;
}

参数说明:
filepath:需要加密的文件的路径
key:加密的密钥
lock_len:加密文件的前多少个字节

Last modification:April 15th, 2020 at 02:01 pm