import hmac
import hashlib
import binascii
import time
def getTimeSteps(timePeriod):
unix_time = int(time.time())
#Рахуємо кількість часових проміжків
timeSteps = unix_time // timePeriod
#Переводимо значення проміжків в шістнадцятковий формат
hexTimeSteps = hex(timeSteps).upper()
#прибираємо перші 2 непотрібні символи
hexTimeSteps = hexTimeSteps[2:]
#
while len(hexTimeSteps) < 16:
hexTimeSteps = '0' + hexTimeSteps
return hexTimeSteps
# generating sha256 hex string -> splitting it into hex bytes -> making offset -> generating 32 bytes totp -> cutting it into 6 digit number
def generateTOTP(key: str, timeSteps: str, digits):
#генерація хеш значення
sha256Hash =bytes.fromhex((hmac.new(
bytes(binascii.unhexlify(key)),
msg=bytes(binascii.unhexlify(timeSteps)),
digestmod=hashlib.sha256
).hexdigest().upper()))
#розрахунок значення зсуву
offset = sha256Hash[31] & 0xF
#розрахунок одноразового пароля
binary = (((sha256Hash[offset] & 0x7F) << 24) |
((sha256Hash[offset + 1] & 0xFF) << 16) |
((sha256Hash[offset + 2] & 0xFF) << 8) |
(sha256Hash[offset + 3] & 0xFF))
#скорочення пароля до потрібної кількості знаків
totp = binary % pow(10, digits)
#переведення значення в рядковий формат
result = str(totp)
while len(result) < digits:
result = "0" + result
return result
def main():
shared_key = "3132333435363738393031323334353637383930313233343536373839303132"
# time_t = " 00000000023523ED"
while True:
#time_t = input()
print(generateTOTP(shared_key, getTimeSteps(30), 6))
time.sleep(1)
if __name__ == "__main__":
main()