我的程序向服务器发送了一个512KB的数据请求。为了检查数据完整性,它具有来自元信息文件的给定SHA1。我将把接收到的数据的SHA1与给定的SHA1进行比较,但是我认为出了点问题,因为缓冲区大小太大。
int main(int argc, char** argv)
{
char given_SHA1[20]; // assume that it has some value.
char received_buffer[524288]; // Assume that this holds 512KB data from a socket. does not make sense. it is too big.
char SHA1_received[20];
SHA1(received_buffer, SHA1_received); // SHA1_received will get SHA1 of 512KB data.
if(strcmp(SHA1_received, given_SHA1) == 0)
{
printf("received data is OK\n");
}
else
{
printf("error\n");
exit(0);
}
}
有没有其他方法可以执行此代码所做的工作,而不是将512KB缓冲区声明为局部变量?
最佳答案
可能您的问题只是分配缓冲区的问题之一。在这种情况下,您可以简单地执行以下操作:
#include <stdlib.h>
...
char *received_buffer;
received_buffer = (char*) malloc(524288 * sizeof(char));
使用完缓冲区后,请记住
free(received_buffer);
因此,您不必保留不再使用的内存(并且在多次循环遍历此代码的情况下,可以避免“内存泄漏”)。
作为替代解决方案,您可以按照http://www.openssl.org/docs/crypto/sha.html中给出的指示来处理消息片段(重复调用以处理整个消息-即处理较小的块):
SHA1()计算d和n处n个字节的SHA-1消息摘要
将其放置在md中(必须具有SHA_DIGEST_LENGTH == 20的空间
输出字节)。如果md为NULL,则摘要放置在静态
数组。
如果消息不完全,可以使用以下功能
存储在内存中:
SHA1_Init()初始化SHA_CTX结构。
SHA1_Update()可以与消息块一起重复调用
被散列(数据为len个字节)。
SHA1_Final()将消息摘要放置在必须有空间的md中
SHA_DIGEST_LENGTH == 20字节的输出,并擦除SHA_CTX。
应用程序应使用更高级别的函数EVP_DigestInit(3)
等,而不是直接调用哈希函数。
关于c - 如何从元信息文件中比较512KB数据的SHA1与给定的SHA1?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18080235/