文章总结: 该文档指出北大开源gmssl库中sm4.py的crypt_cbc函数存在Bug,因bytes拼接逻辑错误导致输出数据翻倍,与标准SM4/CBC不兼容。文中提供了复现代码、原因分析及修复建议。此外,文档深度剖析了SM4算法的非平衡Feistel结构、合成置换及密钥扩展原理,兼具漏洞预警与算法教学意义。 综合评分: 82 文章分类: 漏洞预警,漏洞分析,代码审计,漏洞POC
国密GMSSL库问题
原创
teacher李 teacher李
由由学习吧
2026年2月24日 10:56 重庆
SM4算法是中国国家密码管理局发布的商用分组密码算法,采用非平衡Feistel结构,核心设计围绕非线性变换(S盒)与线性变换(L函数)的复合置换展开。
北京大学自主开发的国产商用密码开源库的gmssl库的 crypt_cbc 函数存在以下问题:
Bug表现:
-
输入16字节数据,输出32字节(翻倍)
-
输入32字节数据,输出48字节
原因:
gmssl/sm4.py 中的实现
def crypt_cbc(self, iv, input_data):
output_data += self.one_round(self.sk, input_data[i:i + 16])
问题在于 output_data 初始化为 bytes 类型,但 one_round 返回的也是 bytes,两者拼接时行为异常。
验证:
from gmssl import sm4
key = b’0123456789abcdef’ * 2 # 32字节
iv = b’0′ * 16
data = b’hello’ # 5字节
crypt = sm4.CryptSM4()
crypt.set_key(key, sm4.SM4_ENCRYPT)
enc = crypt.crypt_cbc(iv, data)
print(len(enc)) # 输出32,而不是16
影响:与标准SM4/CBC不兼容,导致解密失败。
这是gmssl库本身的bug,需要库作者修复。
以下是其核心原理的深度剖析:
1. 算法核心结构:非平衡Feistel网络
SM4采用32轮迭代的非平衡Feistel结构,每轮处理128位数据(分为4个32位字)。与传统的Feistel结构不同,SM4在每轮迭代中会同时更新多个字,而非仅更新一半数据,这种设计增强了算法的扩散效果。
-
轮函数(F函数):每轮的核心运算,公式为:
X_{i+4} = F(X_i, X_{i+1}, X_{i+2}, X_{i+3}, rk_i) = X_i ⊕ T(X_{i+1} ⊕ X_{i+2} ⊕ X_{i+3} ⊕ rk_i) -
X_i:当前轮的状态字。 -
rk_i:当前轮的轮密钥。 -
T:合成置换函数,是算法的核心变换。
2. 核心变换:合成置换 T
T函数是SM4安全性的基石,由非线性变换 τ和线性变换 L复合而成(T(·) = L(τ(·)))。
2.1 非线性变换 τ(S盒置换)
τ变换负责“混淆”,通过4个并行的8位S盒打乱数据,破坏明文与密文之间的线性关系。
- 并行结构:将输入的32位字拆分为4个字节,分别通过4个相同的S盒进行独立替换。
- S盒特性:SM4的S盒是一个固定的8位输入/输出置换表,具备高非线性度、低差分均匀性和高代数复杂度,能有效抵抗差分攻击和线性攻击。
2.2 线性变换 L
L变换负责“扩散”,通过循环左移和异或操作,将S盒输出的非线性特性扩散到整个数据块中。
- 运算公式:
L(B) = B ⊕ (B <<< 2) ⊕ (B <<< 10) ⊕ (B <<< 18) ⊕ (B <<< 24) - 作用:确保明文或密钥的微小改变(1比特)能引起密文的显著变化(约50%比特改变),即雪崩效应。
3. 密钥扩展算法
SM4的密钥扩展同样采用32轮迭代结构,从128位主密钥生成32个32位的轮密钥。
- 系统参数(FK):用于初始密钥的异或运算,增加密钥的随机性。
- 固定参数(CK):32个固定字,用于每轮密钥扩展的异或运算。
- 扩展逻辑:通过递推关系生成轮密钥,确保轮密钥与主密钥之间具有强关联性,防止密钥推导攻击。
4. 解密过程
SM4的解密过程与加密过程结构完全相同,仅需将轮密钥的使用顺序逆序(即解密时使用 rk_31, rk_30, ..., rk_0)。这种设计简化了硬件和软件的实现复杂度
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:由由学习吧 teacher李 teacher李《国密GMSSL库问题》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论