【常见开源库的二次开发】基于openssl的加密与解密——MD5算法源码解析(五)

目录:

目录

目录:

一、MD5算法分析 :

1.1 关于MD5

1.2 算法原理

二、MD5接口调用

三、运用MD5 哈希列表(Hash List)验证文件完整性

3.1 读取文件并分块

3.2 生成每个块的哈希值

3.3 合并所有块的哈希值

3.4 验证文件完整性

3.5 演示代码


一、MD5算法分析 :

1.1 关于MD5

消息摘要”是指MD5(Message Digest Algorithm 5)算法。MD5是一种广泛使用的密码散列函数,它可以生成一个128位(16字节)的散列值。

RFC 1321: MD5由Ronald Rivest在1992年设计,并通过RFC 1321正式发布。它主要用于确保数据完整性,广泛应用于各种软件和系统中,用于验证数据未被篡改

抗碰撞性攻破: 抗碰撞性是指难以找到两个不同的输入值,使它们通过散列函数产生相同的输出值。2004年,中国的密码学家王小云发现了MD5、SHA-0和其他散列函数的碰撞漏洞,这表明MD5对于安全敏感的应用来说已不再安全。

  • 34
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,OpenSSL是一个开源的密码,提供了许多密码学相关的工具和算法,包括对称加密、非对称加密、哈希函数等。下面我们来看一下OpenSSL加密解密算法的实现。 我们选取AES算法作为例子,先看一下AES加密函数的源码: ```c int AES_encrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) { if (key->enc_block == (block128_f)AES_encrypt) { const union { long one; char little; } is_endian = {1}; if (is_endian.little) { (*key->block.cbc) (in, out, AES_BLOCK_SIZE, key->rd_key, key->rounds, key->iv, AES_ENCRYPT); return 1; } else { (*key->block.ecb) (in, out, key->rd_key, AES_ENCRYPT); return 1; } } else { return key->enc_block(in, out, key->enc_key); } } ``` 这段代码实现了AES加密函数,接受输入in、输出out和密钥key。在函数内部,首先判断使用的是CBC模式还是ECB模式,具体的实现在key->block.cbc和key->block.ecb函数中。如果使用的是CBC模式,会调用cbc_encrypt函数进行加密,否则会调用ecb_encrypt函数进行加密。 接下来是AES解密函数的源码: ```c int AES_decrypt(const unsigned char *in, unsigned char *out, const AES_KEY *key) { if (key->enc_block == (block128_f)AES_encrypt) { const union { long one; char little; } is_endian = {1}; if (is_endian.little) { (*key->block.cbc) (in, out, AES_BLOCK_SIZE, key->rd_key, key->rounds, key->iv, AES_DECRYPT); return 1; } else { (*key->block.ecb) (in, out, key->rd_key, AES_DECRYPT); return 1; } } else { return key->dec_block(in, out, key->dec_key); } } ``` 与AES加密函数类似,AES解密函数也会根据使用的模式调用不同的函数进行解密。 最后,我们来分析一下AES加密函数中的代码: ```c const union { long one; char little; } is_endian = {1}; if (is_endian.little) { (*key->block.cbc) (in, out, AES_BLOCK_SIZE, key->rd_key, key->rounds, key->iv, AES_ENCRYPT); return 1; } else { (*key->block.ecb) (in, out, key->rd_key, AES_ENCRYPT); return 1; } ``` 这段代码的作用是判断系统的字节序是否为小端序,如果是小端序,则调用cbc_encrypt函数进行加密,否则调用ecb_encrypt函数进行加密。其中,key->block.cbc和key->block.ecb是函数指针,分别指向CBC模式和ECB模式的加密函数。在调用函数时,需要传入输入数据、输出数据、数据块大小、轮密钥、轮数、初始化向量和加密/解密标志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

妄北y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值