加密算法md4_SHA256加密算法原理

加密算法md4_SHA256加密算法原理讲解各种加密算法,如MD5、SHA-256,还附上源码实现_md5

加密算法md4_SHA256加密算法原理"

目录

一、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, 0xdb, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa, 0xfd, 0xd8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b, 0xfd, 0xae, 0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x, 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, 0xf, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa, 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 = 0x; B = 0xefcdab89; C = 0x98badcfe; D = 0x; 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更安全,但计算速度可能稍慢。在选择哈希算法时,应根据实际应用场景和安全需求进行选择。

今天的文章
加密算法md4_SHA256加密算法原理分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/81052.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注