计算 pickle 文件的熵
Compute entropy of a pickle file
我正在研究 ISCXVPN2016 dataset,它由一些 pcap 文件组成(每个 pcap 都是捕获特定应用程序(如 skype、youtube 等)的流量),我已将它们转换为 pickle 文件然后使用以下代码将它们写入文本文件:
pkl = open("AIMchat2.pcapng.pickle", "rb")
with open('file.txt', 'w') as f:
for Item in pkl:
f.write('%s\n' %Item)
file.txt:
b'\x80\x03]q\x00(cnumpy.core.multiarray\n'
b'_reconstruct\n'
b'q\x01cnumpy\n'
b'ndarray\n'
b'q\x02K\x00\x85q\x03C\x01bq\x04\x87q\x05Rq\x06(K\x01K\x9d\x85q\x07cnumpy\n'
b'dtype\n'
b'q\x08X\x02\x00\x00\x00u1q\tK\x00K\x01\x87q\n'
b'Rq\x0b(K\x03X\x01\x00\x00\x00|q\x0cNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\rb\x89C\x9dE\x00\x00\x9dU\xbc@\x00\x80\x06\xd7\xc9\x83\xca\xf0W@\x0c\x18\xa74I\x01\xbb\t].\xc8\xf3*\xc51P\x18\xfa[)j\x00\x00\x17\x03\x02\x00p\x14\x90\xccY|\xa3\x7f\xd1\x12\xe2\xb4.U9)\xf20\xf1{\xbd\x1d\xa3W\x0c\x19\xc2\xf0\x8c\x0b\x8c\x86\x16\x99\xd8:\x19\xb0G\xe7\xb2\xf4\x9d\x82\x8e&a\x04\xf2\xa2\x8e\xce\xa4b\xcc\xfb\xe4\xd0\xde\x89eUU]\x1e\xfeF\x9bv\x88\xf4\xf3\xdc\x8f\xde\xa6Kk1q`\x94]\x13\xd7|\xa3\x16\xce\xcc\x1b\xa7\x10\xc5\xbd\x00\xe8M\x8b\x05v\x95\xa3\x8c\xd0\x83\xc1\xf1\x12\xee\x9f\xefmq\x0etq\x0fbh\x01h\x02K\x00\x85q\x10h\x04\x87q\x11Rq\x12(K\x01K.\x85q\x13h\x0b\x89C.E\x00\x00
我的问题是如何计算每个 pickle 文件的熵?
(我已经更新了问题)
一个天真的解决方案是 gzip/tar 文件。通过计算 (size-of-gzipped/tar-file)/(size-of-original) 作为随机性的度量来确定熵。
这个结果不准确,因为 gzip 和 tar 都不是 "ideal" 压缩器,但随着文件大小的增加,结果会更准确。
使用书面 python 代码来检查熵的一个不错的选择是:
http://code.activestate.com/recipes/577476-shannon-entropy-calculation/#c3
如果我没有做错这就是答案(基于How to calculate the entropy of a file? and Shannon entropy)。
#!/usr/bin/env python3
import math
filename = "random_data.bin"
with open(filename, "rb") as file:
counters = {byte: 0 for byte in range(2 ** 8)} # start all counters with zeros
for byte in file.read(): # read in chunks for large files
counters[byte] += 1 # increase counter for specified byte
filesize = file.tell() # we can get file size by reading current position
probabilities = [counter / filesize for counter in counters.values()] # calculate probabilities for each byte
entropy = -sum(probability * math.log2(probability) for probability in probabilities if probability > 0) # final sum
print(entropy)
在 Ubuntu 18.04 和 Python 3.6.9 上用 ent
程序检查:
$ dd if=/dev/urandom of=random_data.bin bs=1K count=16
16+0 records in
16+0 records out
16384 bytes (16 kB, 16 KiB) copied, 0.0012111 s, 13.5 MB/s
$ ent random_data.bin
Entropy = 7.988752 bits per byte.
...
$ ./calc_entropy.py
7.988751920202076
也用文本文件进行了测试。
$ ent calc_entropy.py
Entropy = 4.613356 bits per byte.
...
$ ./calc_entropy.py
4.613355601248316
您可以使用 BiEntropy、Trientropy 或它们的附加 TriBientropy 来计算泡菜文件的熵。 www.arxiv.org 上描述了算法,BiEntropy 已在 Github 上通过测试工具实现。 BiEntropy 已在大型原始二进制文件上进行了积极测试
我正在研究 ISCXVPN2016 dataset,它由一些 pcap 文件组成(每个 pcap 都是捕获特定应用程序(如 skype、youtube 等)的流量),我已将它们转换为 pickle 文件然后使用以下代码将它们写入文本文件:
pkl = open("AIMchat2.pcapng.pickle", "rb")
with open('file.txt', 'w') as f:
for Item in pkl:
f.write('%s\n' %Item)
file.txt:
b'\x80\x03]q\x00(cnumpy.core.multiarray\n' b'_reconstruct\n' b'q\x01cnumpy\n' b'ndarray\n' b'q\x02K\x00\x85q\x03C\x01bq\x04\x87q\x05Rq\x06(K\x01K\x9d\x85q\x07cnumpy\n' b'dtype\n' b'q\x08X\x02\x00\x00\x00u1q\tK\x00K\x01\x87q\n' b'Rq\x0b(K\x03X\x01\x00\x00\x00|q\x0cNNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\rb\x89C\x9dE\x00\x00\x9dU\xbc@\x00\x80\x06\xd7\xc9\x83\xca\xf0W@\x0c\x18\xa74I\x01\xbb\t].\xc8\xf3*\xc51P\x18\xfa[)j\x00\x00\x17\x03\x02\x00p\x14\x90\xccY|\xa3\x7f\xd1\x12\xe2\xb4.U9)\xf20\xf1{\xbd\x1d\xa3W\x0c\x19\xc2\xf0\x8c\x0b\x8c\x86\x16\x99\xd8:\x19\xb0G\xe7\xb2\xf4\x9d\x82\x8e&a\x04\xf2\xa2\x8e\xce\xa4b\xcc\xfb\xe4\xd0\xde\x89eUU]\x1e\xfeF\x9bv\x88\xf4\xf3\xdc\x8f\xde\xa6Kk1q`\x94]\x13\xd7|\xa3\x16\xce\xcc\x1b\xa7\x10\xc5\xbd\x00\xe8M\x8b\x05v\x95\xa3\x8c\xd0\x83\xc1\xf1\x12\xee\x9f\xefmq\x0etq\x0fbh\x01h\x02K\x00\x85q\x10h\x04\x87q\x11Rq\x12(K\x01K.\x85q\x13h\x0b\x89C.E\x00\x00
我的问题是如何计算每个 pickle 文件的熵?
(我已经更新了问题)
一个天真的解决方案是 gzip/tar 文件。通过计算 (size-of-gzipped/tar-file)/(size-of-original) 作为随机性的度量来确定熵。
这个结果不准确,因为 gzip 和 tar 都不是 "ideal" 压缩器,但随着文件大小的增加,结果会更准确。
使用书面 python 代码来检查熵的一个不错的选择是:
http://code.activestate.com/recipes/577476-shannon-entropy-calculation/#c3
如果我没有做错这就是答案(基于How to calculate the entropy of a file? and Shannon entropy)。
#!/usr/bin/env python3
import math
filename = "random_data.bin"
with open(filename, "rb") as file:
counters = {byte: 0 for byte in range(2 ** 8)} # start all counters with zeros
for byte in file.read(): # read in chunks for large files
counters[byte] += 1 # increase counter for specified byte
filesize = file.tell() # we can get file size by reading current position
probabilities = [counter / filesize for counter in counters.values()] # calculate probabilities for each byte
entropy = -sum(probability * math.log2(probability) for probability in probabilities if probability > 0) # final sum
print(entropy)
在 Ubuntu 18.04 和 Python 3.6.9 上用 ent
程序检查:
$ dd if=/dev/urandom of=random_data.bin bs=1K count=16
16+0 records in
16+0 records out
16384 bytes (16 kB, 16 KiB) copied, 0.0012111 s, 13.5 MB/s
$ ent random_data.bin
Entropy = 7.988752 bits per byte.
...
$ ./calc_entropy.py
7.988751920202076
也用文本文件进行了测试。
$ ent calc_entropy.py
Entropy = 4.613356 bits per byte.
...
$ ./calc_entropy.py
4.613355601248316
您可以使用 BiEntropy、Trientropy 或它们的附加 TriBientropy 来计算泡菜文件的熵。 www.arxiv.org 上描述了算法,BiEntropy 已在 Github 上通过测试工具实现。 BiEntropy 已在大型原始二进制文件上进行了积极测试