Объявление

Свернуть
Пока нет объявлений.

Corona QR програмирование сертификата не проходящего проверку

Свернуть
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Zahlesel
    Участник ответил
    Сообщение от HelloWorld_x0123 Посмотреть сообщение
    осталось дело за малым , найти правильный PRIVATE KEY
    да херня война, пойду на азино 3 топора, выиграю миллиард. шансов больше

    Прокомментировать:


  • HelloWorld_x0123
    Участник ответил
    код на питоне, который делает QR, осталось дело за малым , найти правильный PRIVATE KEY


    # Creates HC1 certificate for testing
    # Certificate will not be valid as it will not be signed by official CA

    # Definition of Data for Test Certificate
    family_name = "Doe"
    given_name = "John"
    birthdate = "1911-11-11" # yyyy-mm-dd
    country = "SE" # two letter country code
    last_vaccination_date = "2021-05-01" # yyyy-mm-dd
    cert_issuer = "Non Valid Test Certificate"
    time_to_live = 180 * 24 * 3600 # validity period of cert, default 180 days
    issuing_country = "SE" # two letter country code
    keyid = b'4\x9aB\xb0\xc2\xd0r\x8e' # first 8 hex values of SHA256 fingerprint of signing certificate, not relevant for test

    # Private Signature Key for ecdsa-with-SHA256 for test certificate without password protection
    # AS THIS IS JUST USED FOR PUBLIC TESTING IT IS NOT CRITICAL TO HAVE THIS PRIVATE KEY IN THIS CODE #
    pem = b'-----BEGIN EC PRIVATE KEY-----\n' \
    b'MHcCAQEEIICXhlDKAkd37q3LEtYmjoCuaIvne9/FzV0BClH2X52AoAoGCCqGSM49\n' \
    b'AwEHoUQDQgAEL8eW9/mJUjRX0G6+dA2M9DHquAx5Q07wHFdZ0vM5WzkbOMNea2X2\n' \
    b'iirLZ+RmhRAuDMZ6SN7Gj5uRrOo89+7KFA==' \
    b'\n-----END EC PRIVATE KEY-----'

    cert_id = "00XX/00000/1234567890/THISISATESTCERTIFICATEXXX#S"
    vaccine_manufacturer = "ORG-100030215"
    vaccine_id = "EU/1/20/1528"
    dn = 2
    sd = 2
    tg = "840539006"
    vp = "1119349007"
    version = "1.0.0"

    # Required imports
    import unidecode
    import json
    import sys
    from datetime import datetime
    import cbor2
    import base64
    from cryptography import x509
    from cryptography.x509 import load_pem_x509_certificate
    from cryptography.hazmat.primitives import hashes
    from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat
    from cryptography.hazmat.primitives.serialization import load_pem_private_key
    from cose.messages import Sign1Message
    from cose.keys.curves import P256
    from cose.algorithms import Es256
    from cose.headers import Algorithm, KID
    from cose.keys import EC2Key, CoseKey
    from cose.keys.keyparam import KpAlg, EC2KpD, EC2KpCurve
    from cose.keys.keyparam import KpKty
    from cose.keys.keytype import KtyEC2
    import zlib
    from base45 import b45encode, b45decode
    import matplotlib.pyplot as plt
    import qrcode
    from binascii import unhexlify

    # Create upper case string without special characters and whitespace replaced by '<'
    fnt = unidecode.unidecode(family_name).upper().replace(" ", "<")
    gnt = unidecode.unidecode(given_name).upper().replace(" ", "<")

    # Create json payload
    json_issuance = '"v": [{"ci": "' + cert_id + '", "co": "' + country + '", "dn": ' + str(dn) + ', "dt": "' + \
    last_vaccination_date + '", "is": "' + cert_issuer + '", "ma": "' + vaccine_manufacturer + \
    '", "mp": "' + vaccine_id + '", "sd": ' + str(sd) + ', "tg": "' + tg + '", "vp": "' + vp + '"}]'
    json_name = '"nam": {"fn": "' + family_name + '", "gn": "' + given_name + '", "fnt": "' + fnt + '", "gnt": "' + gnt + '"}'
    json_payload = '{ ' + json_issuance + ', "dob": "' + birthdate + '", ' + json_name + ', "ver": "' + version + '"}'

    # Make sure correct utf-8 was base ######## NEEDED ???? ###############
    json_payload = json_payload.encode("utf-8")
    json_payload = json.loads(json_payload.decode("utf-8"))

    # Add additional required info to json_payload
    json_payload = {
    1: issuing_country,
    4: int(datetime.now().timestamp() + time_to_live),
    6: int(datetime.today().timestamp()),
    -260: {
    1: json_payload,
    },
    }

    print("\nFULL JSON PAYLOAD:")
    print(json_payload)

    # Convert to CBOR
    #
    payload = cbor2.dumps(json_payload)
    print("\nCBOR FORMAT:")
    print(payload)

    # Read in the private key that we use to actually sign this
    #
    keyfile = load_pem_private_key(pem, password=None)
    priv = keyfile.private_numbers().private_value.to_bytes(3 2, byteorder="big")
    print("\nPRIVATE KEY:")
    print(keyfile.private_numbers())
    print(keyfile.private_numbers().private_value)
    print(sys.getsizeof(keyfile.private_numbers().priv ate_value))
    print(hex(keyfile.private_numbers().private_value) )
    print(priv)

    msg = Sign1Message(phdr={Algorithm: Es256, KID: keyid}, payload=payload)
    print("\nMSG TO BE SIGNED:")
    print(msg)

    # Create the signing key - use ecdsa-with-SHA256
    # and NIST P256 / secp256r1
    #
    cose_key = {
    KpKty: KtyEC2,
    KpAlg: Es256, # ecdsa-with-SHA256
    EC2KpCurve: P256, # Ought to be pk.curve - but the two libs clash
    EC2KpD: priv,
    }

    # Encode the message (which includes signing)
    #
    msg.key = CoseKey.from_dict(cose_key)
    out = msg.encode()
    print("\nSIGNED MESSAGE:")
    print(out)

    # Compress with ZLIB
    #
    out = zlib.compress(out, 9)
    print("\nCOMPRESSED MESSAGE:")
    print(out)

    # And base45 encode the result
    #
    out = b'HC1:' + b45encode(out)
    print("\nBASE45 ENCODED:")
    print(out)

    # Finally create and show qr_code
    #
    qr_image = qrcode.make(out)
    imgplot = plt.imshow(qr_image)
    plt.show()

    Прокомментировать:


  • HelloWorld_x0123
    Участник ответил
    Ты очень удивишься когда поймешь как всё просто сделано и как сложно взломать. Вся документация и примеры есть на официальных сайтах.

    Нажмите на изображение для увеличения. 

Название:	green-pass-validator-800.jpg 
Просмотров:	1213 
Размер:	78.8 Кб 
ID:	7478

    Сообщение от Delphi_RTTI Посмотреть сообщение
    Привет!
    Сегодня тестировал библиотеку Base45 на предмет длинной строки, до ~ 1500 символов. Результат сравнивал с онлайн ко/декодером. При кодировании - 1:1,
    а при расшифровке небольшая неувязочка. Я с ней уже завтра разберусь. Моя идея и эксперимент не увенчались успехом и я подозреваю, что дело даже не в Base45.
    Как вообще можна было додуматься кроме кодирования строки её ещё и сжимать ?
    (кстати не особо эфективно). Я потерял логическую цепь последовательности действий. А правильно бутфорсить ещё нужно уметь, а не от фонаря, методом подбора лепить инфу куда не попадя.
    Проводил эксперимент : Полностью остановил приложение "SafeBorder", очистил Кэш и данные, выключил интернет. Запускаю приложение и при сканировании рабочего (настоящего) QR, он проверку проходит. Соответственно, ключ хранится не в самом приложении, а зашит в код. Я думаю, что если бы ключ действительно хранился в телефоне, то народные умельцы из 4pda, уже давно бы его взломали.
    Второй вопрос : что обозначают данные на скриншоте?,-
    год рожденья бабушки?


    image widget

    Прокомментировать:


  • Zahlesel
    Участник ответил
    тебе нужно изучить матчасть. лично я понял как работает система и проверка и об этом писал в теме.
    паблик кий лежит в xml в приложении и им можно проверить подпись куер. всё, большего не нужно.
    брутфорс работает так: генерируется приват кий и он проверяется нам известным паблик кием/кид. всё


    Код:
    kid = decoded_cose.get_attr(KID)
    der_public_key = base64.b64decode(public_key_b64)
    public_key = load_der_public_key(der_public_key)
    x = public_key.public_numbers().x.to_bytes(32, "big")
    y = public_key.public_numbers().y.to_bytes(32, "big")
    cose_key = EC2Key(crv='P_256', x=x, y=y, optional_params={'ALG': 'ES256'})
    decoded_cose.key = cose_key
    verifica = decoded_cose.verify_signature()
    Вложения

    Прокомментировать:


  • Delphi_RTTI
    Участник ответил
    Сориентируйте меня по логической цепочке.
    Для начала формируем обычную строку, в виде JSON.
    Далее конвертация в CBOR.
    Далее сжатие ZLIB
    Далее кодирование Base45
    Ну и собственно запись готовой строки в QR.
    Верно?

    Прокомментировать:


  • Delphi_RTTI
    Участник ответил
    Привет!
    Сегодня тестировал библиотеку Base45 на предмет длинной строки, до ~ 1500 символов. Результат сравнивал с онлайн ко/декодером. При кодировании - 1:1,
    а при расшифровке небольшая неувязочка. Я с ней уже завтра разберусь. Моя идея и эксперимент не увенчались успехом и я подозреваю, что дело даже не в Base45.
    Как вообще можна было додуматься кроме кодирования строки её ещё и сжимать ?
    (кстати не особо эфективно). Я потерял логическую цепь последовательности действий. А правильно бутфорсить ещё нужно уметь, а не от фонаря, методом подбора лепить инфу куда не попадя.
    Проводил эксперимент : Полностью остановил приложение "SafeBorder", очистил Кэш и данные, выключил интернет. Запускаю приложение и при сканировании рабочего (настоящего) QR, он проверку проходит. Соответственно, ключ хранится не в самом приложении, а зашит в код. Я думаю, что если бы ключ действительно хранился в телефоне, то народные умельцы из 4pda, уже давно бы его взломали.
    Второй вопрос : что обозначают данные на скриншоте?,-
    год рожденья бабушки?


    image widget

    Прокомментировать:


  • Hans_Wurst
    Участник ответил
    Помогите пожалуйста нужен срочно диг-пасс
    и за работы

    Прокомментировать:


  • Zahlesel
    Участник ответил
    молодца, теперь расскажи каков был план. библиотека есть. что дальше?
    брутфорс от противного?

    Прокомментировать:


  • Delphi_RTTI
    Участник ответил
    Расшифровка строки на Base45
    Алгоритм кодирования я выложил выше, а вот сейчас будем раскодировать...
    Итак, имеется всё та же строка 4T8+VD:8D
    ...
    Разбиваем строку на символы и преобразовываем в числа :
    '4', 'T', '8', '+', 'V', 'D', ':', '8', 'D'
    Используя алфавит Base45, получаем числа :
    4, 29, 8, 40, 31, 13, 44, 8, 13
    ...
    Число чётное. Собираем в группы по три : (4, 29, 8) (40, 31, 13) (44, 8, 13)
    Теперь используем обратную формулу, выложенную мной в предыдущем посту :
    X = A + B * 45 + C * 45 * 45
    Конечно же - A, B, C это 4, 29, 8 в первом случае пары
    ...
    Итого:

    4 + 29 * 45 + 8 * 45 * 45 = 17509
    40 + 31 * 45 + 13 * 45 * 45 = 27760
    44 + 8 * 45 + 13 * 45 * 45 = 26729

    ...
    Получаем массив чисел:
    [17509] [27760] [26729]

    Разбираем числа в группы по два байта, по формуле :
    X = A : 256 то есть 17509 : 256 = 68 (Первый байт).
    Z = 68 * 256 = 17408

    Y = A - Z то есть 17509 - 17408 = 101 (Второй байт).
    ...
    И так для каждого числа, которое кстати не может превышать 65535 ( тип Word в Делфи)
    Теперь собираем числа в строку :
    (68, 101, 108, 112, 104, 105)
    И преобразовываем каждый код в символ:
    68 - D
    101 - e
    108 - l
    112 - p
    104 - h
    105 - i

    Раскодировали...
    ...

    Теперь обсудим случай, если закодированная строка имеет нечётное количество символов.
    Пусть будет та же
    4T8+VD:8D81
    Последнюю пару символов мы не можем разбить на три, так как их там всего два - 81
    Делаем следующее :
    Обозначим переменные :

    P - Последний символ = 1
    E - Предпоследний = 8

    R:= E div 45;
    W:= E - (45 * R); // Первый байт
    //
    X:= P div 45;
    Y:= P - (45 * X); // Второй байт

    X:= Y + (45 * W);
    И мы получаем Х, равный 53, что в таблице ANSI = '5'
    53 = [8, 1]
    ...
    Вот и вся загадка библиотеки Base45 ...
    Так как я библиотеку для Delphi уже написал, то нет необходимости играться каждый раз с формулами для ручного ко/декодирования.
    Процесс полностью автоматизирован и можно по-символьно наблюдать кодируемый текст.

    Нажмите на изображение для увеличения. 

Название:	_2021-12-10_210656.png 
Просмотров:	762 
Размер:	29.8 Кб 
ID:	7457
    Удачи !!!
    Последний раз редактировалось Delphi_RTTI; 10-12-2021, 08:07 PM.

    Прокомментировать:


  • Delphi_RTTI
    Участник ответил
    Всем привет!
    Неделю потратил на написание "с нуля" библиотеки Base45 на Delphi...
    Долго и нудно вникал в алгоритм ко/декодирования строки. Оф-описание слишком сжато и тема раскрыта не полностью.
    Итак, приведу пример кодирования и объясню на понятном, русском языке :
    Отдельно приведу пример для чётного и нечётного количества символов.
    ...
    Кодируем строку Delphi ( Строка имеет чётное количество символов - 6 )
    Используя таблицу :

    Нажмите на изображение для увеличения.   Название:	ANSI.png  Просмотров:	0  Размер:	24.6 Кб  ID:	7455

    Разбираем строку на символы : 'D', 'e', 'l', 'p', 'h', 'i' - [68, 101, 108, 112, 104, 105]
    ...

    Так как число чётное, собираем в группы по два байта:
    [68, 101] [108, 112] [104, 105]
    ...
    Далее используем формулу : C = A * 256 + B
    То есть :
    68 * 256 + 101 = 17509
    108 * 256 + 112 = 27760
    104 * 256 + 105 = 26729

    ...
    Мы получаем три числа : [17509], [27760], [26729]
    ...
    Превращаем каждое число в группу из трёх целых чисел, меньше 45 :
    (4, 29, 8), (40, 31, 13), (44, 8, 13)
    ...
    Как ? - В той формуле, что они выставили на сайте, находится 3 неизвестных переменных.
    Мне удалось вывести обратную формулу и найти каждое значение отдельно :
    ...

    Первое число : 17509 : 45 : 45 = 8.64 ( без остатка = 8 )
    Обозначим результат X
    ...
    Находим второе число :
    B = X * 45 * 45
    C = (17509 - B) : 45
    То есть : 8 * 45 * 45 = 16200
    (17509 - 16200) : 45 = 29.08
    ( без остатка 29 )
    ...
    Находим третье число :
    Y = C * 45
    Z = B + Y

    29 * 45 = 1305
    Z = 16200 + 1305 = 17505

    Результат ( 3-е число ) - 17509 - Z = 4
    Итог : (8, 29, 4) в обратном порядке.

    Тоже самое, проделываем для остальных пар чисел
    ...
    Теперь, используя их таблицу Base45, я определил так :

    PHP код:
    const // Кодируем
      
    Enc45: array[0..44of Char =
      (
    '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',' ','$',
      
    '%','*','+','-','.','/',':');

    const 
    // Декодируем
      
    Dec45 '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'
    ...
    Числа 4, 29, 8, 40, 31, 13, 44, 8, 13 соответствуют закодированной строке 4T8+VD:8D (заглавными)
    ...
    НО, и это ещё не всё...
    Если кодируемая строка имеет нечётное число символов, например
    Delphi5 ( 7 символов )
    тогда последний (нечётный) кодируется следующим образом :
    ...
    Символ '5' согласно ANSI таблице, имеет код 53
    Кодируем в двух байтах :


    [R, W] - байты нечётного числа
    R = Q : 45;
    W = Q - (45 * R);
    Выходит [8, 1]
    Полная строка : 4T8+VD:8D81
    ...
    Вынос мозга...
    Метод расшифровки выложу чуть позже.
    Кого интересует библиотека Base45.dcu для Delphi 7, пишите.
    Вложения
    Последний раз редактировалось Delphi_RTTI; 10-12-2021, 03:43 PM.

    Прокомментировать:


  • HelloWorld_x0123
    Участник ответил
    Сообщение от Delphi_RTTI Посмотреть сообщение
    Попробую поспрашивать на форуме "4pda".
    По-сути, в библиотеки всего 2 функции для ко/декодирования строки.
    JSON в топку, я нашёл альтернативу в виде широкой строки WideString и не нужно создавать каждый раз объект для пары "Имя" : "значение".
    Это вообще полная дурость.
    Зачем генерировать QR?
    У меня есть безумная идея, хочу проверить, но только
    после интегрирования библиотеки в свой проект.
    Работал с JSON на Delphi7, есть отличная библиотека SuperObject.pas

    Прокомментировать:


  • Delphi_RTTI
    Участник ответил
    Зачем удалять сообщений и фото?
    Правда глаза колит?
    Последний раз редактировалось Delphi_RTTI; 03-12-2021, 09:57 PM.

    Прокомментировать:


  • Zahlesel
    Участник ответил
    ну мля коллега, сам выдумал себе нелегкий путь, так сам и решай. другие пользуются готовыми библиотеками. походу опытные и не тратят силы в пустую

    уже бы брутфорс запутить стоило и за это время ты бы приблизился к цели в 10 световых лет, на все 4ре дня!!!
    не успеешь на 1% забрутфорсить и нынешний приват кий уже будет анулирован, тк год прошел

    Прокомментировать:


  • Delphi_RTTI
    Участник ответил
    Вот алфавит Base45 :

    "00" => "0",
    "01" => "1",
    "02" => "2",
    "03" => "3",
    "04" => "4",
    "05" => "5",
    "06" => "6",
    "07" => "7",
    "08" => "8",
    "09" => "9",
    "10" => "A",
    "11" => "B",
    "12" => "C",
    "13" => "D",
    "14" => "E",
    "15" => "F",
    "16" => "G",
    "17" => "H",
    "18" => "I",
    "19" => "J",
    "20" => "K",
    "21" => "L",
    "22" => "M",
    "23" => "N",
    "24" => "O",
    "25" => "P",
    "26" => "Q",
    "27" => "R",
    "28" => "S",
    "29" => "T",
    "30" => "U",
    "31" => "V",
    "32" => "W",
    "33" => "X",
    "34" => "Y",
    "35" => "Z",
    "36" => " ",
    "37" => "$",
    "38" => "%",
    "39" => "*",
    "40" => "+",
    "41" => "-",
    "42" => ".",
    "43" => "/",
    "44" => ":"
    Но даже эта таблица мне не помагает, не могу сопоставить числа. Что с чем сравнивать?
    Нет формулы, а пример не достаточно подробный.

    Прокомментировать:


  • Delphi_RTTI
    Участник ответил
    Четвёртый и пятый пункт не менее загадочен, чем третий :
    Что означает: "Превращаем в группы из трёх чисел, меньше 45"?
    Как можно из числа
    18031 получить в результате 8, 40, 31 ?
    По-какому алгоритму это просчитывать?

    Прокомментировать:

Обработка...
X