Open alexey-malov opened 5 years ago
bool Crypt(std::ifstream& inputFile, std::ofstream &outputFile, const uint8_t key)
{
uint8_t byte;
while (inputFile.read(reinterpret_cast<char*>(&byte), 1))
{
byte = byte ^ key;
byte = byte & 0b10000000 >> 2 | byte & 0b01000000 >> 5 | byte & 0b00100000 >> 5 | byte & 0b00010000 << 3 |
byte & 0b00001000 << 3 | byte & 0b00000100 << 2 | byte & 0b00000010 << 2 | byte & 0b00000001 << 2;
outputFile.put(byte);
}
return true;
}
bool Decrypt(std::ifstream& inputFile, std::ofstream &outputFile, const uint8_t key)
{
uint8_t byte;
while (inputFile.read(reinterpret_cast<char*>(&byte), 1))
{
byte = byte & 0b10000000 >> 3 | byte & 0b01000000 >> 3 | byte & 0b00100000 << 2 | byte & 0b00010000 >> 2 |
byte & 0b00001000 >> 2 | byte & 0b00000100 >> 2 | byte & 0b00000010 << 5 | byte & 0b00000001 << 5;
byte = byte ^ key;
outputFile.put(byte);
}
return true;
}
[x] Между этими функциями много общего. Можно выделить функцию TransformFileContent, которая будет содержать цикл. Для шифрования/дешифрования пусть она принимает функцию для преобразования байтов.
[x] Сделать возвращаемое значение типа void, т.к. функция не возвращает значений, отличных от true
[ ] Можно сделать лучше:
using Transformer = std::function<uint8_t(uint8_t)>;
void TransformFileContent(std::istream& input, std::ostream& output, const Transformer& transformer);
...
// crypt
TransformFileContent(inputFile, outputFile, [key](uint8_t byte){
CryptByte(byte, key);
});