C++实现通用的文件(万能)加密方案 您所在的位置:网站首页 文本内容加密 C++实现通用的文件(万能)加密方案

C++实现通用的文件(万能)加密方案

2024-06-18 03:35| 来源: 网络整理| 查看: 265

最近做了一个项目,里面有一个小需求就是对处理过的文件进行加密,加密之后无法打开。我最先想到的是异或加密,因为需要速度,并且对加密的安全性要求不高。

1、异或加密原理

        异或密码(simple XOR cipher)是密码学中一种简单的加密算法,是指对信息进行异或操作来达到加密和解密目的。按这种逻辑,文本串行的每个字符可以通过与给定的密钥进行按位异或运算来加密。如果要解密,只需要将加密后的结果与密钥再次进行按位异或运算即可。

        说的通俗一点,就是一个字符异或一个密钥字符进行加密,解密的时候,则用加密后的字符再次异或密钥字符则能够还原。

        异或加密的原理就是使用了异或运算符的运算特点!例如异或密钥key是10101010,待加密的字符s1的二进制表示为01010101,则进行加密处理(s1 ^ key)后的结果s2为 11111111,如果要解密还原,则使用密钥key再次异或处理(s2 ^ key)就能够还原为s1。

2、文件加密流程

        对文件进行加密的流程就比较简单了,步骤如下:

用二进制方式读取文件将文件读到缓冲区每次从缓冲区读取一个字符对读取的字符进行异或加密加密结果保存到结果缓冲区读取下一个字符进行加密(循环执行)加密结束后保存到加密文件

         那么,解密的流程呢?

        其实解密和加密的流程一模一样,因为加密和解密的密钥是一样的!

        这里有一些地方是可以进行优化改进的,例如:

大文件的情况:大文件可能导致超过内存大小效率问题:每个字符都进行了加密安全问题:单个字符作为密钥比较容易破解无法区分文件是否已经加密

        以上问题咱们放在第4部分再进行讨论!

3、C++实现

        实现部分用标准C++,支持跨平台的使用。这里我封装了一个处理类,大家直接看代码吧!

注意:代码中的方法是对pdf文件进行加解密操作,并不表示无法对其他文件进行操作。因为,所有的文件(不管pdf还是其他的文件)都是保存为二进制的,所以使用我提供的方法一样可以进行加解密操作!

所以这个加密方案就是一个通用万能的加解密方案!

h文件:

#ifndef __MasterEncoder_H__ #define __MasterEncoder_H__ #include #include using namespace std; class MasterEncoder { public: static MasterEncoder* getInstance(); MasterEncoder(); ~MasterEncoder(); void setSignAndKey(char* sign, int signLen, unsigned char key); void decode(unsigned char* data, long size); void encode(unsigned char* data, long size); void writePDF(const string& filePath, unsigned char* data, long size); unsigned char* readPDF(const string& filepath, long& size); public: void encodePDF(const string& pdfPath, const string& savePath); void decodePDF(const string& pdfPath, const string& savePath); unsigned char* decode(const string& pdfPath, long& size); private: static MasterEncoder* _instance; static mutex _mtx; unsigned char _codeKey; char* _sign; int _signLen; }; #endif // !MasterEncoder

cpp文件:

#include "MasterEncoder.h" #include #include #include #include #include using namespace std; MasterEncoder* MasterEncoder::_instance = nullptr; mutex MasterEncoder::_mtx; MasterEncoder* MasterEncoder::getInstance() { if (_instance == nullptr) { _mtx.lock(); if (_instance == nullptr) _instance = new MasterEncoder(); _mtx.unlock(); } return _instance; } MasterEncoder::MasterEncoder() : _codeKey{100} , _sign{nullptr} , _signLen{0} { } MasterEncoder::~MasterEncoder() { } void MasterEncoder::setSignAndKey(char* sign, int signLen, unsigned char key) { if (sign && signLen) { _signLen = signLen; _sign = new char[signLen]; if (_sign) { memcpy(_sign, sign, signLen); } else { cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有