如何在C编程中使用SHA1散列

spa*_*sen 27 c hash

我正在尝试编写一个证明SHA1几乎无冲突的C程序,但我无法弄清楚如何为我的输入值实际创建哈希.我只需要创建哈希值,并将十六进制值存储到一个数组中.经过一些Google搜索,我发现OpenSSL文档指示我使用它:

 #include <openssl/sha.h>

 unsigned char *SHA1(const unsigned char *d, unsigned long n,
                  unsigned char *md);

 int SHA1_Init(SHA_CTX *c);
 int SHA1_Update(SHA_CTX *c, const void *data,
                  unsigned long len);
 int SHA1_Final(unsigned char *md, SHA_CTX *c);
Run Code Online (Sandbox Code Playgroud)

我相信我应该使用unsigned char*SHA1或SHA1_Init,但我不确定参数是什么,因为x是我要输入的输入.有人请为我清楚这个吗?谢谢.

Ada*_*eld 49

如果您同时拥有所有数据,只需使用以下SHA1功能:

// The data to be hashed
char data[] = "Hello, world!";
size_t length = strlen(data);

unsigned char hash[SHA_DIGEST_LENGTH];
SHA1(data, length, hash);
// hash now contains the 20-byte SHA-1 hash
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您一次只获取一个数据,并且希望在接收数据时计算哈希值,则使用其他函数:

// Error checking omitted for expository purposes

// Object to hold the current state of the hash
SHA_CTX ctx;
SHA1_Init(&ctx);

// Hash each piece of data as it comes in:
SHA1_Update(&ctx, "Hello, ", 7);
...
SHA1_Update(&ctx, "world!", 6);
// etc.
...
// When you're done with the data, finalize it:
unsigned char hash[SHA_DIGEST_LENGTH];
SHA1_Final(hash, &ctx);
Run Code Online (Sandbox Code Playgroud)

  • 您需要链接OpenSSL运行时库.假设您正在使用gcc,请将`-lcrypto`添加到链接器命令行. (9认同)

小智 12

他们是实现同样目标的两种不同方式.

具体来说,您可以使用SHA_Init,然后SHA_Update根据需要多次传递数据,然后SHA_Final获取摘要,或者SHA1.

两种模式的原因是,当对大文件进行散列时,通常以块的形式读取文件,因为替代方案会占用大量内存.因此,随时跟踪SHA_CTX- SHA上下文 - 可以让您解决这个问题.该算法内部也适合这个模型 - 也就是说,数据一次在块中传递.

SHA方法应该相当简单.另一个是这样的:

unsigned char md[SHA_DIGEST_LENGTH];
SHA_CTX context;
int SHA1_Init(&context);

for ( i = 0; i < numblocks; i++ )
{
    int SHA1_Update(&context, pointer_to_data, data_length);
}
int SHA1_Final(md, &context);
Run Code Online (Sandbox Code Playgroud)

至关重要的是,最后md将包含二进制摘要,而不是十六进制表示 - 它不是一个字符串,不应该用作一个字符串.

  • @Clustermagnet hmacsha1是一个HMAC算法,使用SHA1作为哈希.这与我在这里的答案相同(见[here](http://www.openssl.org/docs/crypto/hmac.html))但是对于HMAC特有的`EVP_MD`参数,你指定`EVP_sha1() `. (2认同)