Java hashcode brute-forcing [duplicate]

Метод, показанный ниже, позволяет запускать определенный макрос Excel из командного файла, он использует переменную окружения для передачи имени макроса из пакета в Excel.

Поместите этот код в командный файл (используйте ваши пути к EXCEL.EXE и к книге):

Set MacroName=MyMacro
"C:\Program Files\Microsoft Office\Office15\EXCEL.EXE" "C:\MyWorkbook.xlsm"

Поместите этот код в Excel VBA ThisWorkBook Object:

Private Sub Workbook_Open()
    Dim strMacroName As String
    strMacroName = CreateObject("WScript.Shell").Environment("process").Item("MacroName")
    If strMacroName <> "" Then Run strMacroName
End Sub

И поместите свой код в модуль Excel VBA, как показано ниже:

Sub MyMacro()
    MsgBox "MyMacro is running..."
End Sub

Запустить командный файл и получить результат:

В случае, если вы не собираетесь запустите любой макрос, просто поместите пустые значения Set MacroName= в пакет.

7
задан Richard J. Ross III 13 June 2011 в 19:27
поделиться

5 ответов

Это невозможно. Хэш-код для String является с потерями; многие значения String приведут к тому же хэш-коду. Целое число имеет 32 битовые позиции, и каждая позиция имеет два значения. Невозможно сопоставить даже 32-символьные строки (например) (каждый символ имеет множество возможностей) в 32 бита без коллизий. Они просто не подходят.

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

5
ответ дан Ted Hopp 19 August 2018 в 01:18
поделиться
  • 1
    Тогда есть другой способ, который я мог бы использовать? Какой тип кодирования? – Richard J. Ross III 13 June 2011 в 19:33
  • 2
    @Richard, Base 10 - кодировка, которую вы используете. – Vineet Reynolds 13 June 2011 в 19:35
  • 3
    @Richard Что вам нужно - это шифрование / дешифрование. – Marcelo 13 June 2011 в 19:35
  • 4
    @Marcelo, любые предложения о том, какое шифрование использовать? – Richard J. Ross III 13 June 2011 в 19:36
  • 5
    Я не могу поверить, насколько бессмысленна эта идея использования шифрования. Как, на самом деле, кто-нибудь может восстановить бесконечно длинное сообщение из шифрованного текста, ограниченного 32-битами? – Vineet Reynolds 13 June 2011 в 19:44

Невозможно, я боюсь. Подумайте об этом, hashcode - это длинное значение, то есть 8 байтов. Строка может быть меньше, чем это, но также может быть намного длиннее, вы не можете сжать более длинную строку в 8 байтов, не теряя что-то.

Алгоритм hashcode Java суммирует каждый 8-й байт, если я правильно помню, чтобы вы потеряли 7 из 8 байт. Если ваши строки очень короткие, вы можете кодировать их как int или long, не теряя ничего.

2
ответ дан Andrew 19 August 2018 в 01:18
поделиться

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

log_70{2^32} = 5.22...

Это означает, что для любого заданного целого вы найдете 5 или 6-символьная строка с этим в качестве хеш-кода. Итак, извлечение "Hello World": невозможно; но "Hello" может работать, если вам повезет.

0
ответ дан Cephalopod 19 August 2018 в 01:18
поделиться
  • 1
    По-видимому, за очень немногими исключениями, все английские слова сопоставляются с отдельным номером в операции хэш-кода Java. Поэтому, если у вас есть хеш одного слова, вы можете пройти через словарь, проверяющий хэш-коды, и иметь очень высокую вероятность восстановления исходного слова. – Jules 11 December 2013 в 18:02
  • 2
    Действительно интересная находка. Увы, вопрос подразумевает сохранение произвольной строки или, по крайней мере, последовательности нескольких слов. – Cephalopod 12 December 2013 в 16:01

Например, «1019744689» и «123926772» имеют хэш-код -1727003481. Это доказывает, что для любого целого числа вы можете получить другой результат (т. Е. reversehashcode(hashcode(string)) != string).

0
ответ дан HyperNeutrino 19 August 2018 в 01:18
поделиться

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

4
ответ дан JustinKSU 19 August 2018 в 01:18
поделиться
  • 1
    Тогда есть другой способ, который я мог бы использовать? Какой тип кодирования? – Richard J. Ross III 13 June 2011 в 19:33
  • 2
    Вы можете зашифровать его. – JustinKSU 13 June 2011 в 19:34
  • 3
    Или вы можете сжать его. & Quot; Индекс & Quot; Строка с использованием java.util.zip – JustinKSU 13 June 2011 в 19:57
  • 4
    Ни шифрование, ни сжатие не разрешат его проблему, указанную в вопросе. Это не магические термины, которые нужно решить, что является по существу проблемой, связанной с потерей данных. – Vineet Reynolds 13 June 2011 в 20:08
Другие вопросы по тегам:

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