【问题标题】:Get SHA256 hash of UTF-16le String获取 UTF-16le 字符串的 SHA256 哈希
【发布时间】:2021-07-17 17:17:06
【问题描述】:

我正在尝试获取 UTF-16le 字符串的 SHA256 和。在 Python 上,我正在尝试做的事情看起来像这样:

import hashlib
username = "Administrator"
username = username.decode('utf-8').encode('utf-16le')
hash = hashlib.sha256(username).digest()
print(hash)

下面的 C 代码为我提供了 SHA256 哈希,就好像我没有在上面的 Python 部分中调用 decode('utf-8').encode('utf-16le')

下面的输出是e7d3e769f3f593dadcb8634cc5b09fc90dd3a61c4a06a79cb0923662fe6fae6b。我想要的输出是5264c63204c56c0df9f8f4a030ea19d93a0fa402be6b00b4d7464e61641021f7

这是我第一次用 C 编码,所以如果我遗漏了一些明显的东西或做错了什么,这就是原因。

#include <openssl/sha.h>
#include <stdio.h>
#include <string.h>

int main()
{
    unsigned const char ibuf[] = "Administrator";
    unsigned char obuf[32];

    SHA256(ibuf, strlen((const char * )ibuf), obuf);

    unsigned char hash[32];
    int i;
    for(i = 0; i < 32; i++)
    {
        printf("%02x",obuf[i]);
    }

    printf("\n");
    return 0;
}

【问题讨论】:

    标签: c openssl


    【解决方案1】:

    查看您的代码,唯一剩下要做的就是字符集转换。进行这种转换的一种方法是使用iconv 系列函数。

    调整this question 并将其与您的代码相结合,可能类似于:

    #include <stdio.h>
    #include <string.h>
    #include <iconv.h>
    #include <openssl/sha.h>
    
    int main()
    {
        unsigned char ibuf[] = "Administrator";
        unsigned char obuf[32];
    
        char dest_str[100];
        char *in = ibuf;
        char *out = dest_str;
        size_t inbytes = strlen(in);
        size_t outbytes = sizeof dest_str;
        iconv_t conv = iconv_open("UTF-16LE", "UTF-8");
    
        if (conv == (iconv_t)-1) {
            perror("iconv_open");
            return 1;
        }
    
        if (iconv(conv, &in, &inbytes, &out, &outbytes) == (size_t)-1) {
            perror("iconv");
            return 1;
        }
    
        iconv_close(conv);
    
        SHA256(dest_str, sizeof dest_str - outbytes, obuf);
    
        unsigned char hash[32];
        int i;
        for(i = 0; i < 32; i++)
        {
            printf("%02x",obuf[i]);
        }
    
        printf("\n");
        return 0;
    }
    

    ...确实应该给出:

    5264c63204c56c0df9f8f4a030ea19d93a0fa402be6b00b4d7464e61641021f7
    

    需要注意的几点:

    • iconv_open 函数首先采用“to”字符集,然后是“from”字符集。
    • iconv 函数改变它传递的东西:inoutinbytesoutbytes 都被修改(增加或减少)为iconv 转换字符。
    • iconv 不为结果分配内存 - 在示例程序中,它使用固定大小的 100 字节缓冲区来存储其输出。如果您还要转换更长的字符串,则可能需要更大的缓冲区。

    【讨论】:

    • 我改变了一件小事,如果其他人正在阅读这个。除非 *in 被定义为常量,否则我得到一个编译错误,例如const char *in = ibuf;。其他一切都奏效了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2021-11-19
    • 2018-08-28
    • 1970-01-01
    • 2020-06-05
    • 2019-05-15
    • 2019-08-26
    相关资源
    最近更新 更多