С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
yurickas
38 / 36 / 12
Регистрация: 25.11.2015
Сообщений: 379
1

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

06.09.2016, 07:37. Просмотров 441. Ответов 9
Метки нет (Все метки)

собственно вот в чем тема. Разбираюсь я со своим оборудованием и наткнулся на систему безопасности. Суть системы вот в чем: я посылаю команду на доступ, мне приходит сообщение с ключом. Я обрабатываю ключ по алгоритму, и посылаю результат. Если ОК, получаю доступ.

Послушал логи и вот такая картина. Первый раз ключ был 0х12, 0х34 - результат 0х3Е 0хDC
Второй раз ключ был 0x20, 0x9F - результат 0x14 0xF9.

В принципе, тут все понятно:
0x209F это
0010 0000 1001 1111
0x14F9
0001 0100 1111 1001

алгоритм понятен. Старшее слово меняется местами с младшим и записывается задом наперед.

Как этот алгоритм реализовать программно?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2016, 07:37
Ответы с готовыми решениями:

Работа с битами
Здравствуйте! Подскажите, как работать с битами данных. у меня есть данные и...

Манипуляции с битами
В одном из проектов парсятся бинарные данные, среди которых встречается...

Работа с битами числа
Не подскажите как можно инвертировать число?

как работать с bluetooth в с#
Собственно вопрос в названии темы

Как работать с xml?
Всем привет ! вот есть хмl <r> <set var1="test1" /> ...

9
Exerion
[Bicycle Reinventor]
296 / 238 / 106
Регистрация: 19.10.2011
Сообщений: 619
Записей в блоге: 2
Завершенные тесты: 2
06.09.2016, 09:03 2
Через бинарные операторы.
Я бы написал целую портянку с временными переменными, но потом обязательно найдётся гуру, который всё это сделает в одну строчку, так что позориться не буду.
1
Rius
Эксперт .NET
5138 / 3356 / 822
Регистрация: 25.05.2015
Сообщений: 10,312
Записей в блоге: 11
Завершенные тесты: 4
06.09.2016, 09:21 3
Цитата Сообщение от yurickas Посмотреть сообщение
алгоритм понятен. Старшее слово меняется местами с младшим и записывается задом наперед.
Не похоже:
0010 0000 1001 1111
0001 0100 1111 1001
0
yurickas
38 / 36 / 12
Регистрация: 25.11.2015
Сообщений: 379
06.09.2016, 12:58  [ТС] 4
Цитата Сообщение от Rius Посмотреть сообщение
Не похоже:
0010 0000 1001 1111
0001 0100 1111 1001
там логика зависит от того, какой входное число. Если четное, то два слова считаются через реверс + not. Если нет, то через просто через реверс.

Добавлено через 2 минуты
Цитата Сообщение от Exerion Посмотреть сообщение
Через бинарные операторы.
Я бы написал целую портянку с временными переменными, но потом обязательно найдётся гуру, который всё это сделает в одну строчку, так что позориться не буду.
Дык я и панисал через иглу в утке, утка в зайце. Как-то хинди это попахивает.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
short inputPin = 0x209F;
            short outputPin = 0x00;
 
            string s = Convert.ToString(inputPin, 2);
            while (s.Length < 16)
            {
                s = s.Insert(0, "0");
            }
 
            char[] s1, s2, s3, s4,
                   t1, t2, t3, t4;
 
            s1 = new char[4];
            s2 = new char[4];
            s3 = new char[4];
            s4 = new char[4];
            t1 = new char[4];
            t2 = new char[4];
            t3 = new char[4];
            t4 = new char[4];
 
 
            s.CopyTo(0, s1, 0, 4);
            s.CopyTo(4, s2, 0, 4);
            s.CopyTo(8, s3, 0, 4);
            s.CopyTo(12, s4, 0, 4);
 
            t1 = s2;
            t1[3] = (char)0x31;
 
            if (inputPin%2 == 0)
            {
                t2 = s1;
                for (int i = 0; i < 4; i++)
                {
                    if (t2[i] == 0x30)
                    {
                        t2[i] = (char)0x31;
                    }
                    else
                    {
                        t2[i] = (char)0x30;
                    }
                }
 
                t3 = s4.Reverse().ToArray();
                for (int i = 0; i < 4; i++)
                {
                    if (t3[i] == 0x30)
                    {
                        t3[i] = (char)0x31;
                    }
                    else
                    {
                        t3[i] = (char)0x30;
                    }
                }
            }
            else
            {
                t2 = s1.Reverse().ToArray();
                t3 = s4.Reverse().ToArray();
            }
 
            t4 = s3.Reverse().ToArray();
 
 
            string temp = string.Concat<char>(t1);
            temp += string.Concat<char>(t2);
            temp += string.Concat<char>(t3);
            temp += string.Concat<char>(t4);
 
            outputPin = Convert.ToInt16(temp, 2);
0
Rius
Эксперт .NET
5138 / 3356 / 822
Регистрация: 25.05.2015
Сообщений: 10,312
Записей в блоге: 11
Завершенные тесты: 4
06.09.2016, 12:59 5
Покажите примеры с обоснованием. Я ни у первого, ни у второго не вижу чистого реверса, и not тоже...

Добавлено через 40 секунд
О, рефлектором вытащили?)
0
yurickas
38 / 36 / 12
Регистрация: 25.11.2015
Сообщений: 379
06.09.2016, 13:32  [ТС] 6
Ну, циклы for можно вынести, но остальное мне кажется какой-то индо-китайской грамотой.

Сейчас попробую на блоке. Пустит он меня в securityAccess или нет.....

а так придется еще раза 3-4 на репрограмминг ставить и смотреть какие коды генерируются.
0
Rius
Эксперт .NET
5138 / 3356 / 822
Регистрация: 25.05.2015
Сообщений: 10,312
Записей в блоге: 11
Завершенные тесты: 4
06.09.2016, 13:38 7
Ставьте. Чем больше примеров, тем лучше. Потому что, вероятно, ваш алгоритм это лишь частный случай, решение, подогнанное под ответ:
C#
1
t1[3] = (char)0x31;
Немного сокращённый код, но далеко ещё не предел:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        private static UInt16 Method2(UInt16 inputPin)
        {
 
            bool[] s = new BitArray(BitConverter.GetBytes(inputPin)).Cast<bool>().Reverse().ToArray();
 
            bool[] s1, s2, s3, s4,
                   t1, t2, t3, t4;
 
            t1 = new bool[4];
            t2 = new bool[4];
            t3 = new bool[4];
            t4 = new bool[4];
 
            s1 = s.Take(4).ToArray();
            s2 = s.Skip(4).Take(4).ToArray();
            s3 = s.Skip(8).Take(4).ToArray();
            s4 = s.Skip(12).Take(4).ToArray();
 
            t1 = s2;
            t1[3] = true;
 
            if (inputPin % 2 == 0)
            {
                t2 = s1.Select(x => !x).ToArray();
                t3 = s4.Reverse().Select(x => !x).ToArray();
            }
            else
            {
                t2 = s1.Reverse().ToArray();
                t3 = s4.Reverse().ToArray();
            }
 
            t4 = s3.Reverse().ToArray();
 
            bool[] temp = t1.Concat(t2).Concat(t3).Concat(t4).Reverse().ToArray();
 
            byte[] res = new byte[2];
            new BitArray(temp).CopyTo(res, 0);
 
            return BitConverter.ToUInt16(res, 0);
        }
0
yurickas
38 / 36 / 12
Регистрация: 25.11.2015
Сообщений: 379
06.09.2016, 15:37  [ТС] 8
Ну, как-бы алгоритм рабочий. Блок сожрал пин-код и дал мне доступ. Пойду писать код чтения памяти.
0
Rius
Эксперт .NET
5138 / 3356 / 822
Регистрация: 25.05.2015
Сообщений: 10,312
Записей в блоге: 11
Завершенные тесты: 4
06.09.2016, 16:32 9
Рабочим его можно будет назвать, когда 100% пинов будут правильным, и проверено это будет на достаточном количестве случаев. Два - не достаточно.

И в коде явно видны костыли. С таким же успехом можно назвать рабочим код
C#
1
2
3
4
5
6
7
8
9
10
short FindPassword(short input)
{
  if (input == 0x1234)
    return 0x3edb;
 
  if (input == 0x209f)
    return 0x14f9;
 
  return 0x14f9;
}
Добавлено через 32 минуты
Немного короче:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private static UInt16 Method2(UInt16 inputPin)
{
    var sourceBits = new BitArray(BitConverter.GetBytes(inputPin)).Cast<bool>().Reverse();
 
    var s1 = sourceBits.Take(4);
    var s2 = sourceBits.Skip(4).Take(4);
    var s3 = sourceBits.Skip(8).Take(4);
    var s4 = sourceBits.Skip(12).Take(4);
 
    IEnumerable<bool> t1, t2, t3, t4;
    t1 = s2.Select((x, i) => i == 3 ? true : x);
 
    if (inputPin % 2 == 0)
    {
        t2 = s1.Select(x => !x);
        t3 = s4.Reverse().Select(x => !x);
    }
    else
    {
        t2 = s1.Reverse();
        t3 = s4.Reverse();
    }
 
    t4 = s3.Reverse();
 
    var temp = t1.Concat(t2).Concat(t3).Concat(t4).Reverse();
 
    byte[] res = new byte[2];
    new BitArray(temp.ToArray()).CopyTo(res, 0);
 
    return BitConverter.ToUInt16(res, 0);
}
0
yurickas
38 / 36 / 12
Регистрация: 25.11.2015
Сообщений: 379
06.09.2016, 17:51  [ТС] 10
Блок каждый раз меняет пин при перепрограммировании. Можно было бы надергать их штук 10, но каждая смена прошивки - это по времени минут 40 + время найти в логах передачу данных пина и ответа. Там каждый лог по 50 мб получается.

Почитал по стандарту. В общем случае, там тупо число на 0xFFFF умножил. Если число нечетное, то +1 и умножить на 0xFFFF. В частном случае производители вводят свой алгоритм защиты от копирования. Тут у меня частный случай. Посмотрел по логам программу производителя - он выдает 2 пина. Один рассчитан по общим правилам, второй - по этому алгоритму.

Ну, пущай пока будет так, мне более интересно вычитать теперь память EEPROM.

Добавлено через 5 минут
Дальше будет веселее, когда в руки попадется криптованый блок. Вот там надо будет проявить штурм криптоанализа. Но до этого еще далеко.
0
06.09.2016, 17:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2016, 17:51

Как работать с видио
Нужно проиграть видиофайл mp4...как? пробывал так Video video = new...

Как работать с Com-портом
Проблему пытался описать тут...

Как из C# работать с rest api?
Здравствуйте. Есть ли у кого какие примеры как из C# работать с rest api. Я в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru