news 2026/4/14 4:17:02

密码学(一):sm4+ofb

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
密码学(一):sm4+ofb

SM4 算法

SM4是中国国家密码管理局发布的对称加密标准(原名 SMS4),主要用于无线局域网标准(WAPI)及各类政务、金融应用。它在结构上属于分组密码算法

1. 核心规格

  • 分组长度:128 位(16 字节)。
  • 密钥长度:128 位(16 字节)。
  • 轮数:共 32 轮变换。
  • 设计结构:非平衡 Feistel 结构(实际上更接近于一种特殊的迭代结构,其解密算法与加密算法结构相同,仅轮密钥顺序相反)。

2. 算法逻辑

SM4 的核心逻辑在于其非线性变换部分。

  • S 盒(S-box):SM4 的 S 盒是基于有限域映射的,能够抵抗差分攻击和线性攻击。
  • 线性变换(L):用于扩散,确保每一位的变化都能迅速影响到整个分组。
  • 轮密钥生成:通过系统参数和固定参数,将 128 位初始密钥扩展出 32 个轮密钥。

OFB 模式:将分组密码变为流密码

OFB (Output Feedback, 输出反馈模式)是对称加密的一种工作模式。它的最大特点是将 SM4 这种“块加密”引擎当作“伪随机数生成器”来使用。

1. 工作原理

在 OFB 模式下,SM4 不直接加密明文,而是加密上一次加密输出的反馈向量

  1. 初始化:选取一个初始化向量(IV)
  2. 生成密钥流:用 SM4 加密 IV,得到第一个密钥块。
  3. 反馈:将这个密钥块再输入 SM4 加密,得到第二个密钥块,以此类推。
  4. 加密明文:将生成的密钥流与明文进行异或 (XOR)运算。

2. 核心公式

若以 Ek 表示使用密钥 k 的 SM4 加密函数,Pi 为明文块,Ci 为密文块,Oi 为输出块:

SM4-OFB 的技术优势

  1. 无填充要求:由于明文是直接与密钥流异或,明文长度不需要是 16 字节的整数倍。这在处理流媒体或字节流数据时非常方便。
  2. 错误不蔓延:如果密文在传输中某一位损坏,只会影响对应的那一位明文,不会像 CBC 模式那样导致整个后续解密失败。
  3. 预计算能力:因为密钥流的生成完全不依赖明文,系统可以提前算出大量的密钥流块,等到明文一到,直接进行异或运算,极大地降低了加密延迟
  4. 解密与加密对称:解密时,依然是使用 SM4 的加密流程来生成密钥流,然后再异或。这意味着硬件实现时只需要加密电路。

安全注意事项

尽管 SM4-OFB 非常高效,但在实际工程中必须遵守以下准则:

1. IV 的唯一性(绝对禁止重用)

这是 OFB 模式的致命伤。如果使用相同的密钥和相同的 IV 加密两段不同的明文,则:

攻击者可以通过异或结果推导出明文内容。IV 必须是不可预测且唯一的。

2. 认证缺失

OFB 模式本身不提供完整性保护。攻击者虽然不知道明文,但可以通过翻转密文中的特定位(Bit-flipping attack)来精确修改解密后的明文。在安全要求高的场景,建议配合HMAC使用。

示例(c++)

#include <iostream> #include <vector> #include <cstring> #include <gmssl/sm4.h> /** * SM4-OFB 加解密实现函数 * @param key 16字节密钥 * @param iv 16字节初始化向量 (每个消息必须唯一) * @param input 输入数据指针 * @param input_len 输入数据长度 * @param output 输出缓冲区指针 (长度应等于 input_len) */ void sm4_ofb_transform(const uint8_t key[16], const uint8_t iv[16], const uint8_t* input, size_t input_len, uint8_t* output) { SM4_KEY sm4_key; uint8_t iv_buffer[16]; uint8_t block_out[16]; int offset = 0; // 1. 初始化 SM4 密钥 sm4_set_encrypt_key(&sm4_key, key); // 2. 拷贝 IV,因为 OFB 需要不断更新反馈向量 memcpy(iv_buffer, iv, 16); // 3. 逐块处理 for (size_t i = 0; i < input_len; i++) { // 当处理到块的边界(或起始)时,生成新的密钥流块 if (offset == 0) { sm4_encrypt(&sm4_key, iv_buffer, block_out); // 将加密后的输出作为下一次加密的输入 (Feedback) memcpy(iv_buffer, block_out, 16); } // 4. 将密钥流与明文/密文异或 output[i] = input[i] ^ block_out[offset]; // 更新块内偏移,SM4 块大小为 16 字节 offset = (offset + 1) % 16; } } // 使用示例 int main() { uint8_t key[16] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10}; uint8_t iv[16] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f}; const char* text = "Hello, SM4-OFB Security!"; size_t len = strlen(text); std::vector<uint8_t> encrypted(len); std::vector<uint8_t> decrypted(len); // 加密 sm4_ofb_transform(key, iv, (uint8_t*)text, len, encrypted.data()); // 解密 (OFB 模式解密函数与加密完全一致,IV 需相同) sm4_ofb_transform(key, iv, encrypted.data(), len, decrypted.data()); std::cout << "Original: " << text << std::endl; std::cout << "Decrypted: " << std::string(decrypted.begin(), decrypted.end()) << std::endl; return 0; }

总结

特性SM4-ECB (基本模式)SM4-CBC (链式模式)SM4-OFB (反馈模式)
安全性低(易受模式分析)高(IV 唯一时)
填充需要需要不需要
并行计算支持不支持解密外支持预计算
错误影响仅本块蔓延至下一块无蔓延
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/4 22:58:54

春节放假通知模板设计技巧:排版配色与文案撰写要点

春节放假通知模板&#xff1a;我的6年设计实战与工具推荐 作为一名在平面设计行业摸爬滚打了6年的内容创作者&#xff0c;我深刻体会到春节前夕那份特有的忙碌与期待。每年这个时候&#xff0c;无论是企业HR、行政人员&#xff0c;还是自媒体运营者&#xff0c;都会面临一个共…

作者头像 李华
网站建设 2026/4/4 4:48:55

改进粒子群算法的RSSI定位附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…

作者头像 李华
网站建设 2026/4/8 21:09:57

【YOLOv13多模态创新改进】联合Mamba创新首发| SCI 一区2025| 引入CMFM 跨模态特征融合Mamba模块,实现 RGB与红外等多模态特征的高效融合,含多种创新改进,顶会顶刊发文热点

一、本文介绍 🔥本文给大家介绍使用 CMFM 跨模态特征融合Mamba模块改进 YOLOv13 多模态融合目标检测框架,可在保持实时性的前提下实现高效稳定的跨模态特征融合,充分利用可见光与红外信息的互补优势,显著提升复杂环境下的检测鲁棒性。该模块基于 Mamba 状态空间模型进行…

作者头像 李华
网站建设 2026/4/11 15:22:18

sql语言之分组语句group by

在sql语言中&#xff0c;group by 是分组语言语法是select 表达式 from 表名 group by 分组字段比如说上图的数据表&#xff0c;这是部分截图&#xff0c;表名叫table_tom&#xff0c;假如要按city字段进行分组&#xff0c;计算score各字段总和select sum("score") a…

作者头像 李华
网站建设 2026/4/9 5:01:32

jsp蛋糕甜品店管理系统4fx6j--(程序+源码+数据库+调试部署+开发环境)

本系统&#xff08;程序源码数据库调试部署开发环境&#xff09;带论文文档1万字以上&#xff0c;文末可获取&#xff0c;系统界面在最后面。 系统程序文件列表 用户,商品分类,商品尺寸,商品信息 开题报告内容 一、研究背景及意义 随着互联网的普及和消费者购物习惯的改变&…

作者头像 李华
网站建设 2026/4/6 0:31:21

PADS 多层板设计时怎么设置满足3W间距 或 不在某参考层布线

如何设置满足3W间距 在router中 右键选择网络 双击你要设置的网络 弹出 选择安全间距给这个网络添加一个特殊安全间距 比如其3w需10mil 我就 这样其与其他导线的安全距离就为10mil了 你布线时drc打开一不满足就会报错提示你 设置在参考层内不布线 如果你想要在哪个网络不…

作者头像 李华