c - 哈希函数的 openssl 实现是面向位的还是面向字节的?

标签 c hash openssl cryptography

一切都在标题中。我找不到关于这个具体细节的任何信息,当我去检查实现时(我将在这里发布,你可以在头文件 md32_common.h 中找到它),我真的不能告诉...

这里是 HASH_UPDATE 函数,它被每个哈希函数更新函数调用(即 MD5_Update(...))

int HASH_UPDATE(HASH_CTX *c, const void *data_, size_t len)
{
    const unsigned char *data = data_;
    unsigned char *p;
    HASH_LONG l;
    size_t n;

    if (len == 0)
        return 1;

    l = (c->Nl + (((HASH_LONG) len) << 3)) & 0xffffffffUL;
    /*
     * 95-05-24 eay Fixed a bug with the overflow handling, thanks to Wei     
     Dai
     * <weidai@eskimo.com> for pointing it out.
     */
    if (l < c->Nl)              /* overflow */
        c->Nh++;
    c->Nh += (HASH_LONG) (len >> 29); /* might cause compiler warning on
                                   * 16-bit */
    c->Nl = l;

    n = c->num;
    if (n != 0) {
        p = (unsigned char *)c->data;

        if (len >= HASH_CBLOCK || len + n >= HASH_CBLOCK) {
            memcpy(p + n, data, HASH_CBLOCK - n);
            HASH_BLOCK_DATA_ORDER(c, p, 1);
            n = HASH_CBLOCK - n;
            data += n;
            len -= n;
            c->num = 0;
            /*
             * We use memset rather than OPENSSL_cleanse() here 
               deliberately.
             * Using OPENSSL_cleanse() here could be a performance issue. 
               It
             * will get properly cleansed on finalisation so this isn't a
             * security problem.
             */
            memset(p, 0, HASH_CBLOCK); /* keep it zeroed */
        } else {
            memcpy(p + n, data, len);
            c->num += (unsigned int)len;
            return 1;
        }
    }

    n = len / HASH_CBLOCK;
    if (n > 0) {
        HASH_BLOCK_DATA_ORDER(c, data, n);
        n *= HASH_CBLOCK;
        data += n;
        len -= n;
    }

    if (len != 0) {
        p = (unsigned char *)c->data;
        c->num = (unsigned int)len;
        memcpy(p, data, len);
    }
    return 1;
}

最佳答案

虽然像 MD5 这样的散列函数通常对比特流进行操作,但软件实现通常对字节进行操作,以避免位移带来的速度损失(并且因为数据通常以字节为单位或在任何情况下都以更大的字节为单位进行处理)。在您发布的代码中,行

l = (c->Nl + (((HASH_LONG) len) << 3)) & 0xffffffffUL;

len 参数乘以 8(通过向左移动 3 次)将字节计数转换为位计数,所以我认为可以肯定地说这段代码在内部使用位,但期望传递一个字节流。

关于c - 哈希函数的 openssl 实现是面向位的还是面向字节的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43346977/

相关文章:

PHP 仅对数字和字符进行字符串编码/解码

PHP:将 MD5 哈希应用升级为 bycript。这安全吗?

c - SSL_accept() 不工作

python - 让 pyOpenSSL 客户端使用 SSL session 恢复

c++ - C函数尽可能多地使用寄存器

c - 如何简化这段代码并使其成为函数?

ruby - 如果散列包含 Ruby 中的值,则返回散列键

ssl - 我得到 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY 的另一种情况

C编程: I want to make my stopwatch continuous but when a key is pressed it seems to only go in a one second increment and stop

c - 在 WM_MOUSEMOVE 中绘图