Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910

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

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

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

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

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

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

Как этот алгоритм реализовать программно?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.09.2016, 07:37
Ответы с готовыми решениями:

Как работать с битами?
Подскажите, пожалуйста... please... У меня дано число типа WORD. Как мне просмотреть первый и последующие биты в этом числе? И...

Посоветуйте книгу по Fortran-у (как работать с битами)
как на fortran'е работать с битами.

Работа с битами. Сдвиг бит в массиве переменных. О как
Всем привет.. Задача такая.. Есть небольшой массив (пусть будет размер три) Добавлено через 11 минут Всем привет.. Задача такая.. ...

9
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
06.09.2016, 09:03
Через бинарные операторы.
Я бы написал целую портянку с временными переменными, но потом обязательно найдётся гуру, который всё это сделает в одну строчку, так что позориться не буду.
1
Эксперт .NET
 Аватар для Rius
13030 / 7597 / 1663
Регистрация: 25.05.2015
Сообщений: 23,138
Записей в блоге: 14
06.09.2016, 09:21
Цитата Сообщение от yurickas Посмотреть сообщение
алгоритм понятен. Старшее слово меняется местами с младшим и записывается задом наперед.
Не похоже:
0010 0000 1001 1111
0001 0100 1111 1001
0
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
06.09.2016, 12:58  [ТС]
Цитата Сообщение от 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
Эксперт .NET
 Аватар для Rius
13030 / 7597 / 1663
Регистрация: 25.05.2015
Сообщений: 23,138
Записей в блоге: 14
06.09.2016, 12:59
Покажите примеры с обоснованием. Я ни у первого, ни у второго не вижу чистого реверса, и not тоже...

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

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

а так придется еще раза 3-4 на репрограмминг ставить и смотреть какие коды генерируются.
0
Эксперт .NET
 Аватар для Rius
13030 / 7597 / 1663
Регистрация: 25.05.2015
Сообщений: 23,138
Записей в блоге: 14
06.09.2016, 13:38
Ставьте. Чем больше примеров, тем лучше. Потому что, вероятно, ваш алгоритм это лишь частный случай, решение, подогнанное под ответ:
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
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
06.09.2016, 15:37  [ТС]
Ну, как-бы алгоритм рабочий. Блок сожрал пин-код и дал мне доступ. Пойду писать код чтения памяти.
0
Эксперт .NET
 Аватар для Rius
13030 / 7597 / 1663
Регистрация: 25.05.2015
Сообщений: 23,138
Записей в блоге: 14
06.09.2016, 16:32
Рабочим его можно будет назвать, когда 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
163 / 138 / 35
Регистрация: 25.11.2015
Сообщений: 910
06.09.2016, 17:51  [ТС]
Блок каждый раз меняет пин при перепрограммировании. Можно было бы надергать их штук 10, но каждая смена прошивки - это по времени минут 40 + время найти в логах передачу данных пина и ответа. Там каждый лог по 50 мб получается.

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

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

Добавлено через 5 минут
Дальше будет веселее, когда в руки попадется криптованый блок. Вот там надо будет проявить штурм криптоанализа. Но до этого еще далеко.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.09.2016, 17:51
Помогаю со студенческими работами здесь

работа с битами и условиями (как мне кажется задача несложная)
доброго времени суток. есть задача которую, как это нагло не звучит, нужно решить до утра. Как ни прискорбно я сам в Ассемблере почти не...

Работа с битами: как просмотреть и изменить заданный бит в переменной типа char?
Есть переменная типа char, как посмотреть в нем биты и изменять их?

может ли купленная мною GTX460 работать к примеру не как должна работать GTX460 а как видюха по хуже?
Ребята, помогите пожалуйста в таком вопросе! Взял видеокарту Gainward GTX460 1Gb GS, так как я не давно за компом и всех вещей не знаю,...

Как может сервер-сайд код работать или не работать на конкретном компе?
Всем привет! Вот такая проблема. Есть сайт, все работает ок, но - один из компов имеющий Win98 и IE6.0 and service pack 1 работает очень...

Как реализовать операцию "Исключающее или" между двумя битами Mcs-51
Добрый день. Подскажите как реализовать операцию &quot;Исключающее или&quot; между двумя битами, которые находятся в аккумуляторе , а результат этой...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru