当前位置: 首页 > news >正文

openssl源码分析之加密模式(modes)

openssl实现分组加密模式(例如AES128-CBC的CBC部分)的模块名字叫做modes,源代码位于

https://gitee.com/gh_mirrors/openssl/tree/master/crypto/modes
博主又打不开github了TT,只能找个gitee镜像

头文件是modes.h。

该模块目前支持12种加密模式,如图,每一个文件就是一个模式。

加密模式与加密算法并不绑定,你可以使用自定义的加密函数,只要分组长度是128bit即可。理论上可以使用非对称的加密函数,但必须是128bit等长分组,这种情况并不常见。

以CRYPTO_cbc128_encrypt为例,该函数的最后一个参数是一个函数指针,用于对一个分组进行加密,需要调用者提供。

void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out,
                           size_t len, const void *key,
                           unsigned char ivec[16], block128_f block)
{
    size_t n;
    const unsigned char *iv = ivec;

    if (len == 0)
        return;

#if !defined(OPENSSL_SMALL_FOOTPRINT)
    if (STRICT_ALIGNMENT &&
        ((size_t)in | (size_t)out | (size_t)ivec) % sizeof(size_t) != 0) {
        while (len >= 16) {
            for (n = 0; n < 16; ++n)
                out[n] = in[n] ^ iv[n];
            (*block) (out, out, key);
            iv = out;
            len -= 16;
            in += 16;
            out += 16;
        }
    } else {
        while (len >= 16) {
            for (n = 0; n < 16; n += sizeof(size_t))
                *(size_t_aX *)(out + n) =
                    *(size_t_aX *)(in + n) ^ *(size_t_aX *)(iv + n);
            (*block) (out, out, key);
            iv = out;
            len -= 16;
            in += 16;
            out += 16;
        }
    }
#endif
    while (len) {
        for (n = 0; n < 16 && n < len; ++n)
            out[n] = in[n] ^ iv[n];
        for (; n < 16; ++n)
            out[n] = iv[n];
        (*block) (out, out, key);
        iv = out;
        if (len <= 16)
            break;
        len -= 16;
        in += 16;
        out += 16;
    }
    if (ivec != iv)
        memcpy(ivec, iv, 16);
}

注意事项:

1、block参数必须支持前2个参数使用相同的指针,即输入输出使用同一块缓存。

2、key参数没有长度限制,实际长度取决于block。因此受限制的是分组长度而非密钥长度,密钥长度可以不等于分组长度,AES256就是这种情况。

对于GCM这种较为复杂的模式,需要输入上下文对象指针。

相关文章:

  • java 集合进阶
  • 顺序表:从数组到高效数据管理的进化之路
  • Android studio打包uniapp插件
  • 浅谈JS判断类型的几个方法
  • CNN注意力机制的进化史:深度解析10种注意力模块如何重塑卷积神经网络
  • 在 Vue 中监听常用按键事件(回车,ESC 键,空格等)。
  • Wincc通过VBS脚本控制控件“ Wincc Online Trend Control ”的曲线显示
  • windows开启wsl与轻量级虚拟机管理
  • [Vue]App.vue讲解
  • 【Vue3知识】组件间通信的方式
  • 2025年Python的主要应用场景
  • 查看wifi密码
  • 【AI News | 20250408】每日AI进展
  • layui 弹窗-调整窗口的缩放拖拽几次就看不到标题、被遮挡了怎么解决
  • 痉挛性斜颈康复助力:饮食调养指南
  • 物体检测算法:R-CNN,SSD,YOLO
  • Qt 交叉编译详细配置指南
  • Vue进行前端开发流程
  • 图解Java运行机制-JVM、JRE、JDK区别
  • 方法的重写
  • 深圳网站设计制/快速开发网站的应用程序
  • 电子商务网站建设试卷.doc/seo的基础优化
  • wordpress新增目录/seo官网优化怎么做
  • 苏州做网站知识的分享/网站百度关键词排名软件
  • 广州微信网站建设市场/99个创意营销方案
  • 开发个网站需要多少钱/长沙seo推广