C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Вопрос к математикам, Алгоритм зашифровки RAW Key Windows
gen
Отправлено: 10.07.2004, 21:08


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Hi!

Вопрос к спецам прикладной математики.
Задача такова:
Есть код, в котором реализован алгоритм расшифровки 15 байтного
RAW Key, который соответсвует значению ProductKey мелкомягких
продуктов, хранящийся в двоичном параметре реестра DigitalProductId:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString Ts;
int cn,A,B;
unsigned short c,d;
for (int i = 25; i>0; i--)
{
A=0;
for (int i = 0; i < Memo1->Lines->Count; i++)
{
Ts=Trim(Memo1->Lines->Strings[i]);
B=Ts.ToInt();
A=A*IntPower(2,8)+B;
DivMod(A,24,c,d);
A=d;
Memo1->Lines->Strings[i]=IntToStr©;
}
ListBox1->Items->Add(ListBox2->Items->Strings[A]);
}
cn=0;
for (int i =ListBox1->Items->Count-1; i>=0 ; i--)
{
if (cn==5)
{
Edit2->Text=Edit2->Text+"-";
cn=0;
}
Edit2->Text=Edit2->Text+ListBox1->Items->Strings[i];
cn++;
}
}

Программа имеет на форме Edit1,Memo1,ListBox1,ListBox2 и Button1

ListBox1 — пустой (для промежуточних данных)
Memo1 содержит 15 сточек с зашифрованым кодом ProductKey (на этапе отладки в дясятичном формате):
0 205 218 23 177 239 187 82 181 117 252 69 149 250 111
ListBox2 содержит 25 строчек с символами для расшифрованого ProductKey (порядок обязательный):
B C D F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9
Приведенный пример соответствует коду ProductKey:
FFFFF-GGGGG-HHHHH-JJJJJ-KKKKK
Обработчик нажатия кнопки расшифровывает RAW Key, помещает полученные символы кода ProductKey в ListBox1, из которого они в цикле for (int i =ListBox1->Items->Count-1; i>=0 ; i--)
переносятся в удобном виде на Edit1.

Вопрос в следующем — как осуществить обратную операцию: из ProductKey (например FFFFF-GGGGG-HHHHH-JJJJJ-KKKKK) получить соответстующий код RAW (0 205 218 23 177 239 187 82 181 117 252 69 149 250 111)?

Буду весьма признателен за подсказку алгоритма решения.
Те, кого так или иначе зацепила проблема лицензирования продуктов
Micro$oft думаю тоже оценят.
PeroManiak
Отправлено: 12.07.2004, 03:30


Дежурный стрелочник

Группа: Участник
Сообщений: 71



QUOTE
Вопрос к спецам прикладной математики.

Шевелитесь! Тема интересная!

CODE
DivMod(A,24,c,d);

Что за зверь?

Отредактировано PeroManiak — 12/07/2004, 04:40
gen
Отправлено: 12.07.2004, 08:17


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Привет!

DivMod(A,24,c,d) — функция из Math: целочисленное деление А на 24,
c  — резельтат деления
d — остаток деления
PeroManiak
Отправлено: 12.07.2004, 18:54


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Что чилочисленное — мне подсказывает небольшой опыт Сопкаля, а вот в Math.hpp и в Math.h я этого не нашел sad.gif
Gedeon
Отправлено: 12.07.2004, 19:20


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (PeroManiak @ 12/07/2004, 19:56)
а вот в Math.hpp и в Math.h я этого не нашел sad.gif

Есть она родимая в math.hpp, возможно у Вас билдер не 6 т.к. в 6 есть в этом же math.hpp есть функция RoundTo(...) в 6, а вот в 5 нету, подозреваю тут нечто такое же.
2gen
Используйте тэги CODE ато совсем тяжело код читать.

Отредактировано Gedeon — 12/07/2004, 20:26
PeroManiak
Отправлено: 13.07.2004, 01:30


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Облом, у меня и впрям 5-й sad.gif
Оффтоп: а импортировать ее с 6-го нельзя?

Ой, не парьтесь — меня опять конкретно проколбасило: % ИБО, на поможет smile.gif

Отредактировано PeroManiak — 13/07/2004, 02:34
exp
Отправлено: 14.07.2004, 23:15


Мастер участка

Группа: Участник
Сообщений: 304



Хорошая новость: решение есть. скоро будет алгоритмизировано и выложено.
Новости никогда не приходят поодиночке, поэтому плохая новость: Существует неопределенность в ответе, связанная с потерей остатков от деления.

Отредактировано exp — 15/07/2004, 01:55
exp
Отправлено: 15.07.2004, 01:15


Мастер участка

Группа: Участник
Сообщений: 304



QUOTE

ListBox2 содержит 25 строчек с символами для расшифрованого ProductKey (порядок обязательный):
B C D F G H J K M P Q R T V W X Y 2 3 4 6 7 8 9

здесь 24 (!!!!) символа. Какой еще?

Отредактировано exp — 15/07/2004, 02:19
exp
Отправлено: 15.07.2004, 02:05


Мастер участка

Группа: Участник
Сообщений: 304



Держи.

User Attached Image Скачать файл
RAW_Decoding.zip


gen
Отправлено: 15.07.2004, 12:32


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Hi!

Да, это круто!
Извиняюсь за ошибку, в списке действительно 24 символа, а не 25.
Но есть одни грабли — алгоритм катит только для буквенных исходных кодов. Если в коде есть цифра, то получится что-то не то. Пока не разобрался почему именно цифры ... Будем копать дальше, но за верный путь спасибо!
exp
Отправлено: 15.07.2004, 22:45


Мастер участка

Группа: Участник
Сообщений: 304



А че не катит? Выкладывай.
gen
Отправлено: 16.07.2004, 09:40


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Hi!

Я проверял таким образом: во-первых добавил преобразование в HEX и перестановку кода в обратном порядке, т.е. в том виде, что и в DigitalProductId. Далее использовал утилиту KeyWiew

User Attached Image Скачать файл
Keywiew.exe


gen
Отправлено: 16.07.2004, 09:48


Дежурный стрелочник

Группа: Участник
Сообщений: 36



В дополнение к предыдущему.
В KeyWiew есть функция расшифровки RAW, использующая уже известный алгоритм. Вот ей я и скармливал полученый код RAW.
Преобразование в обе стороны получается только если в ProductKey содержатся только буквенные символы. При наличии цифр исходный ProductKey не получается. Сейчас, к сожалению, нет времени разобраться почему. Может в выходные подумаю.
Истина где-то рядом...
gen
Отправлено: 16.07.2004, 15:47


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Hi!

Нашел причину "пролета" цифр в Product Key.
Почему-то в случае цифры нужно дополнительно выполнять d--
Таким образом окончательный код будет (спасибо exp):

AnsiString ProductKey = Edit1->Text;
AnsiString DecodingString = "BCDFGHJKMPQRTVWXY12346789";
int RAWKey[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int A=0;
int d=0;
for(int i = 1; i<=ProductKey.Length(); i++)
{
d= DecodingString.Pos(ProductKey[i])-1;
if (d>=17)
{d--;}
for(int j = 14; j>=0; j--)
{
A= RAWKey[j];
A*= 24;
A+= d;
RAWKey[j] = A%256;
d= A/256;
}
}
AnsiString Otvet="";
for(int i=14; i>=0;i--) Otvet+=IntToHex(RAWKey[i],2)+"";
Edit2->Text = Trim(Otvet);

Думаю тему можно считать закрытой.

Отредактировано gen — 16/07/2004, 16:51
exp
Отправлено: 16.07.2004, 21:33


Мастер участка

Группа: Участник
Сообщений: 304



Интересно, по каким соображениям можно было догадаться об этом d--
Шаманство какое-то. biggrin.gif

Отредактировано exp — 16/07/2004, 23:04
exp
Отправлено: 16.07.2004, 22:06


Мастер участка

Группа: Участник
Сообщений: 304



Не всегда наличие цифры приводит к ошибке.
Сначала создаю своей прогой RAW. И копирую в ту, что сделал по коду qen'а...


Присоединить изображение

Присоединить изображение

exp
Отправлено: 16.07.2004, 22:10


Мастер участка

Группа: Участник
Сообщений: 304



Запускаю прогу qen'а... Результаты совпадают
exp
Отправлено: 16.07.2004, 22:16


Мастер участка

Группа: Участник
Сообщений: 304



Прикрепить забыл smile.gif
Кстати, ошибка появляется при наличии 9-ки в ProductKey.
Различия в результатах преобразования скорее всего объясняются различными строками для кодировки ("BCDFGHJKMPQRTVWXY12346789")
Т.е. всегда нужно знать ключ преобразования, а он может быть различным sad.gif

Отредактировано exp — 16/07/2004, 23:22

Присоединить изображение

Присоединить изображение


Вернуться в Вопросы программирования в C++Builder