鱼C论坛

 找回密码
 立即注册
查看: 1680|回复: 6

[已解决]加密作业的疑惑

[复制链接]
发表于 2023-4-8 14:17:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
void md5(unsigned char *dest, unsigned char *src)
{
        int i;

        MD5_CTX md5;                                          

        // 初始化
        MD5Init(&md5);
        // 传入明文字符串及其长度
        MD5Update(&md5, src, strlen((char *)src));
        // 得到加密后的字符串
        MD5Final(&md5, dest);
}

疑惑如下:
1 上面的MD5_CTX是什么意思呀 没学过
2 初始化的MD5Init也不知道什么意思 没思路
最佳答案
2023-4-8 14:34:45
学不死就死里xue 发表于 2023-4-8 14:27
呜呜呜 怎么我看的一脸懵逼

让我用一个更简单的类比来解释这段代码。

假设有一个厨师,他有一个食谱(MD5算法)用来烹饪一道特殊的菜肴(加密数据)。

为了烹饪这道菜,厨师需要一个锅(MD5_CTX 结构体)来放原料、烹饪过程中的中间产物。


1、MD5_CTX 就像是一个锅,它用来装原料(明文数据)和过程中产生的中间物。这个锅里有一些格子(变量),用来存储烹饪过程中的数据。

2、MD5Init() 函数就像是清洗锅子的过程。在开始烹饪之前,厨师需要先清洗锅子,把里面的残渣去掉,为烹饪做好准备。


在这段代码中,md5() 函数就像是烹饪这道特殊菜肴的全过程。

首先,厨师会准备一个锅子(初始化 MD5_CTX 结构体),然后把原料(明文字符串)放进锅里。

接着,根据食谱(MD5算法)烹饪,最后从锅里拿出烹饪好的菜肴(密文),并放到你提供的盘子(dest缓冲区)上。

这样解释是否更容易理解呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-8 14:19:44 | 显示全部楼层
本帖最后由 isdkz 于 2023-4-8 14:22 编辑

你好!这段代码是一个MD5哈希加密算法的简单实现。我会逐一回答你的问题。

1、MD5_CTX 是一个结构体类型,表示MD5哈希算法的上下文。它用于保存MD5算法的中间结果、临时变量等。

这个结构体的定义可能如下:
typedef struct
{
    unsigned int count[2];   // 记录当前的位数
    unsigned int state[4];   // 保存中间结果
    unsigned char buffer[64]; // 输入缓冲区
} MD5_CTX;

2、MD5Init() 是一个函数,用于初始化一个 MD5_CTX 结构体。它的作用是将上下文中的计数器、状态等重置为初始值。

这个函数的实现可能如下:
void MD5Init(MD5_CTX *context)
{
    context->count[0] = 0;
    context->count[1] = 0;
    // 初始化魔数
    context->state[0] = 0x67452301;
    context->state[1] = 0xEFCDAB89;
    context->state[2] = 0x98BADCFE;
    context->state[3] = 0x10325476;
}

这段代码中,MD5Init() 函数接受一个 MD5_CTX 结构体指针作为参数,然后将其初始化。

md5() 函数是一个简单的接口,用于将明文字符串加密为MD5哈希值。

具体来说,它首先初始化一个 MD5_CTX 结构体,然后使用 MD5Update() 函数处理输入的明文字符串,

最后使用 MD5Final() 函数计算哈希值并将其存储在 dest 参数指向的缓冲区中。

如果你还有其他问题,请随时告诉我!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-8 14:25:24 | 显示全部楼层
1. `md5_ctx` 是一个结构体,用于存储 md5 算法的上下文信息,包括中间计算结果和缓存。通常在实现 md5 算法时需要定义这个结构体,并将其作为参数传递给算法相关函数。

2. 在进行 md5 计算之前,需要进行一些初始化操作,如清空结构体、设置初始值等。而 `md5init` 函数就是用于进行这些初始化操作的函数。具体来说,它会将 md5_ctx 结构体中的各个字段初始化为初始值,以便后续计算使用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-8 14:27:38 | 显示全部楼层
isdkz 发表于 2023-4-8 14:19
你好!这段代码是一个MD5哈希加密算法的简单实现。我会逐一回答你的问题。

1、MD5_CTX 是一个结构体类型 ...

呜呜呜 怎么我看的一脸懵逼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-8 14:30:41 | 显示全部楼层
学不死就死里xue 发表于 2023-4-8 14:27
呜呜呜 怎么我看的一脸懵逼

我尽量用简单的语言解释一下。

这段代码实现的是MD5加密算法,用于将一段明文信息加密成固定长度的密文。

加密后的密文通常用于验证数据的完整性,例如验证文件是否被篡改。

1、MD5_CTX 是一个“盒子”,里面装着一些数据,这些数据用于保存加密过程中的临时变量和计算结果。

你可以把它想象成一个存储空间,用于保存加密过程的一些信息。

2、MD5Init() 是一个函数,它的作用是把这个“盒子”(MD5_CTX)初始化。

就像我们在使用一个盒子之前要先清理一下里面的东西,这个函数就是做这个事情。

它会把这个盒子里的数据设置成初始状态,让我们可以开始加密过程。


在这段代码中,md5() 函数就是一个简化版的MD5加密接口。它会先初始化一个“盒子”(MD5_CTX 结构体),

然后把要加密的明文字符串传给加密算法。最后,算法会生成一个加密后的密文,并存储在你提供的缓冲区(dest)中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-8 14:34:45 | 显示全部楼层    本楼为最佳答案   
学不死就死里xue 发表于 2023-4-8 14:27
呜呜呜 怎么我看的一脸懵逼

让我用一个更简单的类比来解释这段代码。

假设有一个厨师,他有一个食谱(MD5算法)用来烹饪一道特殊的菜肴(加密数据)。

为了烹饪这道菜,厨师需要一个锅(MD5_CTX 结构体)来放原料、烹饪过程中的中间产物。


1、MD5_CTX 就像是一个锅,它用来装原料(明文数据)和过程中产生的中间物。这个锅里有一些格子(变量),用来存储烹饪过程中的数据。

2、MD5Init() 函数就像是清洗锅子的过程。在开始烹饪之前,厨师需要先清洗锅子,把里面的残渣去掉,为烹饪做好准备。


在这段代码中,md5() 函数就像是烹饪这道特殊菜肴的全过程。

首先,厨师会准备一个锅子(初始化 MD5_CTX 结构体),然后把原料(明文字符串)放进锅里。

接着,根据食谱(MD5算法)烹饪,最后从锅里拿出烹饪好的菜肴(密文),并放到你提供的盘子(dest缓冲区)上。

这样解释是否更容易理解呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-8 14:49:10 | 显示全部楼层
如果对背后的算法细节有一点了解就容易理解了。
MD5(以及很多的密码学 hash 算法)都遵从这样一个范式:有一组状态,不断根据新到来的输入更新这组状态,直到输入数据均被处理完毕,此时的状态进行一定的组合就得到了最终的结果。
MD5_CTX 就是这组状态存放的位置
MD5Init 进行初始化,也就是按照算法的设计将这组状态设置成合适的初始值
MD5Update 将新信息(数据)加入到考虑中,更新状态。
MD5 等算法是分块进行处理的,每累积到一定长度的数据后(即填满一块后)才会进行一次处理,而最后一块中需要写入已处理信息的总长度并进行填充使总长度变为块大小的倍数,因此需要 MD5Final 来进行最后这部分处理:告知输入数据已经结束,可以计算输入长度、进行填充并完成最后的一块或两块未处理数据的处理了。此处的 MD5Final 还兼顾了取出最终结果的功能,另一些库的设计中可能会将其分开,即 MD5Final 只负责填充和完成最后的一块或两块未处理数据的处理,另有专门的接口如 MD5HexDigest 将已经结束计算的 MD5_CTX 中的状态提取为输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 15:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表