加密算法的中国特色
1 背景简介
在密码学Q领域,国密算法 SM4 是国内自主研发的分组对称加密 四算法,凭借 128 位分组长度、128 位密钥长度的设计,在金融、政务、物联网等领域广泛应用。

但分组密码本身仅能处理固定长度(SM4 为 128 位)的明文数据,而现实中需要加密的文件、数据流、存诸块等往往是任意长度的。
为解决这一问题,“工作模式”应运而生 – 它相当于分组密码的“应用框架”,定义了如何将固定长度的分组加密逻辑扩展到仟意长度数据,同时兼顾安全性、性能与实际场景需求。本文将详细解读SM4的8种主流工作模式:ECB、CBCCFB、OFB、CTR、GCM、CCM 与 XTS.
2 分组密码工作模式的核心价值
工作模式的核心作用有三点:一是“长度适配”,将任意长度的明文拆分为符合 SM4 分组长度的块(最后一块需补全),或转化为流密码形式处理;二是“安全增强”。避免相同明文分组加密后产生相同密文(这是分组密码的天然隐患),通过引入初始化向量(NV)、随机数(nonce)等参数,抵御统计分析、重放攻击等风险;
三是“功能扩展”,部分模式(如 GCM、CCM)可同时实现“加密”与“认证”,确保数据不仅不被窃取,还不被篡改。
在了解具体模式前,需明确两个关键概念:
初始化向量(IV):用于打破明文分组的关联性,通常要求“随机且唯一”(部分模式仅需唯一),无需保密,但同一密钥下不可重复;
认证加密(AEAD):同时提供加密(机密性)与认证(完整性、防篡改)的能力,生成“认证标签”,解密时需验证标签有效性,代表模式为 GCM、CCM。
3 算法示例
使用SM4密码算法时,我们有一个128位的块大小,并且使用128位的加密密钥。每个数据块有32轮处理。总体而言,我们可以在初始向量(IV)中添加一个128位的盐值。
Type: SM4
Mode: CBC
Message: Hello
Message with padding: b'Hello\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b'
Key: 60be6868db307a6aa82cb81f39d28c00
IV: b391c135bb6349758de37257b3e4d4a1
Cipher: fee4e41af44bc387c4255d3527ca65c8
Decrypt: Hello
GCM 提供了 MAC,用于消息认证。根据我阅读的资料和看到的代码片段,GCM 执行了一种类似于 CBC 的异或操作,但我不确定异或的对象是什么。
在 CBC 模式中,异或操作是明文与前一个密文块进行的,除了第一个块,它使用一个随机 IV。GCM 也是这样吗,还是异或是针对其他东西?如果是的话,有人能简单解释一下 GCM 如何使用 IV 以及异或操作是如何进行的吗?
4 GCM 和 CBC
GCM 和 CBC 模式在内部工作原理上有很大不同;它们都涉及分组密码和异或操作,但使用方式不同。在 CBC 模式中,你通过将当前的明文块与前一个密文块(或初始化向量 IV)进行异或,然后将结果传入分组密码来加密数据块;分组密码的输出就是密文块。
GCM 模式提供隐私(加密)和完整性。为了提供加密,GCM 维护一个计数器;对于每一块数据,它将当前计数器的值传入分组密码。然后,它将分组密码的输出与明文进行异或,从而形成密文。
注意两个关键区别:
正在进行异或运算的对象;在 CBC 模式下,明文会与攻击者已知的数据(IV 或前一个密文块)进行异或运算;因此,这本身并不提供任何固有的安全性(相反,我们这样做是为了尽量减少通过分组密码发送相同块的机会)。在 GCM 模式下,明文会与来自分组密码的输出进行异或运算;在安全模型中,这本身就是安全性的一部分,攻击者无法猜测该输出(除非他已经知道明文和密文)。
5 小结
通过分组密码处理的对象;在 CBC 模式下,明文会通过分组密码处理(在被异或“随机化”之后);在 GCM 模式下,通过分组密码处理的内容实际上并不依赖于被加密的数据,而只依赖于内部状态。
至于 GCM 如何使用 IV(我个人认为“nonce”更适合描述 GCM 所使用的,因为它强调了一个概念, 至于GCM如何使用IV(我个人认为“随机数”这个词更适合GCM使用的情况,因为它强调了在GCM中,不能对同一个密钥重复使用相同的随机数),它被用来初始化计数器。
- 点赞
- 收藏
- 关注作者
评论(0)