Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2 3 4 5

Алгоритм контрольной суммы Флетчера


cryptologic ©   (24.03.21 22:44[20]


> cryptologic ©   (24.03.21 22:19) [19]


Когда то comp128v1 очень легко ломался без проблем. У меня были симки-болванки я ломал симки и записывал кучу номеров на одну болванку так называемую мультисим.. Пока все ОПСОСы не перешли на v2 b v3. Ну и вот пришла идея как можно попробовать в целях эксперимента т.е. спортивного интереса взломать симку версии 2 или версии 3. Метод примерно такой сим карте посылаем заведомо известый челенж, например, "AA... AAA" или "00.. ..00", а от симки получаем хешь, алгоритм этого хеша допустим условно "известен" вы только что сами написали... дальше нужно сделать программу для брут форса с распределенным вычислением по узлам... или будет найден реальный ключ симки или коллизия ключа..  потом симку можно будет также клонировать и на мультисим v2 записать кучу номеров.  В некоторых странах это не запрещено например Китай. И все потом можно ПО продать в Китай.  :-)


cryptologic ©   (24.03.21 23:52[21]

Не менее сложной задачей является отправить сим карте в правильном формате запрос на получения хэша. Но есть некоторая программа которая ломает сим карты через специальный адаптер, который подключается к СОМ порту.  Метод заключается в том, что бы перехватить  буфер СОМ порта программой "Serial Port Monitor" и посмотреть в каком порядке программа simscan посылает команды к сим карте.
Я таким методом исследовал как управляются китайские usb реле их фирменной убогой программой, а потом свою программу сделал.


cryptologic ©   (25.03.21 01:38[22]


> Rouse_ ©   (24.03.21 21:15) [18]


Еще раз спсбл скажи куда тебе крипту загнать?  Хочу 100 RVN кинуть вознаграждения


cryptologic ©   (25.03.21 01:47[23]

Если нет крипто кошелька то я бы посоветовал TrustWallet на сматрфон, или SafePal есть версия аппаратная самая надежная. Сейчас вообще модно иметь криптовалюту, даже Илон Маск вваливает свои миллионы в крипту.


Rouse_ ©   (25.03.21 10:10[24]


> cryptologic ©   (25.03.21 01:38) [22]
> Еще раз спсбл скажи куда тебе крипту загнать?  Хочу 100
> RVN кинуть вознаграждения

Себе оставь, там делов на 5 минут, не за что таньга требовать :)))))


manaka ©   (25.03.21 15:47[25]


> Как проверить что сей алгоритм рабочий?

Для этого надо сравнить результат с заведомо верным. )))


cryptologic ©   (26.03.21 09:23[26]


> manaka ©   (25.03.21 15:47) [25]


Правильно, а поэтому нужно достать реально работающую симку v2  и её Ki для проверки, а где? Вариан 2) самый трудный и тупой взломать симку v2 выше описанным способом и записать ее на болванку, потом проверить на ОПСОСе
Вариант 3, выпаять GSM модуль сделать имитацию СИМ и кидать ОПСОСу  запросы на аунтификацию но вместо реального Ki симки сгенерированый в случайном порядке по известному алгоритму... а вдруг повезет и удастся чужой Ki захватить.


manaka ©   (27.03.21 16:54[27]


> Для этого надо сравнить результат с заведомо верным.

Я не о том. Если есть заведомо верный результат, значит есть рабочий алгоритм его нахождения.
;)


cryptologic ©   (29.03.21 22:43[28]


> manaka ©   (27.03.21 16:54) [27]
>


Наверно, но я же предпочту вернуться к своим баранам, т.е. к той теме с которой начал.
Скажу сразу же где мне нужны фукции проверки контроля четности флетчера для проверки четности сообщений для ардуино т.к. в ардуино ограничена память, то естественно CRC16,  CRC32, использующие таблицы не пригодны т.к. сильный расход память.  Флетчер подойдёт.
Ну так кто то скажет используй готовый код из примера https://ru.wikipedia.org/wiki/Контрольная_сумма_Флетчера - да и будет прав. Но мне нужно код на делфи, так как ардуино будет управляться с ПС, а на ПС программа на разрабатывается на Delphi, а значит нужно такая же функция как и на Си

И по мимо 16 битной функции мне нужны функции 8,16, 32, 64 битные т.е. все функции флетчера..  Но я на самом деле в Си не очень хорошо разбираюсь и многие операторы "финделябры" языка не понятны.

Кстати, что ранее были здесь показаны фунции на делфи Fletcher32 и Fletcher64 они не правильные и не работают..  т.к. их результаты даже близко не правильны с  примерами из статьи из "вики".


cryptologic ©   (30.03.21 01:22[29]

Короче у меня в место результата

16-битная реализация (32-битная контрольная сумма)
"abcde"    -> 4031760169 (0xF04FC729)
"abcdef"   -> 1448095018 (0x56502D2A)
"abcdefgh" -> 3957429649 (0xEBE19591)


32-битная реализация (64-битная контрольная сумма)
"abcde"  -> 14467467625952928454 (0xC8C6C527646362C6)
"abcdef" -> 14467579776138987718 (0xC8C72B276463C8C6)


- получается один результат:
Fletcher32(AnsiString('abcde')) : 495 hex: 01EF
Fletcher64(AnsiString('abcde')) : 495 hex: 000001EF


Получается, что операция   OR sum1 затирает значения sum2 так как в sum1 в старших битах всегlа нули [0][0][1][1] получается, что алгоритм работает если подавать данные по два 2 байта а не по одному..  если подавать по 1 байту в UInt32 то получается, что старшие байты пустые.


cryptologic ©   (30.03.21 05:00[30]

Переделал функцию так что бы она по 2 байта записывала в Uint16 а не по одному и все равно результаты не сходятся .... печалька

{-------------------------------- Fletcher32 ----------------------------------}
function Fletcher32(AStrData: AnsiString): UInt32;
var
 sum1, sum2: UInt32;
 ch: AnsiString;
 //ch: AnsiChar;
 pos: integer;
begin
 sum1   := 0;
 sum2   := 0;

 {  // Версия 1
 for ch in AStrData do
 begin
   sum1 := (sum1 + Byte(ch)) mod $FFFF;
   sum2 := (sum2 + sum1) mod $FFFF;
   // Form1.mm.lines.add('sum1: '+ IntToStr(sum1) + ' sum2: '+ IntToStr(sum2));
 end;
 Result := (sum2 shl 16) or sum1;  }

 // Версия 2
 pos  := 1;
 while pos <= Length(AStrData) do
 begin
   ch := copy(AStrData, pos, 2);
   if Length(ch) = 2 then
   begin
     sum1 := sum1 + (($0000 or Byte(ch[1])) shl 8) or Byte(ch[2]) mod $FFFF;
   end
   else
   begin
     sum1 := (sum1 + ($0000 or Byte(ch[1])) shl 8) mod $FFFF;
   end;
   // Form1.mm.Lines.Add('pos' + IntToStr(pos) + 'ch: ' + ch );
   pos := pos + 2;
   sum2 := (sum2 + sum1) mod $FFFF;
 end;

 Result := (sum2 shl 16) or sum1;

end;


Теперь у меня такой результат вываливается Fletcher32 "abcde": 10695 hex: 000029C7


KSergey ©   (30.03.21 09:16[31]

Слов много, а в чем конкретно проблема - не понять.
Приведите код Си-функции, которую надо переложить (прямо здесь, не ссылкой куда-то!!) - тогда можно вести предметный разговор.


KSergey ©   (30.03.21 09:29[32]

Кстати, если брать примеры из вики
Там такой заголовок:

uint32_t
fletcher32(const uint16_t *data, size_t len)

И приведены примеры:
16-битная реализация (32-битная контрольная сумма).
"abcde"    -> 4031760169 (0xF04FC729)

Если я верно понимаю - то этот пример соответствует приведённому мной заголовку функции. Так? или не так?

Если так - то какие данные должны приезжать на вход этой функции? я вот не понимаю. Что именно (побайтно) должно быть в памяти, на которую указывает *data ? как надо интерпретировать строку "abcde" ??

Вижу три варианта (ниже коды символов в hex, т.е. 'a' - это 61 и т.д.):
1) 61 62 63 64 65 00
и len = 3 (ну это же количество uint16_t слов, так? или байтов??!)

2) 00 61 00 62 00 63 00 64 00 65
и len = 5

3) 61 00 62 00 63 00 64 00 65 00
и len = 5

Вот что авторы хотели сказать??


KSergey ©   (30.03.21 09:39[33]

Проверил тут
https://onlinegdb.com/B1z_UHgrd

Верный вариант 1)

т.к. вызов вот в таком виде
fletcher32((const uint16_t *)"abcde", 3);
даёт то же результат, что в вики

Тогда вот это

> cryptologic ©   (30.03.21 05:00) [30]
>
> function Fletcher32(AStrData: AnsiString): UInt32;

никак не эквивалентно Cи-заголовку функции
uint32_t
fletcher32(const uint16_t *data, size_t len)

т.к. AnsiString - однобайтная.

Если же все-таки хочется сделать именно такой заголовок (в принципе, разумно), то надо не забывать, что при нечетном кол-ве символов в строке надо еще не забывать учитывать финальный #0 (ну или "добавлять" его в рассчет.


KSergey ©   (30.03.21 09:45[34]

Если хочется в дельфи иметь заголовок как приведён, то я бы сделал перегруженный вариант с заголовком

function Fletcher32(data: PUint32, len: UInt32): UInt32;

которую бы вызывал

function Fletcher32(AStrData: AnsiString): UInt32;
var
len: UInt32
begin
  len := как-то вычисляем так, чтобы для четной длины AStrData было Length(AStrData) / 2, а для нечетного Length(AStrData) / 2 + 1, лень думать как

  Result := Fletcher32((PUint32)PChar(AStrData), len);
end;

ну а вариант
function Fletcher32(data: PUint32, len: UInt32): UInt32;
добуквенно переложить из Си-реализации и работу с указателями, без всяких там
ch := copy(AStrData, pos, 2);


cryptologic ©   (30.03.21 20:15[35]


> KSergey ©   (30.03.21 09:29) [32]



> Если я верно понимаю - то этот пример соответствует приведённому
> мной заголовку функции. Так? или не так?


Так


> Если я верно понимаю - то этот пример соответствует приведённому
> мной заголовку функции. Так? или не так?
>
> Если так - то какие данные должны приезжать на вход этой
> функции? я вот не понимаю. Что именно (побайтно) должно
> быть в памяти, на которую указывает *data ? как надо интерпретировать
> строку "abcde" ??


На вход функции должны приезжать строковые данные "abcde" - это пример строки из статьи wiki - они же будут проверочными.


> Вижу три варианта (ниже коды символов в hex, т.е. 'a' -
> это 61 и т.д.):
> 1) 61 62 63 64 65 00
> и len = 3 (ну это же количество uint16_t слов, так? или
> байтов??!)
>
> 2) 00 61 00 62 00 63 00 64 00 65
> и len = 5
>
> 3) 61 00 62 00 63 00 64 00 65 00
> и len = 5
>
> Вот что авторы хотели сказать??
>
>


Ну да даже на си возникают проблемы с подачей байтов.  Как нужно вписывать однобайтовый массив строки в двух байтовый массив когда есть четные и не четные строки.


cryptologic ©   (30.03.21 20:24[36]


> KSergey ©   (30.03.21 09:39) [33]



> Если же все-таки хочется сделать именно такой заголовок
> (в принципе, разумно), то надо не забывать, что при нечетном
> кол-ве символов в строке надо еще не забывать учитывать
> финальный #0 (ну или "добавлять" его в рассчет.


Я как бы учел его добавление

>    if Length(ch) = 2 then
>    begin
>      sum1 := sum1 + (($0000 or Byte(ch[1])) shl 8) or Byte(ch[2])
> mod $FFFF;
>    end
>    else
>    begin
>      sum1 := (sum1 + ($0000 or Byte(ch[1])) shl 8) mod $FFFF;
>
>    end;


смещение последнего нечетного байта в лево на 8 бит в последней элемент массива т.е.
[0][x] shl 8  = [x][0]  т.е. это как бы я этим дописал недостающий ноль.


cryptologic ©   (30.03.21 20:32[37]

Короче говоря нужно эту функцию транслировать в код  Delphi

uint32_t fletcher32(const uint16_t *data, size_t len)
{
       uint32_t c0, c1;
       unsigned int i;

       for (c0 = c1 = 0; len >= 360; len -= 360) {
               for (i = 0; i < 360; ++i) {
                       c0 = c0 + *data++;
                       c1 = c1 + c0;
               }
               c0 = c0 % 65535;
               c1 = c1 % 65535;
       }
       for (i = 0; i < len; ++i) {
               c0 = c0 + *data++;
               c1 = c1 + c0;
       }
       c0 = c0 % 65535;
       c1 = c1 % 65535;
       return (c1 << 16 | c0);
}


Ноя в си не силен и не могу понять условия циклов, а потом следующее о чем выше упоминалось
> KSergey ©   (30.03.21 09:39) [33]


как вписывать строки в двухбайтные массивы когда строки могут быть четными и не четными по своей длине. В wiki приводятся примеры именно со строками и результаты по которым можно будет проверить, что транслированный код работает правильно.


cryptologic ©   (30.03.21 20:37[38]


> KSergey ©   (30.03.21 09:45) [34]


Еще мне бы хотелось, что бы заголовок функции в delphi интерпретации был таким
function Fletcher32(AStrData: AnsiString): UInt32;
потому  что это упрощает работу с данными, т.к. данные  почти всегда будут строками


cryptologic ©   (30.03.21 20:44[39]

Я так понимаю, что данные должны подаваться таким образом
при четной подаче байт   xxxxxx -> [xx][xx][xx]
при не четной подаче байт xxxxx -> [xx][xx][x0]

Где xxxxxx - однобайтная строка
где [xx] - 2х байтный тип Uint16


Страницы: 1 2 3 4 5 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо