gpt4 book ai didi

c++ - 如何访问数百万位进行散列

转载 作者:行者123 更新时间:2023-11-28 07:41:47 25 4
gpt4 key购买 nike

我正在对可执行文件进行 MD5 哈希处理。我已经使用 python 脚本将二进制文件从可执行文件读取到文本文件中,但是如果我将这个构造的文件读入 C 程序,我将处理 MB 的数据,因为 ones 和 zeroes 被视为chars,每1位取8位。是否可以将它们分别读取为单个位?如果我制作一个 10MB 的数组来保存二进制转换长度和散列填充可能需要的所有字符,程序的性能会有多糟糕?如果这是不可想象的,是否有更好的方法来操纵数据?

最佳答案

既然你标记了 C 和 C++ 问题,我会选择 C。

Would it be possible to read these in as single bits each?

是的,只需一次从文件中读取 8 个字节,然后将那些 10 连接起来形成一个新字节。您不需要为此制作 10MB 的阵列。

首先,从文件中读取 8 个字节。读取的 char 值将被转换为整数值(01),然后进行位移以生成一个新字节。

unsigned char bits[8];
while (fread(bits, 1, 8, file) == 8) {
for (unsigned int i = 0; i < 8; i++) {
bits[i] -= '0';
}

char byte = (bits[0] << 7) | (bits[1] << 6) |
(bits[2] << 5) | (bits[3] << 4) |
(bits[4] << 3) | (bits[5] << 2) |
(bits[6] << 1) | (bits[7] );

/* update MD5 Hash here */
}

然后,您将使用新读取的字节更新您的 MD5 哈希。


编辑:由于典型的 MD5 实现必须在处理之前将输入分成 512 位的 block ,因此您可以在实现本身中消除这种开销(尽管不推荐),并且只是从文件中读取 512 位(64 字节),然后直接更新哈希。

unsigned char buffer[64];
unsigned char bits[8];
unsigned int index = 0;

while (fread(bits, 1, 8, file) == 8) {
for (unsigned int i = 0; i < 8; i++) {
bits[i] -= '0';
}

buffer[index++] = (bits[0] << 7) | (bits[1] << 6) |
(bits[2] << 5) | (bits[3] << 4) |
(bits[4] << 3) | (bits[5] << 2) |
(bits[6] << 1) | (bits[7] );

if (index == 64) {
index = 0;
/* update MD5 hash with 64 byte buffer */
}
}

/* This sends the remaining data to the MD5 hash function */
/* It's not likely that your file has exactly 512N chars */
if (index != 0) {
while (index != 64) {
buffer[index++] = 0;
}
/* update MD5 hash with the padded buffer. */
}

关于c++ - 如何访问数百万位进行散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15709200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com