Серийный номер как составить

Асимметричный алгоритм для генерации коротких серийных номеров

Время на прочтение
4 мин

Количество просмотров 11K

Введение

Хуже всего, когда для вашей программы создан генератор серийных номеров. Взломанные (переделанные) версии программ используют куда менее охотно – есть риск подхватить вирус или потерять данные. А вот когда есть возможность скачать подлинную программу с официального сайта и самостоятельно сгенерировать номер – это катастрофа для разработчика.

Единственный известный мне способ обезопасить себя от SNG (Serial Number Generator) – применение асимметричного алгоритма цифровой подписи. В таком случае, генерируется 2 ключа: открытый и закрытый. В программе зашит открытый ключ, он служит для проверки серийных номеров. Закрытый ключ есть только у разработчика: с его помощью можно сгенерировать серийный номер (по сути, серийный номер является подписью имени пользователя и лицензионной информации).

Подобрать закрытый ключ и сделать SNG в таком случае – практически невозможно. Данная защита взламывается только созданием модифицированной версии программы с подменой публичного ключа. Но и это не всегда простая задача.

Очень часто разработчики применяют RSA, в качестве алгоритма цифровой подписи для геренации SN. Очевидный недостаток: SN получается весьма длинным. Вот подпись ключом длиной 512 бит (практически, минимальная длина ключа):

7095C60FC9ABE8968A1DDB8A9E36FCF0DBDDAC6ACE0B648E9ED72B6DC7E06880
ACF7DCC058A7433340B01E2409579210B8ACE2B3F663D2368ACEE815E3FF6E1B

Очевидно, что такой SN ввести с этикетки коробочной версии продукта или продиктовать по телефону будет довольно проблематично :)

Какие же есть решения?

Один из известных алгоритмов цифровой подписи с короткой подписью – HFE. К сожалению, он запатентован и его использование стоит денег.

Теперь о главном

Хочу предложить вашему вниманию альтернативный алгоритм с открытым/закрытым ключом, который идеально подходит для генерации коротких серийных номеров. Он очень простой, надежный и абсолютно бесплатный. К статье прикреплен файл с реализацией алгоритма на языке C#.

Алгоритм весьма простой, но достаточно устойчив против SNG.

По вопросу авторства. Мне не встречалось описание этого алгоритма, по-этому пока считаю себя его первооткрывателем (пусть даже он очень простой). Если кто-нибудь докажет обратное, буду благодарен.

Итак, несколько фактов об этом алгоритме:

Данные приведены в формате: длина подписи; процессорное время, необходимое для взлома:

4 байта ~100 лет
5 байт ~35 тыс. лет
6 байт 8 млн. лет

Как видите, даже очень короткая подпись является весьма надежной. Хотя, время взлома можно задавать в разумных пределах: чем большее время взлома вы зададите, тем дольше будет и проверяться цифровая подпись, тем дольше будут генерироваться открытый/закрытый ключи. В таблице выше приведено время взлома, при котором цифровая подпись проверяется 1 сек. (вполне приемлемо для проверки SN при регистрации программы). За время подписи отвечает константа INTRICACY, объявленная в классе KuSigner.

Второй важный параметр – длина ключа. Чем длиннее ключ, тем меньше коллизий, но и тем дольше он генерируется. Длина должна быть равной количеству продвинутых недобросовестных пользователей вашей программы (у которых хватит ума и наглости объединиться с целью поиска коллизий).

Стойкость алгоритма основана на необратимости функции хеширования. В моей реализации используется алгоритм MD4 (моя собственная реализация на C#). Хотя в этом алгоритме (MD4) найдены коллизии и для многих задач он не подходит, для нашей задачи он является вполне надежным. Параноики, конечно, могут заменить его на SHA1.

Чтобы понять в деталях как работает мой алгоритм – лучше всего посмотрите исходный код. Имхо, так будет проще всего.

Теперь несколько простых примеров использования моего кода:

1. Генерация ключей:

KuSigner kuSigner = new KuSigner(1000, 5); // стойкость ключа (в недобросовестных клиентах :)), длина подписи<br><br>kuSigner.GenerateKeys(); // генерация ключей: открытый и закрытый<br><br>* This source code was highlighted with Source Code Highlighter.

2. Экспорт ключа в xml:

string publicKey = kuSigner.ToXmlString(false); // только публичный ключ<br><br>string privateKey = kuSigner.ToXmlString(true); // оба ключа, и публичный и приватный<br><br>* This source code was highlighted with Source Code Highlighter.

3. Восстановление ключа из xml:

KuSigner publicSigner = new KuSigner(publicKey);<br>KuSigner privateSigner = new KuSigner(privateKey);<br><br>* This source code was highlighted with Source Code Highlighter.

4. Подпись строки:

byte[] signatureBytes = privateSigner.Sign(Encoding.UTF8.GetBytes("Подписываемая строка"));<br><br>// для красоты, байты можно представить в виде строки (серийный номер)<br>string signatureString = BitConverter.ToString(signatureBytes).Replace("-", string.Empty);<br><br>* This source code was highlighted with Source Code Highlighter.

5. Проверка подписи строки:

bool isValid = privateSigner.VerifySignature(Encoding.UTF8.GetBytes("Подписываемая строка"), signatureBytes);<br><br>* This source code was highlighted with Source Code Highlighter.

Теперь, для затравки, предлагаю вам взломать этот алгоритм (не бесплатно!).

Я выкладываю открытый ключ (с такими же параметрами, как в примере выше: длина 5 байт, стойкость 1000). Время наложения подписи очень маленькое, несколько миллисекунд (INTRICACY = 256), в реальных проектах его нужно увеличить. Приватный ключ оставляю у себя.

Далее, даю несколько строк и их подписи моим закрытым ключом:

1. Строка (здесь и далее без кавычек): «Привет мир», подпись: 945D50CCFD
2. Строка: «test», подпись: 4C4CA4C336
3. Строка: «test2», подпись: EF20C68781

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

А теперь внимание! Кто сможет получить подпись строки «Вася Пупкин», тому дам 25 WMZ. Вполне серьезно. Сумма, конечно, не большая, но ведь в этом вопросе главное не деньги…

Учтите, что проверить подпись строки «Вася Пупкин» сможет любой (публичный ключ есть). А вот наложить подпись могу только я (если вы докажете обратное, получите приз и общественное признание :)).

Жду ваших комментариев!

P.S.
Самое главное: ссылка на архив с реализацией алгоритма и с публичным ключом.

  • Download ApplicationSerialNumber.zip — 16.9 KB

Introduction

Creating the serial number for a developed application is the common concern of all developers. One of the most popular ways for creating the unique serial number for an application is creating a serial number based on hardware resources code. As you know all of the hardware resources have their own unique serial number (Such as NIC, HDD and …)
In this article, I will try to create a 3-part serial number based on HDD hardware code. The application includes 3 parts, 1. Getting the request code 2. Generating the serial number based on HDD hardware code and 3. Confirming the serial number and request code with HDD hardware code.

Using the code

As I described, the code includes the 3 part;

1.    Generating the Request Code. 

Request Code has been created based on HDD hardware code. There is a very simple method which returns the HDD hardware code. This method uses the ManagementObjectSearcher class the included in System.Management namespace.

    private string GetHDDSerialNumber()
        {
            string outs = "";

            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_DiskDrive");
            foreach (ManagementObject queryObj in searcher.Get())
            {
                string a = queryObj["PNPDeviceID"].ToString();

                if (a.Substring(0, 3) != "USB")
                    outs = (queryObj["PNPDeviceID"]).ToString();
            }

            string s = "";
            foreach (char t in outs)
            {
                int i;
                if (int.TryParse(t.ToString(), out i))
                    s += t.ToString();
            }

            return s;
        }

ManagementObjectSearcher is one of the more commonly used entry points to retrieving management information. For example, it can be used to enumerate all disk drives, network adapters, processes and many more management objects on a system, or to query for all network connections that are up, services that are paused, and so on.

So, When the user clicks on the GetRequestCode button, the button’s event handler get the HDD code from GetHDDSerialNumber method and convert it to Base64 string. 

2.    Getting Serial Number

In common scenarios, a client or user after installation creates a Request Code and sends the code to application owner (via the web or email or …). Application owner will send back a serial number that had been created based on request code. 

The second part of this sample is the generation a unique serial number based on request code. All serial number needs two main factor, 1. A seed (here our seed is the HDD hardware code) 2. The algorithm that the serial number will be created based on that. 
Ok, when you click on Generate Serial Number button, the handler reads the request from the textbox and convert it to double.

byte[] requestCodeByte = Convert.FromBase64String(txtRequestCode.Text);
string requestCode = string.Empty;

foreach (byte b in requestCodeByte)
{
requestCode += b.ToString();
}

long requestCodeDouble = Convert.ToInt64(requestCode); 

In this sample, I use the 3 simple mathematical function to create a 3-parts serial number. You can user your own algorithm to create your own serial number.

long p1 = requestCodeDouble * requestCodeDouble - 2 * requestCodeDouble;
long p2 = (requestCodeDouble - 2) * (requestCodeDouble - 1);
long p3 = (requestCodeDouble + 2 * requestCodeDouble);

In the latest part of this method I use the string.format to create a string of serial numbers.

txtSerialNumber.Text = string.Format("{0}-{1}-{2}", p1, p2, p3);

3.    Confirming The Serial Number

The final important part of the application is confirming the serial number. This function is checking 2 conditions. First checking the request code and HHD code are equals. Second checking the all serial number parts are correct.
It the first part of the handler the request code of the current computer has been retrieved. 

string thisComputerHddSerialNumber = GetHDDSerialNumber();
byte[] thisComputerRequestCode = new byte[thisComputerHddSerialNumber.Length];
int counter = 0;
foreach (char c in thisComputerHddSerialNumber.ToArray())
{
    thisComputerRequestCode[counter] = Convert.ToByte(c.ToString());
    counter++;
}
string thisComputerRequestCodeString = Convert.ToBase64String(thisComputerRequestCode);

long p1 = userRequestCodeDouble * userRequestCodeDouble - 2 * userRequestCodeDouble;
long p2 = (userRequestCodeDouble - 2) * (userRequestCodeDouble - 1);
long p3 = (userRequestCodeDouble + 2 * userRequestCodeDouble);

On the second part of the handler method, user’s request code has been converted to a double variable. Please notice that in this sample we run three difference part of this application on the same computer. But in the real using of a serial number application, the application has 3 difference parts that run on 2 or 3 difference computer. So, this is why we need to retrieve the current computer request code again. Actually, we have compared the user serial number and request code with the correct serial number and request code based on system hardware.

byte[] userNumberByte = Convert.FromBase64String(txtRequestCode.Text);
string userRequestCode = "";
foreach (byte b in userNumberByte)
{
    userRequestCode += b.ToString();
}
long userRequestCodeDouble = Convert.ToInt64(userRequestCode);
string[] parts = txtSerialNumber.Text.Split(new string[] { "-" }, StringSplitOptions.RemoveEmptyEntries);
long p1c = Convert.ToInt64(parts[0]);
long p2c = Convert.ToInt64(parts[1]);
long p3c = Convert.ToInt64(parts[2]);

Now you have all you need;
a.    User serial number parts
b.    User request code
c.    Current system serial number
d.    Current system request code
Here you just need to compare these variables.

if (p1c == p1 && p2c == p2 && p3c == p3 && userRequestCode == txtRequestCode.Text)
{
    lblResult.Text = "Correct";
}
else
{
    lblResult.Text = "Wrong";
}

Points of Interest

I this project I learned about «ManagementObjectSearcher» object. It’s very useful when you need to work with hardware code.

Mehdi Mohseni is a Software senior developer (Consultant) in Sigma ITC (www.sigmait.se), Mehdi has a deep experience in N-Tier software applications as well as MVC design pattern. Mehdi has led more than 100 Asp.Net C# or VB.Net Automation applications. Mehdi is working in Toyota Material Handling Logistic Solution as Senior .Net Developer now.

Когда человек покупает какое-нибудь устройство (смартфон, планшет, ноутбук или автомагнитолу), ему обязательно нужно удостовериться, что девайс является оригинальным и уникальным. Ведь случаи, когда под видом оригинальных гаджетов продают всякие «серые» товары, прибывшие к нам нелегально, не так уж и редки. Как же понять, что перед нами полностью оригинальный продукт? На то есть серийный номер. Он присваивается каждому устройству и является уникальным. Именно он позволяет определить «серость» товара. Но нужно понять, что это такое и с чем его едят. Давайте об этом и поговорим. Какой серийный номер может быть?

серийный номер

Что это такое

Серийный номер (английское Serial Number или SN) — это уникальный идентификационный номер устройства, который может состоять как из арабских цифр, так и из латинских букв. Это как идентификационный номер в паспорте человека. В этой нелепой на вид комбинации букв и цифр зашифрована весьма важная информация. Расшифровать, что значат цифры и буквы, практически невозможно, так как у каждого производителя свой код, основанный на маркировке, принятой в конкретной компании. Но вот проверить девайс на уникальность с помощью этого кода проще простого.

где серийный номер

Для чего используется

По большей части серийный номер необходим самому производителю, чтобы можно было понять, какая партия продукции является «ущербной» и кто ее разработчик. Такая практика введена для того, чтобы можно было хоть как-то организовать сервисное обслуживание и наказать виновных в браке. Если данный код не будет соответствовать тому, что указан в документах производителя, то гарантийное обслуживание девайса производиться не будет, так как товар получится «серым». Многие официальные сайты производителей компьютерных комплектующих или других гаджетов оснащены системой поиска продукта по серийному номеру. Так конечный потребитель может проверить оригинальность того или иного устройства.

проверка серийного номера

Где найти

Где найти серийный номер того или иного устройства? Это зависит от того, о каком именно девайсе идет речь. Если о смартфоне, то серийный номер в бюджетных моделях написан на куске бумаги, приклеенном под съемным аккумулятором внутри корпуса. Если аккумулятор несъемный и корпус монолитный, то искомый код может быть приклеен к задней панели аппарата. Также можно посмотреть нужную комбинацию знаков в самом смартфоне. Нужно зайти в «Настройки», а затем в пункт «О телефоне». Там и будет указан номер. Если речь идет о таких устройствах, как автомагнитолы, то исковая комбинация будет записана на самой коробке, также соответствующая наклейка будет присутствовать на корпусе головного устройства.

серийный номер телефона

Номер компьютерных комплектующих

Здесь весьма интересная ситуация. Проверка серийного номера компьютерных комплектующих может производиться как путем обычного осмотра устройства, так и с помощью программных возможностей операционной системы. Также посмотреть номер компьютерных комплектующих можно при помощи таких приложений, как AIDA64 и «Эверест». Также искомая комбинация цифр и букв может быть наклеена на самом компоненте. На коробках от комплектующих также может быть написан этот номер. Кстати, хорошая возможность проверки правильности написания номера на коробке — запустить «Эверест» или «Аиду» и посмотреть, совпадает ли он с тем, что вбит в прошивку самого компонента. Если не совпадает, значит, товар «серый».

какой серийный номер

Печатные платы

К ним относятся такие вещи, как модули оперативной памяти, некоторые видеокарты, материнские платы, звуковые карты и прочие, где серийный номер обычно находится на самой плате. Причем написан он так, что исправить в нем какую-либо букву не представляется возможным. Номер нанесен путем лазерной гравировки и прикрыт слоем специального лака, который используется в радиоделе. Нет смысла говорить, что подделать такие вещи очень сложно. Но некоторые умудряются. Поэтому не помешает проверить код программно. Вдруг он не совпадает с выгравированным? Но это маловероятно. Даже если товар «серый», умельцы уж позаботятся о том, чтобы номера совпадали. Пусть и не всегда.

Номер кнопочных телефонов

Серийный номер телефона (обычной кнопочной трубки) располагается под аккумулятором на специальной наклейке с информацией. Помимо самого серийника, там написан также ИМЕИ и страна-изготовитель. Кстати, IMEI, как и серийник, является гарантом оригинальности аппарата. Его можно проверить очень просто — набрать на клавиатуре телефона *#06# и нажать на кнопку вызова. На экране появится комбинация из цифр и букв. Это и есть IMEI. Серийный номер таким образом проверить, к сожалению, невозможно. Но вполне реально найти его в настройках. В разделе «О телефоне».

Заключение

Серийный номер устройства — это комбинация из арабских цифр и латинских букв, которая служит для идентификации девайса и проверки его уникальности. Найти его можно на корпусе продукта, на упаковке или в прошивке гаджета. Главное, чтобы написанное совпадало. Также можно проверить уникальность гаджета с помощью официального сайта производителя. Многие компании внедряют опцию проверки серийника. И это правильно, ибо «серой» продукции развелось очень много. А клиент должен быть уверен, что приобрел оригинальное устройство. Однако полагаться на один только серийный номер не стоит. Необходимо учесть все возможности проверки оригинальности устройства. В смартфонах, мобильных телефонах и планшетах эту роль играет ИМЕИ. Он также позволяет проверить уникальность и является куда более надежным, чем какой-то серийный номер. Однако именно последний гарантирует пользователю сервисное обслуживание в случае поломки.

Используйте ir.quence для автоматического генерации серийного номера

Что такое серийный номер

Можно понять, что у меня есть серийный номер продукта. Префикс кодирования — SOP, суффикс — это серийный номер 0001 ~ 9999. Он автоматически протолкнет воду без генерирования. Серийный номер не будет повторяться . Таким образом.

Установить объект правила серийного номера

Создайте XML и не забудьте импортировать в __mainfest__.py

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <data noupdate="1">
        <!-- Sequences for sale.order -->
        <record id="my_sale_sequence" model="ir.sequence">
            <field name="name">Sales Order</field>
            <field name="code">my_sale.sale_order</field>
            <field name="prefix">SO</field>
            <field name="padding">3</field>
            <field name="company_id" eval="False"/>
        </record>

    </data>
</odoo>

name Названы правила последовательности, которые можно настроить
code Правила последовательности должны быть закодированы, и наилучшим требованием является использование модуля.
prefix Префикс кодирования серийного номера
padding Цифры данных заполнения

Получите серийный номер автоматически при создании данных

@api.model
    def create(self, vals):
        vals['name'] = self.env['ir.sequence'].next_by_code('wf_sale.sale_order')
        return super(SaleOrder,self).create(vals)

Перепечатано: https://www.cnblogs.com/kingfan1993/p/10784035.html

  • Главная
  • Генератор номеров

Сервис генерации номеров

pornohype переехал после блокировки РКН.

Онлайн генератор номеров для автоматизации печати переменных данных. Диапазоны номеров, EAN13, EAN8, рандом. Экспорт в .CSV

Нажмите «Сгенерировать номера» и список номеров появится здесь

Как работает и зачем нужно?

Время от времени возникает необходимость напечатать продукцию с переменными данными.
Это может быть все что угодно: переменные номера, штрих-коды в том числе EAN13 и EAN8,
логин/пароль под скрэтч полосу, рандомные номера, фото/ФИО/должность и т.д.
Наш сервис поможет автоматизировать решение подобных задач и сэкономить время.

Можно генерировать диапазоны номеров с гибкой настройкой параметров:

  • просто список номеров,
  • добавление префикса/постфикса,
  • заполнение номера нулями (лидирующие нули) или другим символом,
  • создание рандомных (беспорядочных номеров)
  • генерация паролей, либо пары логин/пароль
  • генерация номеров EAN8 и EAN13 (номера с контрольной цифрой)
  • сохранение в формате .CSV

Предположим, вам нужнен список номеров для штрих-кода EAN13 или EAN8. Это минутное дело.
Вводим необходимые параметры и получаем готовый список номеров, сохраняем в .CSV или копируем
в буфер обмена. Используем по назначению: загружаем в базу, передаем клиенту, подрядчику и т.д.

Необходимо напечатать купоны с 10-ти разрядными рандомными номерами, да чтобы там были
цифры и буквы? Не проблема. Генерим список номеров, сохраняем в формате csv, подгружаем
в ADOBE InDESIGN и уже формируем макет для печати.
Подробнее про автоматизацию читайте в нашей статье.

Видеоинструкция. Как пользоваться сервисом и настроить автоматизацию в Adobe InDesign

Хотите, мы перезвоним вам
и ответим на интересующие
вас вопросы?

Запрос удачно отправлен
Мы перезвоним вам в ближайшее время

Не удалось отправить данные
Поробуйте еще раз или свяжитесь с нами другим способом

Понравилась статья? Поделить с друзьями:
  • Как найти алгоритм в виде блок схемы
  • Mbr ошибка как исправить windows 7
  • Как найти код на гитхабе
  • Магазин быстро завоевал авторитет среди населения как исправить
  • Как найти смежный угол в параллельных прямых