c++ - 使用 OpenSSL 和 C++ 生成 sha256

标签 c++ unix openssl sha256

我正在寻找使用 openssl 和 C++ 使用 sha256 创建哈希。我知道 Generate SHA hash in C++ using OpenSSL library 有一个类似的帖子,但我希望专门创建 sha256。

更新:

包含路径似乎有问题。即使我包含了,它也找不到任何 OpenSSL 函数

#include "openssl/sha.h"

我将路径包含在我的构建中

-I/opt/ssl/include/ -L/opt/ssl/lib/ -lcrypto 

最佳答案

我是这样做的:

void sha256_hash_string (unsigned char hash[SHA256_DIGEST_LENGTH], char outputBuffer[65])
{
    int i = 0;

    for(i = 0; i < SHA256_DIGEST_LENGTH; i++)
    {
        sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
    }

    outputBuffer[64] = 0;
}


void sha256_string(char *string, char outputBuffer[65])
{
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, string, strlen(string));
    SHA256_Final(hash, &sha256);
    int i = 0;
    for(i = 0; i < SHA256_DIGEST_LENGTH; i++)
    {
        sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
    }
    outputBuffer[64] = 0;
}

int sha256_file(char *path, char outputBuffer[65])
{
    FILE *file = fopen(path, "rb");
    if(!file) return -534;

    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    const int bufSize = 32768;
    unsigned char *buffer = malloc(bufSize);
    int bytesRead = 0;
    if(!buffer) return ENOMEM;
    while((bytesRead = fread(buffer, 1, bufSize, file)))
    {
        SHA256_Update(&sha256, buffer, bytesRead);
    }
    SHA256_Final(hash, &sha256);

    sha256_hash_string(hash, outputBuffer);
    fclose(file);
    free(buffer);
    return 0;
}

它的名字是这样的:

static unsigned char buffer[65];
sha256("string", buffer);
printf("%s\n", buffer);

关于c++ - 使用 OpenSSL 和 C++ 生成 sha256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37126061/

相关文章:

c++ - 编译 Qt hello World 时对 vtable 的 undefined reference

c# - P/Invoke c# 和 native c++

linux - 环境变量不可用于 shell 脚本中的下一个命令

c - 需要使用 openssl 加密和解密文件的示例 C 代码

ubuntu - 为ARM编译时openssl无法编译,否则工作正常

C++ 是否可以使用对变量的引用来简化这种嵌套循环模式?

c++ - 将表示小数的 int 转换为 double 的正确方法是什么

c - getopt 总是返回 -1/getopt 不执行任何操作

c - 与之前 fork 的子进程共享一个套接字

c++ - 链接错误 : Cannot find -l<path to library>