使用Python计算HTTP头的Shannon熵.怎么做?

Lau*_*uza 10 python entropy python-2.7 python-3.x

香农熵是:

香农

\r\n\r\n is the end of a HTPP header:
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

不完整的HTTP标头:

不完整的HTTP标头

我有一个PCAP格式的网络转储(dump.pcap),我试图 使用Python 计算HTTP协议中包含\r\n\r\n 和不包含数据包的数量的熵\r\n\r\n并比较它们.我用以下方法读取数据包:

import pyshark

pkts = pyshark.FileCapture('dump.pcap')
Run Code Online (Sandbox Code Playgroud)

我认为Ti在shannon公式中是我的转储文件的数据.

dump.pcap:https://uploadfiles.io/y5c7k

我已经计算了IP号的熵:

import numpy as np
import collections

sample_ips = [
    "131.084.001.031",
    "131.084.001.031",
    "131.284.001.031",
    "131.284.001.031",
    "131.284.001.000",
]

C = collections.Counter(sample_ips)
counts = np.array(list(C.values()),dtype=float)
#counts  = np.array(C.values(),dtype=float)
prob    = counts/counts.sum()
shannon_entropy = (-prob*np.log2(prob)).sum()
print (shannon_entropy)
Run Code Online (Sandbox Code Playgroud)

任何的想法?是否有可能计算与HTTP协议的分组的数目的熵\r\n\r\n 和没有\r\n\r\n在头或它是一个无义想法?

转储的几行:

wireshark的HTTP过滤器

 30 2017/246 11:20:00.304515    192.168.1.18    192.168.1.216   HTTP    339 GET / HTTP/1.1 


    GET / HTTP/1.1
    Host: 192.168.1.216
    accept-language: en-US,en;q=0.5
    accept-encoding: gzip, deflate
    accept: */*
    user-agent: Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Firefox/45.0
    Connection: keep-alive
    content-type: application/x-www-form-urlencoded; charset=UTF-8
Run Code Online (Sandbox Code Playgroud)

eSu*_*ake 3

虽然我不明白你为什么要这样做,但我不同意其他人认为这是荒谬的。

例如,你可以拿一枚硬币,翻转它,然后测量它的熵。假设你翻转 1,000 次,得到 500 个正面和 500 个反面。即每个结果的频率为 0.5,或者统计学家正式称之为“事件”。

现在,由于两个 Ti 相等 (0.5),并且 0.5 的对数底数 2 为 -1,因此硬币的熵为 -2 *(0.5 * -1) = -1(负 2 是负号)前面并认识到两个相同的东西相加与乘以 2 相同。

如果硬币正面朝上的频率是反面朝上的 127 倍怎么办?现在出现尾部的概率为 1/128,其对数底数为 2,为 -7。因此,-7 乘以 1/128(粗略地)得到的贡献约为 1/32。正面的概率非常接近 1。但是 1 的以 2 为底的对数(或任何基数)为零。所以该项的值大约为零。因此,记住减号(如果我在脑子里做对的话),那枚硬币的熵约为 -1/32。

因此,你的技巧是收集大量随机消息,并将它们计入两个桶中。然后按照上面的方法进行计算即可。

如果您询问如何进行计数,并且计算机上有这些,则可以使用 grep(unix 上的正则表达式工具)等工具或其他系统上的类似实用程序。它会为您排序。