для университетского упражнения Я хочу разработать простую систему клиент-сервер hotp на python. В этом случае клиент отправляет на сервер пароль и одноразовый пароль. Сервер знает секрет, вычисляет текущее hotp и сравнивает полученные значения. Все идет нормально. С открытым текстом это прекрасно работает, и рассчитанные значения такие же, какие я получаю, когда использую iOS-приложение «OTP Auth». Но есть также возможность рассчитать OTP в сочетании с base32. Поэтому я добавил несколько строк для кодирования открытого текста в base32, но теперь вывод неправильный.
Давайте предположим, что мы используем секретный "1234", поэтому вывод в виде открытого текста будет "110366". Это работает Но если я кодирую секрет в base32, вывод должен быть "807244", но моя программа вычисляет "896513". Кто-нибудь знает, почему это происходит?
Я уже пытался использовать разные секреты и проверял это в разных приложениях. Всегда один и тот же результат.
import hmac
import hashlib
import array
import base64
counter = 0
digits = 6 #Anzahl der Zeichen
def hotp(secret, c):
global digits
counter = extendCounter(c)
hmac_sha1 = hmac.new(secret, counter, hashlib.sha1).hexdigest()
return truncate(hmac_sha1)[-digits:]
def truncate(hmac_sha1):
offset = int(hmac_sha1[-1], 16)
binary = int(hmac_sha1[(offset * 2):((offset * 2) + 8)], 16) & 0x7fffffff
return str(binary)
def extendCounter(long_num):
byte_array = array.array('B')
for i in reversed(range(0, 8)):
byte_array.insert(0, long_num & 0xff)
long_num >>= 8
return byte_array
def main():
secret = "1234"
bSecret = secret.encode("UTF-8")
bSecret = base64.b32encode(bSecret)
otp = hotp(bSecret, counter)
one_time_password = otp
Я ожидаю 807244 в качестве выхода, но выход 896513