Язык программирования С, лабораторная работа 2.
Битовая арифметика

Задания

  1. Разработать функции setBit и getBit. Проверить их работоспособность.

    void setBit(unsigned char byteArray[], unsigned long bitNumber, unsigned char bit);
    
    Функция устанавливает (bit!=0) или сбрасывает (bit==0) бит в массиве byteArray в позиции bitNumber. Нумерация битов - от младшего к старшему (byteArray[0] содержит биты с номерами от 0 до 7, byteArray[1] - от 8 до 15 и т.д.)
    unsigned char getBit(unsigned char byteArray[], unsigned long bitNumber);
    
    Функция возвращает 1, если в массиве byteArray в позиции bitNumber бит установлен. Возвращает 0 в противном случае. Нумерация битов - от младшего к старшему (byteArray[0] содержит биты с номерами от 0 до 7, byteArray[1] - от 8 до 15 и т.д.)
  2. Разработать функцию шифрования-дешифрования строки шифром Вернама по модулю 2 (см., например Современная криптография: теория и практика. : Пер. с англ. — М. : Издательский дом "Вильямс", 2005. ). Проверить ее работоспособность.

    void cipherVernam(char source[], const char key[]);
    
    Алфавит текста и ключа ограничить 32 знаками со следующими кодами:
    'A':0, 'B':1, 'C':2, ... 'Z':25
    ' ':26
    '.':27
    ',':28
    '-':29
    '!':30
    '?':31
    
    source - строка текста, которую следует зашифровать. Результат шифрования размещается в этой-же строке.
    key - строка ключа, которым производится шифрование.
    source и key содержат набор символов алфавита в кодировке ASCII. Перед операцией шифрования их необходимо преобразовать в кодировку алфавита (см.выше). По окончании шифрования - выполнить обратное преобразование. Разрешается использовать промежуточные массивы.
    Если длина ключа равна длине текста, то шифрование производится в строгом соответствии с правилами шифра Вернама.
    Если длина ключа больше длины текста, то лишние символы ключа не учитываются.
    Если длина ключа меньше длины текста, то шифрование производится многократным применением ключа к последовательным частям текста.