Найти процесс конвертирования hex в десятичный, если известен / output [duplicate]

По вопросу «что мне делать с этим» может быть много ответов.

Более «формальный» способ предотвращения таких ошибок при разработке применяя дизайн по контракту в вашем коде. Это означает, что при разработке вы должны установить инварианты класса и / или даже предпосылки для функции и .

Короче говоря, инварианты класса гарантируют, что в вашем классе будут некоторые ограничения, которые не будут нарушены при нормальном использовании (и, следовательно, класс будет not получить в несогласованном состоянии). Предпосылки означают, что данные, данные как входные данные для функции / метода, должны соответствовать установленным ограничениям и никогда не нарушать их, а постулаты означают, что вывод функции / метода должен соответствовать установленным ограничениям снова не нарушая их. Условия контракта никогда не должны нарушаться во время выполнения программы без ошибок, поэтому дизайн по контракту проверяется на практике в режиме отладки, а отключен в выпусках , чтобы максимизировать развитую производительность системы.

Таким образом, вы можете избежать случаев NullReferenceException, которые являются результатом нарушения установленных ограничений. Например, если вы используете свойство объекта X в классе, а затем попытаетесь вызвать один из его методов, а X имеет нулевое значение, то это приведет к NullReferenceException:

public X { get; set; }

public void InvokeX()
{
    X.DoSomething(); // if X value is null, you will get a NullReferenceException
}

Но если вы установите «свойство X никогда не должно иметь нулевого значения» в качестве предпосылки для метода, вы можете предотвратить описанный ранее сценарий:

//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant () 
{
    Contract.Invariant ( X != null );
    //...
}

По этой причине Код Контракт существует для приложений .NET.

В качестве альтернативы дизайн по контракту может быть применен с использованием утверждений .

ОБНОВЛЕНИЕ: Стоит отметить, что этот термин был придуман Бертраном Майером в связи с его дизайном языка программирования Эйфеля .

6
задан Andrew Barber 13 November 2010 в 02:34
поделиться

4 ответа

Возможно ли вообще реконструировать такой алгоритм?

Возможно с использованием некорректного алгоритма и достаточно зашифрованных / незашифрованных пар, но хорошо разработанный алгоритм может исключить эту возможность вообще сделать.

0
ответ дан John 31 August 2018 в 17:26
поделиться

Удар в темноте приведет вас к безумию. Существуют некоторые алгоритмы, которые, учитывая текущее понимание, вы не могли надеяться вывести внутренние работы между теперь и [предсказанным] концом юниверса, не зная точную информацию (потенциально включая закрытые ключи или внутреннее состояние). Конечно, некоторые из этих алгоритмов являются основой современной криптографии.

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

7262627 -> 8172
7262628 -> 819
7262629 -> 1732
...
7262631 -> 3558

Здесь достаточно ясно (учитывая несколько минут и калькулятор), что при увеличении входа на 1, выход увеличивается на 913 по модулю 8266 (т. Е. Простой линейный конгруэнтный генератор ).

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

Другие способы приближения к этой проблеме состоят в том, чтобы посмотреть на крайности (максимальные, минимальные значения), распределение (приводящее к частотном анализе ), направление (числа всегда увеличиваются? ) и (если это разрешено) рассмотрим контекст, в котором были найдены наборы данных. Например, некоторые типы PIN-кодов всегда содержат повторенную цифру, чтобы облегчить их запоминание (я не говорю, что PIN-код может быть выведен из чего-либо другого - просто повторяющаяся цифра равна единице нет разряд беспокоиться!).

2
ответ дан SimonJ 31 August 2018 в 17:26
поделиться

Наверное, вы не можете. Предположим, что функция преобразования известна, что-то вроде

function hash(text):
    return sha1("secret salt"+text)

. Но «секретная соль» неизвестна и криптографически сильная (очень большое случайное целое число). Вы никогда не могли бы перетащить секретную соль из даже очень большого количества пар с открытым текстом, crypttext.

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

3
ответ дан SingleNegationElimination 31 August 2018 в 17:26
поделиться

Есть несколько вещей, которые люди пытаются попробовать:

  • Получить исходный код или дизассемблировать исполняемый файл.
  • Угадайте, основываясь на хэш-функциях, которые используют другие люди. Например, хэш, состоящий из 32 шестнадцатеричных цифр, может быть одним или несколькими повторениями MD5, и если вы можете получить одну пару входных / выходных данных, то это довольно легко подтвердить или опровергнуть (хотя см. «Соль» ниже) .
  • Статистически проанализировать большое количество пар входов и выходов, искать любые шаблоны или корреляции и связывать эти корреляции с свойствами известных хеш-функций и / или возможными операциями, которые разработчик системы возможно, использовали. Это выходит за рамки единой техники и в области общего криптоанализа.
  • Спросите автора. Защищенные системы обычно не полагаются на секретность алгоритмов хеширования, которые они используют (и обычно не остаются в безопасности, если они это делают). Однако примеры, которые вы даете, довольно малы, и безопасное хеширование паролей всегда будет включать соль, которой, по-видимому, нет. Поэтому мы могли бы не говорить о той системе, в которой автор уверен в этом.

В случае хэша, где вывод состоит всего из 4 десятичных цифр, вы можете атаковать его просто построив таблицу всех возможных 7-значных входов вместе со своим хешированным значением. Затем вы можете перевернуть таблицу, и у вас есть (один-ко-многим) де-хэширование. Вам никогда не нужно знать, как вычисляется хэш. Как вы получаете пары ввода / вывода? Ну, если аутсайдер может каким-то образом указать значение, которое нужно хэшировать, и увидеть результат, тогда у вас будет то, что называется «выбранным открытым текстом», а атака, основанная на этом, - это «выбранная атака открытого текста». Таким образом, 7-значный -> 4-значный хеш был бы очень слабым, если бы он использовался таким образом, который позволял выбранным атакам открытого текста генерировать много пар ввода / вывода. Я понимаю, что это всего лишь один пример, но это также всего лишь один пример метода для его отмены.

Обратите внимание, что обратное проектирование хэша и, фактически, его изменение, - это две разные вещи. Вы можете понять, что я использую SHA-256, но это не помогло бы вам отменить его (т. Е. Получить результат, выработать входное значение). Никто не знает, как полностью отменить SHA-256, хотя, конечно, всегда есть радужные таблицы (см. «Соль», выше). <conspiracy> По крайней мере, никто не признает, что они делают, так что это бесполезно для вас или меня. </conspiracy>

8
ответ дан Steve Jessop 31 August 2018 в 17:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: