Как обрабатывать байты в c ?

#c #hash #byte

#c #хэш #байт

Вопрос:

У меня есть программа на python, которую я хочу преобразовать в c , но понятия не имею, как это сделать. В настоящее время я застрял на первой части, которая обрабатывает байты. Я думаю, что могу преобразовать байты в хэш, но я бы предпочел сделать это прямым способом, которым это делает моя программа на python. Вот моя программа на python в качестве ссылки:

 def sortHandshakes(in_1, in_2):
    if len(in_1) != len(in_2):
        raise 'lengths do not match'
    in_1_byte_list = list(bytes(in_1))
    in_2_byte_list = list(bytes(in_2))
    for i in range(0, len(in_1_byte_list)):
        if in_1_byte_list[i] < in_2_byte_list[i]:
            return (in_2, in_1)
        elif in_1_byte_list[i] > in_2_byte_list[i]:
            return (in_1, in_2)
    return (in_1, in_2)

def crackPassword(handshakeDict):
    ap_mac = handshakeDict['ap_mac']
    sta_mac = handshakeDict['sta_mac']
    sta_nonce = handshakeDict['sta_nonce']
    eapol_frame_zeroed_mic = handshakeDict['eapol_frame_zeroed_mic']
    ap_nonce = handshakeDict['ap_nonce']
    mic = handshakeDict['mic']
    SSID = handshakeDict['SSID']
    max_mac, min_mac = sortHandshakes(ap_mac, sta_mac)
    max_nonce, min_nonce = sortHandshakes(ap_nonce, sta_nonce)

    message = b''.join([
        b'Pairwise key expansionx00',
        min_mac,
        max_mac,
        min_nonce,
        max_nonce,
        b'x00'
    ])
    while True:
        password_guess = input('enter guess: ')
        password_guess = ''.join(password_guess).encode()
        
        pmk = hashlib.pbkdf2_hmac('sha1', password_guess, SSID.encode(), 4096, 32)
        kck = hmac.new(pmk, message, hashlib.sha1).digest()[:16]
        calculated_mic = hmac.new(kck, eapol_frame_zeroed_mic, hashlib.sha1).digest()[:16]

        if calculated_mic == mic:
            print('correct, password is {}'.format(password_guess.decode('ASCII')))
            break
 

вот пример ap_mac: xac;wxe6x9dxc8 . Однако, если я попытаюсь установить char *
переменная, равная ей, выдает ошибку.
char * ap_mac = "xac;wxe6x9dxc8"; Что приводит к ошибке ISO C 11 does not allow conversion from string literal to 'char *' [-Wwritable-strings] . Есть ли в c какие-нибудь хорошие библиотеки для выполнения конкретно того, что я хочу сделать?

Комментарии:

1. Просто чтобы решить вашу первоначальную проблему, значение char * должно быть постоянным, например char const * , или char const * const (в зависимости от того, хотите ли вы, чтобы сам указатель можно было изменять).

2. Используйте const char * для строкового литерала

3. Извините, рекомендации библиотеки здесь не по теме. Кроме того, использование буквенной символьной строки здесь закончится плачевно, как только один из этих байтов будет равен 0x00 байт. Буквальные символьные строки — неправильный подход.

4. У меня есть для вас две конструктивные критические замечания / замечания. Первое — это предложение: Are there any good libraries in c for doing specifically what I want to do? это специально не по теме для SO. Мы не делаем здесь рекомендации по библиотеке, потому что это обычно привлекает спам-ответы, которые не помогают ни вам, ни сайту.

5. Я не знаю, какой тип вы можете ввести в свою функцию, handShakeDict но для c вы должны использовать std::string с шестнадцатеричным представлением (только символы, а не x или 0x) или std::vector<uint8_t> . Если вы выберете опцию string, то используйте stringstream и std::hex для получения ваших байтов.