首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

实战篇-OpenSSL之HASH算法-摘要计算

  • 23-09-19 13:42
  • 4171
  • 9317
blog.csdn.net

本文属于《OpenSSL加密算法库使用系列教程》之一,欢迎查看其它文章。

实战篇-OpenSSL之HASH算法-摘要计算

  • 一、HASH算法简介
  • 二、命令行操作
    • 1、查看OpenSSL支持使用哪些算法,来计算摘要信息
    • 2、计算hello.txt文件的md5摘要信息
  • 三、编程实现
    • 1、封装HASH类
    • 2、测试代码

一、HASH算法简介

Hash算法特别的地方在于它是一种单向算法,用户可以通过hash算法对目标信息生成一段特定长度的唯一hash值,却不能通过这个hash值重新获得目标信息。

因此Hash算法常用在不可还原的密码存储、信息完整性校验等。

Hash算法是不可逆的,而其他加密算法是可逆的。

比如,常见的md5,对文件计算md5,可以产生出一个128位(16字节)的散列值(hash value),用于确保文件内容的完整一致性。但是无法由md5值,解密出文件内容。

常见的Hash算法:MD2、MD4、MD5、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1、RIPEMD160

二、命令行操作

1、查看OpenSSL支持使用哪些算法,来计算摘要信息

openssl dgst -list
  • 1

如下:

在这里插入图片描述

2、计算hello.txt文件的md5摘要信息

openssl dgst -md5 hello.txt
  • 1

如下:

在这里插入图片描述

也可以使用支持的其他算法,来计算摘要信息,如sha1、sha256等。

三、编程实现

1、封装HASH类

封装为一个类,支持多种计算算法,如下:

HASH.h

#ifndef HASH_H
#define HASH_H

#include 
#include 
#include 
#include 
#include 

/**
 * @brief The HASH class
 * HASH加密算法实现类,包括Sha、Sha1、Sha224等。
 */
class HASH : public QObject
{
    Q_OBJECT

public:
    enum Mode
    {
        SHA1,
        SHA224,
        SHA256,
        SHA384,
        SHA512,
        RIPEMD160,
        MD5
    };
    Q_ENUM(Mode)

    HASH(Mode mode);

    void addData(const QByteArray &data);
    QByteArray result();

private:
    QString modeToString(Mode value);

private:
    Mode _mode;   ///
    QByteArray _data;   ///<待加密数据
};

#endif // HASH_H
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

HASH.cpp

#include "HASH.h"
#include 

/**
 * @brief HASH::HASH
 * @param mode HASH算法类型
 */
HASH::HASH(Mode mode)
    :_mode(mode)
{
}

/**
 * @brief HASH::addData
 * 添加待加密数据
 * @param data 数据
 */
void HASH::addData(const QByteArray &data)
{
    _data = data;
}

/**
 * @brief HASH::result
 * 获取加密结果
 * @return 加密结果
 */
QByteArray HASH::result()
{
    OpenSSL_add_all_digests();

    const EVP_MD *md = nullptr;
    md = EVP_get_digestbyname(modeToString(_mode).toStdString().c_str());
    if(!md) // 不支持的格式
    {
        return QByteArray();
    }

    unsigned char mdValue[EVP_MAX_MD_SIZE] = {0};
    unsigned int mdLen = 0;

    EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
    EVP_MD_CTX_init(mdctx);
    EVP_DigestInit_ex(mdctx, md, nullptr);
    EVP_DigestUpdate(mdctx, _data.data(), _data.size());
    EVP_DigestFinal_ex(mdctx, mdValue, &mdLen);
    EVP_MD_CTX_free(mdctx);

    QByteArray out((const char *)mdValue, mdLen);
    return out;
}

/**
 * @brief HASH::modeToString
 * Mode型枚举值转字符串
 * @param value 枚举值
 * @return 字符串
 */
QString HASH::modeToString(HASH::Mode value)
{
    QMetaEnum metaEnum = QMetaEnum::fromType<Mode>();
    const char* key = metaEnum.valueToKey(value);
    Q_ASSERT(key != nullptr);
    return QString(key);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

2、测试代码

void createTestData(QByteArray& data, int size)
{
    data.resize(size);
    for (int i = 0; i < size; i++)
    {
        data[i] = i % 128;
    }
}

void testHash(const QByteArray& data)
{
    // Sha1
    HASH hash1(HASH::SHA1);
    hash1.addData(data);
    qDebug() << "SHA1:" << hash1.result().toHex();

    // Sha224
    HASH hash2(HASH::SHA224);
    hash2.addData(data);
    qDebug() << "SHA224:" << hash2.result().toHex();

    // Sha256
    HASH hash3(HASH::SHA256);
    hash3.addData(data);
    qDebug() << "SHA256:" << hash3.result().toHex();

    // Sha384
    HASH hash4(HASH::SHA384);
    hash4.addData(data);
    qDebug() << "SHA384:" << hash4.result().toHex();

    // Sha512
    HASH hash5(HASH::SHA512);
    hash5.addData(data);
    qDebug() << "SHA512:" << hash5.result().toHex();

    // Ripemd160
    HASH hash6(HASH::RIPEMD160);
    hash6.addData(data);
    qDebug() << "RIPEMD160:" << hash6.result().toHex();

    // Md5
    HASH hash7(HASH::MD5);
    hash7.addData(data);
    qDebug() << "MD5:" << hash7.result().toHex();
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 产生1MB+3B的测试数据,为了使该测试数据长度,不为8或16的整数倍
    QByteArray data;
    createTestData(data, 1*1024*1024+3);

    // 测试HASH
    testHash(data);

    return a.exec();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

执行结果:

在这里插入图片描述

本文涉及工程代码地址:http://iyenn.com/index/link?url=https://gitee.com/bailiyang/cdemo/tree/master/Qt/49OpenSSL/OpenSSL



若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

在这里插入图片描述

文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览50757 人正在系统学习中
注:本文转载自blog.csdn.net的百里杨的文章"https://blog.csdn.net/zyhse/article/details/115029906"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top