RattleInGlasses / ps_oop

0 stars 0 forks source link

Замечания по программе Crypt #5

Closed alexey-malov closed 9 years ago

alexey-malov commented 9 years ago
void PutBit(unsigned char &dest, char pos, unsigned char bit)
{
    bit <<= pos;
    dest += bit;
}

+= использовать некорректно.

Подумай, как лучше сделать

alexey-malov commented 9 years ago
unsigned char EncryptByte(unsigned char byte, unsigned char key)
{
    byte ^= key;
    unsigned char result = 0;
    PutBit(result, 2, GetBit(byte, 0));
    PutBit(result, 3, GetBit(byte, 1));
    PutBit(result, 4, GetBit(byte, 2));
    PutBit(result, 6, GetBit(byte, 3));
    PutBit(result, 7, GetBit(byte, 4));
    PutBit(result, 0, GetBit(byte, 5));
    PutBit(result, 1, GetBit(byte, 6));
    PutBit(result, 5, GetBit(byte, 7));

    return result;
}

unsigned char DecryptByte(unsigned char byte, unsigned char key)
{
    unsigned char result = 0;
    PutBit(result, 5, GetBit(byte, 0));
    PutBit(result, 6, GetBit(byte, 1));
    PutBit(result, 0, GetBit(byte, 2));
    PutBit(result, 1, GetBit(byte, 3));
    PutBit(result, 2, GetBit(byte, 4));
    PutBit(result, 7, GetBit(byte, 5));
    PutBit(result, 3, GetBit(byte, 6));
    PutBit(result, 4, GetBit(byte, 7));
    result ^= key;

    return result;
}

Вместо unsigned char следует использовать uint8_t, он гарантированно 8битный Можно сделать таблицы перемешивания битов и по ним выполнять шифровку и дешифровку при помощи одной функции.

alexey-malov commented 9 years ago
    FILE *pInFile;
    FILE *pOutFile;
    if ((OpenFile(pInFileName, "rb", MSG_ERR_CANT_OPEN_INPUT_FILE, pInFile))
        && (OpenFile(pOutFileName, "wb", MSG_ERR_CANT_OPEN_OUTPUT_FILE, pOutFile)))
    {
        if (task == ENCRYPT)
        {
            EncryptFile(pInFile, pOutFile, key);
        }
        else if (task == DECRYPT)
        {
            DecryptFile(pInFile, pOutFile, key);
        }
    }
    else
    {
        return false;
    }

Файлы не закрываются, если выходной не будет открыт

alexey-malov commented 9 years ago
bool IsEmptyStr(char* str)
{
    int i = 0;
    while (str[i] != '\0')
    {
        if ((str[i] != ' ') && ((str[i] != '\t')))
        {
            return false;
        }
        i++;
    }

    return true;
}

IsEmptyStr - вводящее в заблуждение название

alexey-malov commented 9 years ago

Есть std::function (в файле <functional>), с ее помощью можно создавать функции

typedef std::function<void(File* inputFile, File* outputFile, unsigned char key)> Task;
Task StrToProgramTask(const char* str)
{
   if (/*decrypt*/)
   {
       return DecryptFile; // или return &Decrypt
   }
   else if (/*crypt*/)
   {
       return CryptFile;
   }

   return Task();
}

...

auto task = StrToTask(argv[1]);
if (!task)
{
   // ошибка
}
else
{
   task(inputFile, outputFile, key);
}
alexey-malov commented 9 years ago

Проверена исправленная версия. 150 баллов