Пройдите по байтному ключу и открытому тексту и выполните XOR для каждого байта отдельно.
Измените ваш ключ на массив байтов и создайте указатель на этот массив для удобства использования ключа:
char const key[] = {
0xA3, 0x7c, 0x54, 0xf1,
0x73, 0xf0, 0x28, 0x89,
0xa6, 0x4b, 0xe0, 0x2f,
0x2b, 0xc4, 0x41, 0x12
};
char const* pKeyByte = key;
Затем измените строку, с которой вы шифруете, с
((unsigned long *)buffer)[i] ^= MASK; /* this line is bugged */
до:
buffer[i] ^= *pKeyByte++;
if (pKeyByte == (key + sizeof(key))) {
/* wrap to start of key */
pKeyByte = key;
}
Теперь вы можете изменить BLOCKSIZE
на любой желаемый размер ввода / вывода независимо от длины ключа. Обратите внимание, что, поскольку вы используете его, BLOCKSIZE
определяет количество байтов, которые будут считываться из файла в каждом цикле - это не количество бит в ключе.
Обратите внимание, что предостережения о шифровании XOR , которые я опубликовал в вашем последнем вопросе, все еще применяются.