Как я вычисляю приблизительную энтропию небольшой строки?

Существует ли стандартный способ сделать это?

Поиск с помощью Google - "приближается, энтропийные" биты - раскрывает несколько научных работ, но я хотел бы просто найти блок псевдокода, определяющего приблизительную энтропию для данной строки битов произвольной длины.

(В случае, если это легче сказать чем сделать, и это зависит от приложения, мое приложение включает 16 320 битов зашифрованных данных (шифрованный текст). Но зашифрованный как загадка и не предназначенный, чтобы быть невозможным расколоться. Я думал, что сначала проверю энтропию, но не мог легко найти хорошее определение такого. Таким образом, это походило на вопрос, который должен быть на StackOverflow! Идеи для того, где начать с расшифровки 16k случайно кажущиеся биты, также приветствуются...),

См. также этот связанный вопрос:
Каково определение информатики энтропии?

42
задан Community 23 May 2017 в 12:09
поделиться

4 ответа

Я считаю, что ответ - это Колмогоровская сложность строки. На этот вопрос не только нельзя ответить с помощью куска псевдокода, сложность Колмогорова не является вычислимой функцией!

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

11
ответ дан 26 November 2019 в 23:42
поделиться

Уравнение энтропии Шеннона является стандартным методом расчета. Вот простая реализация на Python, беззастенчиво скопированная из кодовой базы Revelation и, следовательно, имеющая лицензию GPL:

import math


def entropy(string):
        "Calculates the Shannon entropy of a string"

        # get probability of chars in string
        prob = [ float(string.count(c)) / len(string) for c in dict.fromkeys(list(string)) ]

        # calculate the entropy
        entropy = - sum([ p * math.log(p) / math.log(2.0) for p in prob ])

        return entropy


def entropy_ideal(length):
        "Calculates the ideal Shannon entropy of a string with given length"

        prob = 1.0 / length

        return -1.0 * length * prob * math.log(prob) / math.log(2.0)

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

20
ответ дан 26 November 2019 в 23:42
поделиться

Не существует единого ответа. Энтропия всегда соотносится с некоторой моделью. Когда кто-то говорит о том, что пароль имеет ограниченную энтропию, он имеет в виду "относительно способности интеллектуального злоумышленника предсказать", и это всегда верхняя граница.

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

Однако есть несколько довольно общих моделей, которые вы можете попробовать; они называются алгоритмами сжатия. Если gzip может хорошо сжимать ваши данные, то вы нашли по крайней мере одну модель, которая может хорошо их предсказать. А gzip, например, в основном нечувствителен к простым заменам. Он может справиться с часто встречающимся в тексте "wkh" так же легко, как и с "the".

8
ответ дан 26 November 2019 в 23:42
поделиться

Энтропия - это свойство не той строки, которую вы получили, а тех строк, которые вы могли бы получить вместо нее. Другими словами, она определяет процесс, с помощью которого была получена строка.

В простом случае вы получаете одну строку из набора N возможных строк, где каждая строка имеет такую же вероятность быть выбранной, как и все остальные, т.е. 1/N. В такой ситуации говорят, что строка имеет энтропию N. Энтропия часто выражается в битах, что является логарифмической шкалой: энтропия "n бит" - это энтропия, равная 2n.

Например: Мне нравится генерировать свои пароли в виде двух строчных букв, затем двух цифр, затем двух строчных букв и, наконец, двух цифр (например, va85mw24). Буквы и цифры выбираются случайно, равномерно и независимо друг от друга. Этот процесс может привести к созданию 26*26*10*10*26*26*10*10 = 4569760000 различных паролей, и все эти пароли имеют равные шансы быть выбранными. Энтропия такого пароля равна 4569760000, то есть около 32,1 бита.

31
ответ дан 26 November 2019 в 23:42
поделиться
Другие вопросы по тегам:

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