Объявление

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

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

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

  • Delphi_RTTI
    Участник ответил
    Помогите разобраться...
    Пример ручного кодирования :

    Строка Foobar

    Используем таблицу :

    Нажмите на изображение для увеличения.   Название:	G2AI_Dc9UKo.jpg  Просмотров:	0  Размер:	114.7 Кб  ID:	7329


    1: Превращаем в список байтов UTF8
    [70, 111, 111, 98, 97, 114]
    ... То есть :
    F - 70
    o - 111
    o - 111
    b - 98
    a - 97
    r - 114

    2: Превращаем в группы по 2 байта
    [[70, 111], [111, 98], [97, 114]]

    3 : Превращаем целые числа, рассматривая группы как базу 256
    [18031, 28514, 24946]

    4: Превращаем в группы из трёх целых чисел, меньше 45
    [8, 40, 31, 14, 3, 29, 12, 14, 16]

    5: Превращаем в закодированную строку
    8+VE3TCEG
    ...

    Проблема возникает на третьем пункте, например откуда берётся число 18031 ?
    Соответственно, нет смысла разбираться далее, если "споткнулись" об текущий пункт.
    Последний раз редактировалось Delphi_RTTI; 01-12-2021, 07:57 PM.

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


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

    интересно чтото еще кроме гринпаса использует эту библиотеку?
    вопрос в том, зачем именно Base45 для сертивиката? чем другие не устраивали?


    I just tried rendering a QR code of the 692 characters of the introductory paragraph (with lines joined appropriately), and compared it with a QR code of the same text, uppercased and with out-of-range characters `,`, `[` and `]` changed to %. This reduced an 89×89 code down to 77×77, a 24% reduction in area. If this is roughly the ratio, then Base45-encoding binary data by QR code will yield roughly 17% area savings compared with Base64. (Base45 gets 50% bloat, then 24% shrink = multiple of 1.14; Base64 gets 33% bloat = multiple of 1.33; Base45 / Base64 = 1.14 / 1.33 = 0.83.)
    Base64 in binary: log₂ 64 / 8 = 75.000% efficient

    Base45 in alphanumeric: 4 log₂ 256 / 33 = 96.970% efficient
    https://news.ycombinator.com/item?id=27603173
    вот и вся отгадка, эффективно для куера и буквочисел

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


  • Delphi_RTTI
    Участник ответил
    Я уже прежде заходил на этот сайт и читат эту депешу.
    В ней указано авторское право и правила кодирования.
    Это то, что выставили официально.
    Обратите внимание на дату создания "начала проекта" -
    1-ое июля 2021, а истекает он 2-го января 2022-го.

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

Название:	image26.png 
Просмотров:	1408 
Размер:	210.0 Кб 
ID:	7283
    Но до этого времени, эта библиотека нигде не фигурирует. Зачем вообще настолько заморачиваться с новым алгоритмом, если уже пошёл второй десяток лет "проверенной в бою"- Base64?
    Я сам работал в торговле и ревизором и кладовщиком довольно долгое время и имел дело со сканерами ТСД
    Как правило, товар ищется по линейному штрихкоду, содержащему 13 цифр. С QR конечно всё сложнее, туда можна записать гораздо больше информации.
    Но я никогда прежде не встречал, чтобы товар по хитрому кодировали. Для чего?
    Вот и здесь, они разрабатывали эту библиотеку ещё задолго до начала эпидемии. Только тогда они не называли её сертификатом.
    Или Вы действительно верите в ту чушь, что китаец съел летучую мышь и заболел "короной", став нулевым пациентом?
    Да китайцы всю жизнь едят разных змей, червяков, жуков и медуз и живут по 100 лет.
    Всё это было спланировано заранее.
    Вложения

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


  • Zahlesel
    Участник ответил
    ну не знаю, почтовые куеры и многие другие я не анализировал
    поизучай историю и зачем оно нужно
    https://datatracker.ietf.org/doc/dra...tstrom-base45/


    1. Introduction A QR-code is used to encode text as a graphical image. Depending on the characters used in the text various encoding options for a QR- code exist, e.g. Numeric, Alphanumeric and Byte mode. Even in Byte mode a typical QR-code reader tries to interpret a byte sequence as a UTF-8 or ISO/IEC 8859-1 encoded text. Thus QR-codes cannot be used to encode arbitrary binary data directly. Such data has to be converted into an appropriate text before that text could be encoded as a QR-code. Compared to already established Base64, Base32 and Base16 encoding schemes, that are described in RFC 4648 [RFC4648], the Base45 scheme described in this document offer a more compact QR- code encoding. One important difference from those and Base45 is the key table and that the padding with '=' is not required.

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


  • Delphi_RTTI
    Участник ответил
    Это верно, но как правило никто из производителей информацию перед записью в QR не кодирует, а записывает "как есть". А тут придумали совсем новый алгоритм кодирования. Кроме того, я до этого лета, нигде на форумах программистов не встречал даже упоминания о библиотеке "Base45".
    Где ещё эта библиотека применяется?, в какой отрасли?,
    для чего?. Да нигде!

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


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

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


  • Delphi_RTTI
    Участник ответил
    Я нашёл статью на зарубежном форуме, датируемую декабрём 2017 года, тоесть 5 лет назад :

    https://tech-codeyellow-nl.translate...&_x_tr_pto=nui

    Там обсуждают на тот момент разработку новой библиотеки "Base45".
    Лишний раз убеждаюсь в том, что всё это готовилось заранее, а не появилось спонтанно в начале лета.

    5 лет Карл !!!
    Они планировали разработку этих сертификатов ещё тогда.

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


  • Zahlesel
    Участник ответил
    ну удачи тебе в гуглении
    https://stackoverflow.com/questions/...-php-to-delphi

    кроме разницы в операторах вроди ничего другово нет

    https://www.delphipraxis.net/208757-covid-zertifikatscheck.html#post1494623
    немец грозился написать, да походу одумался, нах оно нужно

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


  • Delphi_RTTI
    Участник ответил
    Ну конечно можно вызывать из Delphi чужие приложения.
    От языка С его отличает только синтаксис.
    Неважно на каком языке я скажу фразу "Я тебя люблю" -
    на французком или на русском, смысл слов от этого не изменится. Делфи в этом плане даже легче в освоении.
    Можно также попробовать запихнуть исходник С в динамическую библиотеку ".dll" и вызывать её функции из
    ".exe". Конечно, хотелось бы, чтобы прога была полностью написана на одном языке. Попробую изучить код исходника, логика мне понятна и работа некоторых операторов, но ошибка всего лишь на один символ, может привести к неверному результату или полной неработоспособности программы.
    Ох, говорила мне мама в школе: "Учись сынок, учись!"...
    ​​​​​​​У меня есть свой, более важный проект на Delphi, а я отвлекаюсь на какую-то фигню с QR кодами.

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


  • Zahlesel
    Участник ответил
    ну скажи может и не стоит безумием страдать

    повторюсь: ты можешь сделать ексешник, который будет скомпилирован из пхп или питона, давать на него с делфи стринг и получать ответ.
    https://stackoverflow.com/questions/...ows-executable

    если ты конечно в делфи имеешь возможность запустить внешнее приложение.

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


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

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


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

    какой смысл вообще возитъся с генерированием куера?

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


  • Delphi_RTTI
    Участник ответил
    А вот на языке С :
    #include <ctype.h> // for size_t
    #include <string.h> // for strlen()
    /* Table 1: The Base 45 Alphabet
    Value Encoding Value Encoding Value Encoding Value Encoding
    00 0 12 C 24 O 36 Space
    01 1 13 D 25 P 37 $
    02 2 14 E 26 Q 38 %
    03 3 15 F 27 R 39 *
    04 4 16 G 28 S 40 +
    05 5 17 H 29 T 41 -
    06 6 18 I 30 U 42 .
    07 7 19 J 31 V 43 /
    08 8 20 K 32 W 44 :
    09 9 21 L 33 X
    10 A 22 M 34 Y
    11 B 23 N 35 Z
    */
    static const char BASE45_CHARSET[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";
    static char _C2I[256] = {
    255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
    255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
    36, 255,255,255, 37, 38,255,255, 255,255, 39, 40, 255, 41, 42, 43,
    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44,255, 255,255,255,255,
    255, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* uppercase */
    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 255,255,255,255,
    255, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* lowercase */
    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 255,255,255,255,
    255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
    255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
    255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
    255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
    255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
    255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
    255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
    255,255,255,255, 255,255,255,255, 255,255,255,255, 255,255,255,255,
    };
    int base45_encode(char * dst, size_t *_max_dst_len, const unsigned char * src, size_t src_len) {
    size_t out_len = 0, max_dst_len;
    max_dst_len = _max_dst_len ? *_max_dst_len : src_len * 4;
    for(int i = 0; i < src_len; i+=2) {
    if (src_len - i > 1) {
    int x = ((src[i])<<8) + src[i+1];
    unsigned char e = x / (45 * 45);
    x %= 45 * 45;
    unsigned char d = x / 45;
    unsigned char c = x % 45;
    if (out_len < max_dst_len && dst)
    dst[ out_len ] = BASE45_CHARSET[c];
    out_len++;
    if (out_len < max_dst_len && dst)
    dst[ out_len ] = BASE45_CHARSET[d];
    out_len++;
    if (out_len < max_dst_len && dst)
    dst[ out_len ] = BASE45_CHARSET[e];
    out_len++;
    } else {
    int x = src[i];
    unsigned char d = x / 45;
    unsigned char c = x % 45;
    if (out_len < max_dst_len && dst)
    dst[ out_len ] = BASE45_CHARSET[c];
    out_len++;
    if (out_len < max_dst_len && dst)
    dst[ out_len ] = BASE45_CHARSET[d];
    out_len++;
    }
    }
    /* Same non guarantee as strncpy et.al. */
    if (out_len < max_dst_len && dst)
    dst[ out_len ] = 0;
    if (_max_dst_len)
    *_max_dst_len = out_len;
    return 0;
    }
    int base45_decode(unsigned char * dst, size_t * _max_dst_len, const char * src, size_t src_len) {
    size_t out_len = 0, max_dst_len;
    max_dst_len = _max_dst_len ? *_max_dst_len : src_len;
    if (dst == NULL && _max_dst_len == NULL)
    return -2;
    if (src == NULL)
    return -2;
    if (src_len == 0)
    src_len = strlen(src);
    for(int i = 0; i < src_len; i+=3) {
    int x,a,b;
    if (src_len - i < 2)
    return -1;
    if ((255 == (a = _C2I[src[i]])) || (255 == (b = _C2I[src[i+1]])))
    return -1;
    x = a + 45 * b;
    if (src_len - i >= 3) {
    if (255 == (a = _C2I[src[i+2]]))
    return -1;
    x += a * 45 * 45;
    if (out_len < max_dst_len && dst)
    dst[out_len] = x / 256;
    out_len++;
    x %= 256;
    };
    if (out_len < max_dst_len && dst)
    dst[out_len] = x;
    out_len++;
    };
    if (_max_dst_len)
    *_max_dst_len = out_len;
    return 0;
    }
    #ifdef BASE45_UTIL
    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char ** argv) {
    FILE * in = stdin;
    FILE * out = stdout;
    int decode = 0;
    int at = 1;
    if (argc > 1 && argv[at][0] == '-') {
    if (argv[at][1] == 'd')
    decode = 1;
    else {
    fprintf(stderr,"Syntax: %s [-d] [infile [outfile]]\n", argv[0]);
    exit(1);
    };
    at++; argc--;
    };
    if (argc > 1) {
    if (NULL == (in = fopen(argv[at],"r"))) {
    perror("Cannot open input file for reading:");
    exit(1);
    };
    at++; argc--;
    };
    if (argc > 1) {
    if (NULL == (out = fopen(argv[at],"w"))) {
    perror("Cannot open out file for writing:");
    exit(1);
    };
    at++; argc--;
    };
    #ifdef VALIDATE
    for(int i = 0; i < 45; i++) assert(i == _C2I[BASE45_CHARSET[i]]);
    #endif
    while(!feof(in)) {
    unsigned char buff[ 3 * 1024 ]; // multiple chosen to allow continuation.
    unsigned char outbuf[ 3 * 3 * 1024 ];
    size_t olen = sizeof(outbuf);
    size_t len = fread(buff, 1, 3 * 1024, in);
    buff[len] = 0;
    if (len) {
    int e;
    if (decode)
    e = base45_decode(outbuf, &olen, (char *) buff, len);
    else
    e = base45_encode((char *)outbuf, &olen, buff, len);
    if (e) {
    fprintf(stderr,"base45 %s failed\n", decode ? "decode" : "encode");
    exit(1);
    };
    if (olen)
    fwrite(outbuf, 1, olen, out);
    };
    }
    fclose(out);
    return(0);
    };
    #endif
    Как чёрт возьми это перевести?...

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


  • Delphi_RTTI
    Участник ответил
    Вопрос по-поводу библиотеки "Base45" остаётся открыты...
    Вот исходник PHP :
    PHP код:
                                /*                                             Base45 endocing/decoding                                                                                           Specification: https://datatracker.ietf.org/doc/draft-faltstrom-base45/                                                                                           30.3.2021                                             Chris Baumann - c.baumann@baumann.at                                             */                                                                                           $charset "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";                                                                                           function divmod($x$y) {                                             $resX floor($x $y);                                             $resY $x $y;                                             return(array($resX$resY));                                             }                                                                                           function str2buffer($s) {                                             $res = array();                                             for ($i=0$i<strlen($s); $i++) {                                             $res[] = ord($s[$i]);                                             }                                             return($res);                                             }                                                                                           function b45str2buffer($s) {                                             global $charset;                                             $res = array();                                             for ($i=0$i<strlen($s); $i++) {                                             $p strpos($charset$s[$i]);                                             if ($p === false) {                                             throw new Exception('Invalid base45 value');                                             } else {                                             $res[] = $p;                                             }                                             }                                             return($res);                                             }                                                                                           function base45_encode($input) {                                             global $charset;                                             $buffer str2buffer($input);                                             $res '';                                             for ($i=0$i<count($buffer); $i+=2) {                                             if (count($buffer) - $i 1) {                                             $x = ($buffer[$i] << 8) + $buffer[$i+1];                                             list($e$rest) = divmod($x45 45);                                             list($d$c) = divmod($rest45);                                             $res .= @$charset[$c] . @$charset[$d] . @$charset[$e];                                             } else {                                             list($d$c) = divmod($buffer[$i], 45);                                             $res .= @$charset[$c] . @$charset[$d];                                             }                                             }                                             return($res);                                             }                                                                                           function base45_decode($input) {                                             $buffer b45str2buffer($input);                                             $res '';                                             for ($i=0$i<count($buffer); $i+=3) {                                             if (count($buffer) - $i >= 3) {                                             $x $buffer[$i] + $buffer[$i+1] * 45 $buffer[$i+2] * 45 45;                                             list($a$b) = divmod($x256);                                             $res .= chr($a) . chr($b);                                             } else {                                             $x $buffer[$i] + $buffer[$i+1] * 45;                                             $res .= chr($x);                                             }                                             }                                             return($res);                                             } 

    Как "это" перевести на Delphi ?
    Миссия невыполнима ?

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


  • Delphi_RTTI
    Участник ответил
    Обратите внимание, приложение "Green Pass Wallet" не проверяет ключ на подлинность
    и с этим QR можно идти в пивбар :


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

Название:	1.jpg 
Просмотров:	1207 
Размер:	51.1 Кб 
ID:	7244

    А вот приложение "SafeBorder" (используется ментами), проверку не проходит,
    хотя отображает Фамилию - Имя, а также количество доз принятой вакцины :


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

Название:	IMG_20211129_220200_206.jpg 
Просмотров:	1219 
Размер:	47.7 Кб 
ID:	7246

    Более того, если я в программе сгенерирую QR с пустым текстом HC1, без дополнительных данных
    то приложение распознаёт код как сертификат, но с пустыми полями для Имени и Даты рождения :


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

Название:	2.jpg 
Просмотров:	1205 
Размер:	33.6 Кб 
ID:	7248

    Однако, если я заключу текст HC1 в кавычки или введу (абсолютно левый текст),
    тогда приложение отображает его как "Контекст" и он уже не распознаётся как сертификат
    и не имеет обрамляющей зелёной рамки вокруг :


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

Название:	3.jpg 
Просмотров:	1206 
Размер:	31.5 Кб 
ID:	7250
    Вложения

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

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