Реверс генератора

sarsmen

Помогите переписать(написать) обратный реверс, что бы из полученного получалось исходное. Спасибо.
4 ответа

sarsmen

Некто не поможет?


sarsmen

Теперь пройдемся по коду. Сам писал или у кого взял?
unsigned int notand(unsigned int a,unsigned int b)
{
    return (~a)&(~b);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    unsigned int code;
    unsigned int a1;
    unsigned int a2;
    unsigned int a3;
    unsigned int pcode;
    unsigned int m1;
    unsigned int m2;
    unsigned int t1;
    unsigned int zetcode;
 
    code=StrToInt(Edit1->Text);
    a1=notand(code,code);
    a2=notand(a1,0x532ec2a7);
    a3=notand(code,0xabd12d48);
    pcode=notand(a2,a3);
    m1=pcode*0x65bcd16;
    m1=((m1&0xffff0000)>>16)|((m1&0xffff)<<16);
    m2=m1*0x0dfb35d3;
    m2=m2%100000000;
    t1=notand(m2,m2);
    zetcode=0xffffffff-t1;
    Edit2->Text=zetcode;
}
Строго говоря, твоя задача в общем виде невыполнима. Операция получения остатка от деления % необратима. Хотя используются беззнаковые целые числа. Но тогда нет смысла в строке 26. Или как-то надо учитывать переполнение результатов некоторых операций?По поводу функции notand. Обратной операцией для ~ является она же (если не ошибаюсь). Если используется & и два операнда одинаковые, то результат - тот же самый операнд. Короче, пробуй проделать все действия в "обратном порядке" с учетом логики. А там может и другой "некто" подключится.


sarsmen

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


sarsmen

Большой вопрос, как из
pcode=notand(a2,a3);
получить a2 и a3, зная pcode.Набросок (см. комментарии):
    unsigned int code, a1, a2, a3, pcode, m1, m2, t1, zetcode;
 
    zetcode=StrToInt(Edit2->Text);
    t1=0xffffffff-zetcode;
    m2=notand(t1,t1);
 
    m1=m2/0x0dfb35d3;
    m1=((m1&0xffff0000)>>16)|((m1&0xffff)<<16);
    pcode=m1/0x65bcd16;
 
    // невозможно получить m2 из m2=m2%100000000, если m2 >= 100000000
 
    a2=notand(pcode,a3);
    a3=notand(pcode,a2);
    // тогда
    a2=notand(pcode,notand(pcode,a2));
    a3=notand(pcode,notand(pcode,a3));
    // и  нужно как-то выразить a2 или a3 через pcode
 
    code=notand(a3,0xabd12d48);  // есть вероятность переполнения
    a1=notand(a2,0x532ec2a7);  // здесь аналогично
    code=notand(a1,a1);
    Edit3->Text=code;
Требуется из
    a2=notand(pcode,notand(pcode,a2));
    a3=notand(pcode,notand(pcode,a3));
извлечь a2 и a3. Тут нужны мастера по битовым операциям. Мой мозг здесь требует добавить ему оперативки, но тип имеющейся памяти не подходит (нужно DDRsmart, а есть только DDRdumb).То есть проблема такова - решить задачу вида
x = (~y) & (~((~y) & (~x)))
(найти x, зная y)