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 | Вопрос к спецам прикладной математики. |
Шевелитесь! Тема интересная!
Что за зверь?
Отредактировано 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 я этого не нашел
|
|
Gedeon |
Отправлено: 12.07.2004, 19:20 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (PeroManiak @ 12/07/2004, 19:56) | а вот в Math.hpp и в Math.h я этого не нашел |
Есть она родимая в 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-й
Оффтоп: а импортировать ее с 6-го нельзя?
Ой, не парьтесь — меня опять конкретно проколбасило: % ИБО, на поможет
Отредактировано 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
|
Держи.
|
|
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
|
|
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--
Шаманство какое-то.
Отредактировано 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
|
Прикрепить забыл
Кстати, ошибка появляется при наличии 9-ки в ProductKey.
Различия в результатах преобразования скорее всего объясняются различными строками для кодировки ("BCDFGHJKMPQRTVWXY12346789")
Т.е. всегда нужно знать ключ преобразования, а он может быть различным
Отредактировано exp — 16/07/2004, 23:22
Присоединить изображение
|
|