При декодировании DMR голос диктора заикается

В данном форуме можно обсудить и найти информацию о SDR, в том числе о HackRF One, RTL-SDR и подобных устройствах, а также о программах SDRSharp, SDR Console и других
Аватара пользователя
DesignerMix
Администратор
Администратор
Сообщения: 7052
Зарегистрирован: 25 апр 2014, 10:51
Откуда: Белгород
Контактная информация:

При декодировании DMR голос диктора заикается

Сообщение DesignerMix »

Lubitel, попробуйте SDRSharp х86. Ну и с версиями тоже поэкспериметрируйте, но думаю что смены разрядности будет достаточно, на форуме уже кто-то писал что версия x64 почему-то вызывает проблемы (даже на ОС x64) :?

Lubitel
Интересующийся
Сообщения: 42
Зарегистрирован: 02 апр 2016, 20:20

При декодировании DMR голос диктора заикается

Сообщение Lubitel »

Eismeer писал(а): 10 дек 2017, 15:57 Решение здесь одно: специальный аппаратно-программный комплекс по взлому DMR. Купите себе нормальную антенну и поищите открытые цифровые сигналы.
Пишут что с помощью цифровой рации моторола DP/DM + и специального ПО к ней это можно сделать, вот нашел видео где у человека вроде как это выходит(не на живом эфире только) https://www.youtube.com/watch?v=FVyFm7GvacQ
Конечно много вопросов насчет этого видео, таких как какую именно роль выполняла DSD запущенная справа? За все время не нашел не одного открытого канала.

Eismeer
Постоянный пользователь
Сообщения: 152
Зарегистрирован: 28 апр 2017, 21:26

При декодировании DMR голос диктора заикается

Сообщение Eismeer »

Мужик молодец. У DMR есть два вида шифрования: базовое и улучшенное. На видео декодирование базового шифрования, а DSD так для наглядности запущена.
Базовое в DSD подписывается "BP", улучшенное "EP"

Lubitel
Интересующийся
Сообщения: 42
Зарегистрирован: 02 апр 2016, 20:20

При декодировании DMR голос диктора заикается

Сообщение Lubitel »

У меня есть вот как раз только базовое используется. Кстати обратил внимание что вторая DSD у него запущен Linux терминале, на форуме(внизу ссылка) пишут что исходники DSD можно изменить а именно: взять 49 битный ключ и сравнить его с 49 bit AMBE фреймами и после пересобрать, в результате якобы он 'научится' декодировать базовое шифрование, может этот парень на видео это и сделал, хотя знаниями нужно обладать весьма приличными для редактирования такого сложного когда(что бы после это все завелось).
Дизассемблировать и модифицировать Windows версию DSD думаю в десятки раз сложнее чем версию под Linux, вот почему у него и запущен Linux терминал слева. НО вот непойму почему у него там расширение файла ".EXE" :sorry: Но если кто то это сделал то почему эта утилита еще не гуляет по сети? Так как судя по дате загрузки видео уже прошло больше года, в комментариях все просьбы на данное ПО он игнорил.
https://forums.radioreference.com/voice ... ing-3.html

Вот ради интереса нашел исходник:
https://github.com/szechyjs/dsd/tree/master/src
dsd/src/dmr_voice.c

Код: Выделить всё

383 lines (353 sloc)  9.32 KB
/*
 * Copyright (C) 2010 DSD Author
 * GPG Key ID: 0x3F1D7FD0 (74EF 430D F7F2 0A48 FCE6  F630 FAA2 635D 3F1D 7FD0)
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

#include "dsd.h"
#include "dmr_const.h"

void
processDMRvoice (dsd_opts * opts, dsd_state * state)
{
  // extracts AMBE frames from DMR frame
  int i, j, dibit;
  int *dibit_p;
[color=#FF0000]  [b]# ЕСЛИ ВЕРНО ПОНЯЛ ТО ПАРЕНЬ НА ФОРУМЕ ИМЕЛ ВВИДУ ЧТО УМНОЖИТЬ НУЖНО ОДИН ИЗ МАССИВОВ ambe_fr  на МАССИВ syncbits ?[/b][/color]
  char ambe_fr[4][24];     
  char ambe_fr2[4][24];
  char ambe_fr3[4][24];
  const int *w, *x, *y, *z;
  char sync[25];
  char syncdata[25];
  char cachdata[13];
  int mutecurrentslot;
  int msMode;

#ifdef DMR_DUMP
  int k;
  char syncbits[49];
  char cachbits[25];
#endif

  mutecurrentslot = 0;
  msMode = 0;

  dibit_p = state->dibit_buf_p - 144;
  for (j = 0; j < 6; j++)
    {
      // 2nd half of previous slot
      for (i = 0; i < 54; i++)
        {
          if (j > 0)
            {
              dibit = getDibit (opts, state);
            }
          else
            {
              dibit = *dibit_p;
              dibit_p++;
              if (opts->inverted_dmr == 1)
                {
                  dibit = (dibit ^ 2);
                }
            }
        }

      // CACH
      for (i = 0; i < 12; i++)
        {
          if (j > 0)
            {
              dibit = getDibit (opts, state);
            }
          else
            {
              dibit = *dibit_p;
              dibit_p++;
              if (opts->inverted_dmr == 1)
                {
                  dibit = (dibit ^ 2);
                }
            }
          cachdata[i] = dibit;
          if (i == 2)
            {
              state->currentslot = (1 & (dibit >> 1));  // bit 1
              if (state->currentslot == 0)
                {
                  state->slot0light[0] = '[';
                  state->slot0light[6] = ']';
                  state->slot1light[0] = ' ';
                  state->slot1light[6] = ' ';
                }
              else
                {
                  state->slot1light[0] = '[';
                  state->slot1light[6] = ']';
                  state->slot0light[0] = ' ';
                  state->slot0light[6] = ' ';
                }
            }
        }
      cachdata[12] = 0;


#ifdef DMR_DUMP
      k = 0;
      for (i = 0; i < 12; i++)
        {
          dibit = cachdata[i];
          cachbits[k] = (1 & (dibit >> 1)) + 48;        // bit 1
          k++;
          cachbits[k] = (1 & dibit) + 48;       // bit 0
          k++;
        }
      cachbits[24] = 0;
      printf ("%s ", cachbits);
#endif

      // current slot frame 1
      w = rW;
      x = rX;
      y = rY;
      z = rZ;
      for (i = 0; i < 36; i++)
        {
          if (j > 0)
            {
              dibit = getDibit (opts, state);
            }
          else
            {
              dibit = *dibit_p;
              dibit_p++;
              if (opts->inverted_dmr == 1)
                {
                  dibit = (dibit ^ 2);
                }
            }
          ambe_fr[*w][*x] = (1 & (dibit >> 1)); // bit 1
          ambe_fr[*y][*z] = (1 & dibit);        // bit 0
          w++;
          x++;
          y++;
          z++;
        }

      // current slot frame 2 first half
      w = rW;
      x = rX;
      y = rY;
      z = rZ;
      for (i = 0; i < 18; i++)
        {
          if (j > 0)
            {
              dibit = getDibit (opts, state);
            }
          else
            {
              dibit = *dibit_p;
              dibit_p++;
              if (opts->inverted_dmr == 1)
                {
                  dibit = (dibit ^ 2);
                }
            }
          ambe_fr2[*w][*x] = (1 & (dibit >> 1));        // bit 1
          ambe_fr2[*y][*z] = (1 & dibit);       // bit 0
          w++;
          x++;
          y++;
          z++;
        }

      // signaling data or sync
      for (i = 0; i < 24; i++)
        {
          if (j > 0)
            {
              dibit = getDibit (opts, state);
            }
          else
            {
              dibit = *dibit_p;
              dibit_p++;
              if (opts->inverted_dmr == 1)
                {
                  dibit = (dibit ^ 2);
                }
            }
          syncdata[i] = dibit;
          sync[i] = (dibit | 1) + 48;
        }
      sync[24] = 0;
      syncdata[24] = 0;

      if ((strcmp (sync, DMR_BS_DATA_SYNC) == 0) || (strcmp (sync, DMR_MS_DATA_SYNC) == 0))
        {
          mutecurrentslot = 1;
          if (state->currentslot == 0)
            {
              sprintf (state->slot0light, "[slot0]");
            }
          else
            {
              sprintf (state->slot1light, "[slot1]");
            }
        }
      else if ((strcmp (sync, DMR_BS_VOICE_SYNC) == 0) || (strcmp (sync, DMR_MS_VOICE_SYNC) == 0))
        {
          mutecurrentslot = 0;
          if (state->currentslot == 0)
            {
              sprintf (state->slot0light, "[SLOT0]");
            }
          else
            {
              sprintf (state->slot1light, "[SLOT1]");
            }
        }
      if ((strcmp (sync, DMR_MS_VOICE_SYNC) == 0) || (strcmp (sync, DMR_MS_DATA_SYNC) == 0))
        {
          msMode = 1;
        }

      if ((j == 0) && (opts->errorbars == 1))
        {
          printf ("%s %s  VOICE e:", state->slot0light, state->slot1light);
        }

#ifdef DMR_DUMP
      k = 0;
      for (i = 0; i < 24; i++)
        {
          dibit = syncdata[i];
          syncbits[k] = (1 & (dibit >> 1)) + 48;        // bit 1
          k++;
          syncbits[k] = (1 & dibit) + 48;       // bit 0
          k++;
        }
      syncbits[48] = 0;
      printf ("%s ", syncbits);
#endif

      // current slot frame 2 second half
      for (i = 0; i < 18; i++)
        {
          dibit = getDibit (opts, state);
          ambe_fr2[*w][*x] = (1 & (dibit >> 1));        // bit 1
          ambe_fr2[*y][*z] = (1 & dibit);       // bit 0
          w++;
          x++;
          y++;
          z++;
        }

      if (mutecurrentslot == 0)
        {
          if (state->firstframe == 1)
            {                   // we don't know if anything received before the first sync after no carrier is valid
              state->firstframe = 0;
            }
          else
            {
              processMbeFrame (opts, state, NULL, ambe_fr, NULL);
              processMbeFrame (opts, state, NULL, ambe_fr2, NULL);
            }
        }

      // current slot frame 3
      w = rW;
      x = rX;
      y = rY;
      z = rZ;
      for (i = 0; i < 36; i++)
        {
          dibit = getDibit (opts, state);
          ambe_fr3[*w][*x] = (1 & (dibit >> 1));        // bit 1
          ambe_fr3[*y][*z] = (1 & dibit);       // bit 0
          w++;
          x++;
          y++;
          z++;
        }
      if (mutecurrentslot == 0)
        {
          processMbeFrame (opts, state, NULL, ambe_fr3, NULL);
        }

      // CACH
      for (i = 0; i < 12; i++)
        {
          dibit = getDibit (opts, state);
          cachdata[i] = dibit;
        }
      cachdata[12] = 0;

#ifdef DMR_DUMP
      k = 0;
      for (i = 0; i < 12; i++)
        {
          dibit = cachdata[i];
          cachbits[k] = (1 & (dibit >> 1)) + 48;        // bit 1
          k++;
          cachbits[k] = (1 & dibit) + 48;       // bit 0
          k++;
        }
      cachbits[24] = 0;
      printf ("%s ", cachbits);
#endif


      // next slot
      skipDibit (opts, state, 54);

      // signaling data or sync
      for (i = 0; i < 24; i++)
        {
          dibit = getDibit (opts, state);
          syncdata[i] = dibit;
          sync[i] = (dibit | 1) + 48;
        }
      sync[24] = 0;
      syncdata[24] = 0;

      if ((strcmp (sync, DMR_BS_DATA_SYNC) == 0) || (msMode == 1))
        {
          if (state->currentslot == 0)
            {
              sprintf (state->slot1light, " slot1 ");
            }
          else
            {
              sprintf (state->slot0light, " slot0 ");
            }
        }
      else if (strcmp (sync, DMR_BS_VOICE_SYNC) == 0)
        {
          if (state->currentslot == 0)
            {
              sprintf (state->slot1light, " SLOT1 ");
            }
          else
            {
              sprintf (state->slot0light, " SLOT0 ");
            }
        }

#ifdef DMR_DUMP
      k = 0;
      for (i = 0; i < 24; i++)
        {
          dibit = syncdata[i];
          syncbits[k] = (1 & (dibit >> 1)) + 48;        // bit 1
          k++;
          syncbits[k] = (1 & dibit) + 48;       // bit 0
          k++;
        }
      syncbits[48] = 0;
      printf ("%s ", syncbits);
#endif

      if (j == 5)
        {
          // 2nd half next slot
          skipDibit (opts, state, 54);

          // CACH
          skipDibit (opts, state, 12);

          // first half current slot
          skipDibit (opts, state, 54);
        }
    }

  if (opts->errorbars == 1)
    {
      printf ("\n");
    }

}

Eismeer
Постоянный пользователь
Сообщения: 152
Зарегистрирован: 28 апр 2017, 21:26

При декодировании DMR голос диктора заикается

Сообщение Eismeer »

Приснилось, что базовое шифрование не сложное всего 256 вариантов ключа. А вот улучшенное сложное, длина ключа до 256 бит (соответственно 2 в степени до 255 - вариаций ключа), но с увеличением длины ключа значительно ухудшается качество (дистанция) связи, поэтому зачастую используют ключ длиной около 30-40 бит.
Улучшенное шифрование реализовано на алгоритме modified ARC4 (алгоритм ARC4 тайной не является), а вот модификация коммерческая тайна - из-за этого на ранних прошивках в режиме улучшенного шифрования не работали совместно радиостанции Motorola и Hytera.

Ответить

Вернуться в «Программно-определяемое радио»