我的程序向服务器发送了一个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/

10-11 21:26