Hasło dnia w modemach telewizji kablowej Arris

Data publikacji: 2015-02-03 | Tagi:

Ostatnio naszło mnie na zerkanie w konfigurację mojego modemu telewizji kablowej. Nazywa się Arris Touchstone i nie ma żadnych opcji zmienianych przez użytkownika, ale ma za to tryb Advanced, w którym pokazuje nieco więcej informacji. Niestety tryb ten jest dostępny jedynie po podaniu tzw. hasła dnia.

Ale zacznijmy od początku. Modem telewizji kablowej to takie urządzonko, które podłączamy kablem koncentrycznym do sieci operatora telewizji kablowej, oraz skrętką do komputera, bądź routera, którym dalej obsługujemy sygnał ethernetu. Akurat taki mi się trafił operator, więc skoro mam urządzonko, to można by coś tam ciekawego wyczytać we wspomnianej zakładce Advanced.

Po szybkim googlaniu znalazłem kilka stron z generatorami haseł dnia on-line, ale postanowiłem napisać własny, w pythonie. Po co? Po pierwsze dla ćwiczenia, po drugie żeby mieć go lokalnie jakbym chciał się zalogować, ale akurat nie byłoby internetu.

Oto efekt:

# -*- coding: utf-8 -*-


class ArrisPassword(object):

    table1 = [
        [15, 15, 24, 20, 24],
        [13, 14, 27, 32, 10],
        [29, 14, 32, 29, 24],
        [23, 32, 24, 29, 29],
        [14, 29, 10, 21, 29],
        [34, 27, 16, 23, 30],
        [14, 22, 24, 17, 13],
    ]

    table2 = [
        [0, 1, 2, 9, 3, 4, 5, 6, 7, 8],
        [1, 4, 3, 9, 0, 7, 8, 2, 5, 6],
        [7, 2, 8, 9, 4, 1, 6, 0, 3, 5],
        [6, 3, 5, 9, 1, 8, 2, 7, 4, 0],
        [4, 7, 0, 9, 5, 2, 3, 1, 8, 6],
        [5, 6, 1, 9, 8, 0, 4, 3, 2, 7],
    ]

    alphanum = [
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
        'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
        'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
    ]

    seedten = [5, 8, 11, 2, 3, 5, 32, 0, 29, 1, ]
    seedeight = seedten[0:8]

    def _get_first_list(self, day_of_month, day_of_week, year, month):
        list_first = list(self.table1[day_of_week])

        list_first.append(day_of_month)
        date_num = year + month - day_of_month
        date_num = date_num if date_num >= 0 else date_num + 36

        list_first.append(date_num % 36)
        list_first.append((((3 + ((year + month) % 12)) * day_of_month) % 37) % 36)
        return list_first

    def _get_second_list(self, list1):
        list_first = []

        list_first = [(x + y) % 36 for x, y in zip(list1, self.seedeight)]

        list_first.append(sum(list_first[i] for i in range(8)) % 36)
        num8 = list_first[8] % 6
        list_first.append(num8 ** 2)

        return [list_first[x] for x in self.table2[num8]]

    def _get_third_list(self, list2):
        list_first = []
        for a in range(10):
            list_first.append((self.seedten[a] + list2[a]) % 36)
        return list_first

    def calc_password(self, date):
        year = int(str(date.year)[-2:])  # last two digits
        month = date.month
        day_of_month = date.day
        day_of_week = date.weekday()
        list_first = self._get_first_list(day_of_month, day_of_week, year, month)
        list_second = self._get_second_list(list_first)
        list_third = self._get_third_list(list_second)
        return ''.join(self.alphanum[i] for i in list_third)


if __name__ == '__main__':
    import datetime
    import unittest

    class TestPasswords(unittest.TestCase):

        def setUp(self):
            self.password = ArrisPassword()

        def test_dates(self):
            data = [
                ('XCA2Y12U71', 1970, 1, 1),
                ('X60BPWYT6J', 2015, 1, 20),
                ('3UI2YWMRTV', 2015, 1, 21),
                ('V32B7EV6PT', 2015, 1, 22),
                ('UUBBQWVJKL', 2012, 12, 31),
            ]
            for element in data:
                date = datetime.date(element[1], element[2], element[3])
                self.assertEqual(element[0], self.password.calc_password(date))

    unittest.main()

Zapisując go pod nazwą arris_password.py oraz mając obiekt date możemy uzyskać hasło dzięki podanemu skryptowi:

from arris_password import ArrisPassword
import datetime

ap = ArrisPassword()
print ap.calc_password(datetime.date(2015, 2, 3))

Uruchomienie modułu z shella spowoduje wykonanie testów:

python arris_password.py


Oceń ten post:
Podziel się:

comments powered by Disqus

IT w obrazkach: