如何将十六进制文件读入numpy数组

2024-10-01 09:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想加载下面的十六进制文件

1)在第一行初始化值(IV),
2) 第二行的加密键,
3) 第三行的纯文本数,以及
4) 密码块链(CBC)模式下AES加密的实际明文

进入numpy数组。在

6bce1cb8d64153f82570751b6653c943
b15a65475a91774a45106fbc28f0df70
10
f493befb2dcad5118d523a4a4bf4a504
54fc4e0a82ae8dc56cc7befc9994b79d
878d287647b457fd95d40691b6e0c8ab
dc0adc16665eb96a15d3257752ae67dc
8cda3b8f23d38e9240b9a89587f69970
e06301763146c1bac24619e61015f481
c19def2f12e5707d89539e18ad104937
048d734a1a36d4346edc7ceda07ff171
5e621ce0a570478c1c2ec3e557ca3e0d
e55c57b119ff922b7f87db0ead2006cd

如果文件的一致性困扰着你,你可以忽略第三行,它告诉你要加密的纯文本的数量。除第三行外,所有行都是128位十六进制条目

其思想是将这个文件加载到numpy数组中,然后高效地进行AES加密。在

如何将其加载到numpy数组中,然后从中使用AES密码密码对这个文件和类似文件进行AES加密。我有这种格式的文件有多达一亿的纯文本。在

谢谢,如果你有任何问题请告诉我


Tags: 文件文本numpy密码模式数组aescbc
1条回答
网友
1楼 · 发布于 2024-10-01 09:30:51

我假设您希望取消数据的加密,并将结果bytestrings存储为固定长度的字符串,而不是object。(不能将它们存储为某种int128类型,因为numpy没有这样的类型。)

为了避免将3.2GB的文本读入内存,并使用大致相同的预处理量将其预处理为所需的格式,您可能需要使用fromiter,因此:

with open(myfile) as f:
    iv = binascii.unhexlify(f.readline().strip())
    key = binascii.unhexlify(f.readline().strip())
    count = int(f.readline())
    a = np.fromiter((binascii.unhexlify(line.strip()) for line in f), dtype='|S16')

如果您有10GB的RAM可供使用(粗略估计),那么将整个内容作为arrayarray读取,然后转换两次……但我对此表示怀疑。在


至于这是否有帮助…你可能会得到一点好处,因为AESING16字节可能足够快,迭代的成本是显而易见的。让我们来测试一下。在

在64位macpython2.7.2中,我通过反复复制示例创建了一个100000个s16的数组。然后:

^{pr2}$

所以,这几乎节省了25%。不错。在

当然,构建数组所需的时间比将内容放在迭代器中要长,但即使考虑到这一点,性能仍有9%的提高。在你的用例中,用1.6GB来换取9%的加速是合理的。在

请记住,我只是在一个预先存在的100K列表中构建一个100K对象的数组;在磁盘上读取100M个对象时,I/O可能会成为一个严重的因素,而且迭代处理(允许您将CPU开销与磁盘等待时间交错)可能会做得更好。在

换句话说,您需要使用自己的真实数据和场景进行测试。但你已经知道了。在


对于更广泛的实现,使用简单的perf测试框架,请参见this pastebin。在

你可以尝试结合不同的方法。例如,您可以使用来自itertoolsgrouper配方,一次批处理32K个纯文本,然后用numpy处理每一批,以获得两者的最佳效果。然后pool.imap进行numpy处理,以获得所有3个的最佳结果。或者,也可以将一个大的numpy数组放入共享内存,并使每个多处理任务处理该数组的一个片段。在

相关问题 更多 >