我正在尝试编写一个证明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)
小智 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将包含二进制摘要,而不是十六进制表示 - 它不是一个字符串,不应该用作一个字符串.