Зашифровать пароль Radius в python3 - PullRequest
0 голосов
/ 31 марта 2020

Я использовал следующий код в python2 для шифрования атрибута Radius Password:

    def Encrypt_Pass(password, authenticator, secret):
        m = md5()
        m.update(secret + authenticator)
        return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(password.ljust(16, '\0')[:16], m.digest()[:16]))

Это не работает в python3, ошибка для строки m.update:

TypeError: Unicode-objects must be encoded before hashing

После того, как я добавлю кодировку:

   def Encrypt_Pass(password, authenticator, secret):
        m = md5()
        m.update(secret.encode('ascii') + authenticator.encode('ascii'))
        return "".join(chr(ord(x) ^ ord(y)) for x, y in zip(password.ljust(16, '\0')[:16], m.digest()[:16]))

У меня все еще не получается:

TypeError: ord() expected string of length 1, but int found

Теперь я заблудился и забыл детали алгоритма, можете ли вы Помогите ? Как изменить эту последнюю строку для работы с python3? (отлично работает для python2).

Обновление: я выполнил поиск неисправностей, с кодом, подобным следующему:

m = md5()
        m.update(secret.encode('ascii') + authenticator.encode('ascii'))
        print("Secret {}, encode {}".format(secret,secret.encode('ascii')))
        print("auth {}, encode {}".format(authenticator, authenticator.encode('ascii')))
        print("m digest: {}".format(m.digest()[:16]))
        print("passwd: {}".format(password.ljust(16, '\0')[:16]))
        #return "".join(chr(ord(x) ^ y) for x, y in zip(password.ljust(16, '\0')[:16], m.digest()[:16]))
        for x, y in zip(password.ljust(16, '\0')[:16], m.digest()[:16]):
            print("JOIN ord x: {} y: {}".format(ord(x),y))
            a = "".join(chr(ord(x) ^ y))
            print("a: {}".format(chr(ord(x) ^ y)))

я получил:

Secret cisco, encode b'cisco'
auth 5002CVWVKCX13QTN, encode b'5002CVWVKCX13QTN'
m digest: b'\xf8\xb9\xc2\x1foZ~h\xff@,\x87\x07\xcc:m'
passwd: cisco
JOIN ord x: 99 y: 248
a: 
JOIN ord x: 105 y: 185
a: Ð
JOIN ord x: 115 y: 194
a: ±
JOIN ord x: 99 y: 31
a: |
JOIN ord x: 111 y: 111
a: 
JOIN ord x: 0 y: 90
a: Z
JOIN ord x: 0 y: 126
a: ~
JOIN ord x: 0 y: 104
a: h
JOIN ord x: 0 y: 255
a: ÿ
JOIN ord x: 0 y: 64
a: @
JOIN ord x: 0 y: 44
a: ,
JOIN ord x: 0 y: 135
a: 
JOIN ord x: 0 y: 7
a: 
JOIN ord x: 0 y: 204
a: Ì
JOIN ord x: 0 y: 58
a: :
JOIN ord x: 0 y: 109
a: m

Таким образом, похоже, что вместо ord (y) мне просто нужно использовать y? Но даже с этим паролем все еще неправильно закодировано с python3: (

...