各种加密算法简介(如MD5、SHA-256源码实现)

目录

一、MD5算法

二、SHA-256算法

三、MD5算法和SHA-256 比较


一、MD5算法

1、MD5简介:

(1)MD5算法是一种哈希算法,用于将任意长度的消息压缩成固定长度的消息摘要(通常为128位)。它是由美国密码学家罗纳德·李维斯特(Ronald L. Rivest)在1991年发明的。

(2)MD5算法的基本思想是将原始消息分成若干个固定大小的块,对每个块进行处理,最终将所有块的处理结果合并成一个128位的消息摘要。具体的处理过程包括填充、分组、四轮循环和合并四个字节。

(3)MD5算法被广泛应用于数字签名、文件完整性校验、密码学等领域。然而,由于其安全性较低,已被一些更安全的哈希算法如SHA-256取代。

2、MD5算法 C++源码实现

//以下是C++代码实现MD5算法:

#include <iostream>
#include <cstring>
#include <cstdint>

using namespace std;

const uint32_t S[64] = {
	7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
	5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
	4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
	6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21
};

const uint32_t K[64] = {
	0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
	0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
	0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
	0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
	0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
	0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8,
	0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
	0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
	0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
	0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
	0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05,
	0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
	0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
	0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
	0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
	0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391
};

uint32_t A, B, C, D;

inline uint32_t leftrotate(uint32_t x, uint32_t c) {
	return (x << c) | (x >> (32 - c));
}

void md5_process(uint32_t* block) {
	uint32_t a = A, b = B, c = C, d = D;

	for (int i = 0; i < 64; ++i) {
		uint32_t f, g;

		if (i < 16) {
			f = (b & c) | ((~b) & d);
			g = i;
		}
		else if (i < 32) {
			f = (d & b) | ((~d) & c);
			g = (5 * i + 1) % 16;
		}
		else if (i < 48) {
			f = b ^ c ^ d;
			g = (3 * i + 5) % 16;
		}
		else {
			f = c ^ (b | (~d));
			g = (7 * i) % 16;
		}

		f += a + K[i] + block[g];
		a = d;
		d = c;
		c = b;
		b += leftrotate(f, S[i]);
	}

	A += a;
	B += b;
	C += c;
	D += d;
}

void md5_hash(const char* msg, uint32_t len) {
	A = 0x67452301;
	B = 0xefcdab89;
	C = 0x98badcfe;
	D = 0x10325476;

	uint32_t block[16];
	int i;

	for (i = 0; i + 63 < len; i += 64) {
		memcpy(block, msg + i, 64);
		md5_process(block);
	}

	uint32_t rem = len - i;
	memcpy(block, msg + i, rem);
	block[rem++] = 0x80;

	if (rem > 56) {
		memset(block + rem, 0, 64 - rem);
		md5_process(block);
		rem = 0;
	}

	memset(block + rem, 0, 56 - rem);
	len <<= 3;
	block[14] = len & 0xffffffff;
	block[15] = len >> 32;
	md5_process(block);
}

int main() {
	char msg[] = "hello world";
	md5_hash(msg, strlen(msg));

	printf("%08x%08x%08x%08x\n", A, B, C, D);

	return 0;
}

3、MD5用qt实现

在Qt中实现MD5算法,可以使用QCryptographicHash类。该类提供了多种加密算法,包括MD5,SHA-1,SHA-256等。

#include <QtCore/QCoreApplication>
#include <QtCore/QDebug>
#include <QtCore/QCryptographicHash>

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

    QString str = "hello world";
    QByteArray data = str.toUtf8();

    QCryptographicHash hash(QCryptographicHash::Md5);
    hash.addData(data);

    QByteArray result = hash.result();
    QString md5 = result.toHex();

    qDebug() << "MD5:" << md5;

    return a.exec();
}

该示例将字符串"hello world"转换为UTF-8编码的字节数组,并使用QCryptographicHash类计算MD5值。最后将计算结果转换为十六进制字符串并输出到控制台。

需要注意的是,QCryptographicHash类的addData()函数可以多次调用,以便在多个数据块上执行哈希计算。在计算完最后一个数据块后,必须调用result()函数获取计算结果。

二、SHA-256算法

1、SHA-256简介

(1)SHA-256是一种加密哈希函数,它将任意长度的输入消息转换为一个固定长度的输出值,通常为256位二进制数。SHA-256是美国国家标准技术研究所(NIST)发布的SHA-2家族中的一员,是SHA-224、SHA-384和SHA-512的缩小版本。

(2)SHA-256的安全性主要基于它的抗碰撞性,即对于不同的输入消息,SHA-256产生的哈希值应该是不同的,且无法通过已知的攻击方式找到两个具有相同哈希值的输入消息。SHA-256通常用于数字签名、消息认证、密码学协议和安全通信等领域。

(3)SHA-256的计算复杂度很高,因此可以提供较高的安全性保障。但是,SHA-256也不是绝对安全的,随着计算技术和攻击技术的发展,可能会出现新的攻击方式,因此需要不断更新和改进哈希函数算法。

2、sha-256用qt实现

#include <QtCore/QCoreApplication>
#include <QtCore/QString>
#include <QtCore/QDebug>
#include <QtCore/QByteArray>
#include <QtCore/QCryptographicHash>

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

    QString input = "hello world";
    QByteArray data = input.toUtf8();

    QByteArray hash = QCryptographicHash::hash(data, QCryptographicHash::Sha256);
    QString result = QString(hash.toHex());

    qDebug() << "SHA-256 hash of " << input << ": " << result;

    return a.exec();
}

在这个示例中,我们使用QCryptographicHash类来计算SHA-256哈希值。我们首先将输入字符串转换为QByteArray格式,然后使用QCryptographicHash::hash()函数计算哈希值。最后,我们将哈希值转换为十六进制字符串,并输出到控制台。

注意,此示例仅用于演示如何在Qt中实现SHA-256算法。在实际应用中,应该采用更安全的哈希算法,并使用适当的哈希参数和盐值来增加安全性。

3、通过导入hashlib 库,使用SHA-256

// 1. 导入 hashlib 库
import hashlib

// 2. 创建一个 SHA - 256 对象
sha256 = hashlib.sha256()

// 3. 将需要哈希的数据传递给 SHA - 256 对象
sha256.update(b"Hello, World!")

// 4. 获取 SHA - 256 哈希值
hash_value = sha256.digest()

// 5. 可以将哈希值转换为十六进制字符串进行存储或传输
hex_value = hash_value.hex()

// 完整示例代码:
import hashlib

sha256 = hashlib.sha256()
sha256.update(b"Hello, World!")
hash_value = sha256.digest()
hex_value = hash_value.hex()

print(hex_value)

// 输出:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

三、MD5算法和SHA-256 比较

        MD5和SHA-256都是常见的哈希算法,用于将任意长度的数据转换为固定长度的哈希值。它们的比较如下:

1. 安全性:SHA-256比MD5更安全。MD5已经被证明存在碰撞攻击,即不同的输入可以生成相同的哈希值,从而导致安全问题。SHA-256则没有这个问题,目前还没有被证明存在碰撞攻击。

2. 哈希值长度:SHA-256的哈希值长度为256位,比MD5的128位更长。这意味着SHA-256的哈希值空间更大,哈希冲突的可能性更小。

3. 计算速度:MD5比SHA-256计算速度更快。但是,这并不意味着MD5更好,因为计算速度越快,越容易受到暴力破解和彩虹表攻击。

4. 应用场景:SHA-256通常用于需要更高安全性的场景,如数字签名、密码学和区块链等,而MD5则适用于需要快速计算哈希值的场景,如文件完整性检查和密码验证等。

综上所述,SHA-256比MD5更安全,但计算速度可能稍慢。在选择哈希算法时,应根据实际应用场景和安全需求进行选择。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值