商用密码应用与安全性评估要点笔记(密码算法ZUC)

1、ZUC算法简介

        ZUC算法属于对称密码算法,具体来说是一种序列密码算法或流密码算法。ZUC算法以中国古代数学家祖冲之首字母命令。

        ZUC算法标准包括三个部分:

        GMT 0001.1-2012 祖冲之序列密码算法:第1部分:算法描述

        GMT 0001.2-2012 祖冲之序列密码算法:第2部分:基于祖冲之算法的机密性算法

        GMT 0001.3-2012 祖冲之序列密码算法:第3部分:基于祖冲之算法的完整性算法

        可以看出ZUC可以提供机密性和完整性保护功能,其中机密算法称为128-EEA3,完整性保密算法称为128-EIA3。2011年9月,这两个算法与AES、Snow 3G共同成为4G移动通信密码算法国际标准。

        ZUC包括两个版本,具体比较如下。ZUC 256bit版本面向5G通信安全标准,保障在后量子时代具备较长时间内移动通信的机密性和完整性。

版本 密钥长度 IV密钥流位宽认证标签长度MAC
128比特版本128b128b32b32b
256比特版本256b184b32b

32/64/128b

2、ZUC算法结构

        ZUC算法逻辑有3个部分构成,从上到下依次是LFSR(线性反馈移位寄存器)、BR(比特重组)和F(非线性函数)。

        

LFSR包括16个31bit寄存器单元变量,运行模式有2种:初始化模式LFSRWithInitialisationMode(u)和工作模式LFSRWithWorkMode。

BR从LFSR的寄存器单元中抽取128b组成4个32比特字,计算过程为BitReconstruction。

F包含2个32bit记忆单元变量R1和R2,输入为3个32比特字,输出为1个32比特字。其中包含S为32比特的S盒交换。

3、ZUC算法运算过程(128版本为例)

3.1 密钥装入

将128bit的密钥k和128bit的初始向量iv扩展为16个31比特字作为LFSR寄存器变量的初始状态。具体过程如下:

3.2 初始化阶段

在3.1中已经完成LFSR的初态填入,这里再将F中32比特记忆单元变量R1和R2置为全0,然后重复执行32次(BitReconstruction—W-F(X0,X1,X2)—LFSRWithInitialisationMode(W>>1))操作。

3.3工作阶段(32bit密钥字输出)

首先执行一次BR、F和LFSRwithWorkMode,得到的输出W不用丢弃。

然后再来一次BR、F和L异或X3、FSRWithWorkMode,从而输出一个32比特的密钥字Z。

4、ZUC优点

引入素数域运算LFSR、比特重组BR、最优扩散的线性变换(非线性函数F采用 S 盒和高扩散特性的线性变换 L)。通过对LFSR、BR和F三层结构的综合运用,ZUC算法具有很高的理论安全性,能够有效抵抗目前已知的攻击方法,具备较高的安全冗余、并且算法速度快、软/硬件实现性能都较好。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的引用内容,以下是一个使用C语言实现的ZUC序列密码算法的示例: ```c #include <stdio.h> #include <stdint.h> #define ROL32(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) void zuc(uint32_t *k, uint32_t *iv, uint32_t *keyStream) { uint32_t R1, R2, F, W, B, u, v; int i; R1 = k[0]; R2 = k[1]; for (i = 0; i < 32; i++) { F = (R1 + ROL32(R2, 15)) ^ iv[i]; W = ROL32(R1, 2) ^ ROL32(R1, 10) ^ ROL32(R1, 18) ^ ROL32(R1, 24); B = ROL32(R2, 31) ^ W; u = F + B; v = F + ROL32(B, 1); R1 = ROL32(R1, 31); R2 = ROL32(R2, 29); keyStream[i] = u; keyStream[i + 32] = v; } } int main() { uint32_t k[2] = {0x01234567, 0x89ABCDEF}; uint32_t iv[32] = {0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210, 0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210, 0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210, 0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210, 0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210, 0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210, 0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210, 0x01234567, 0x89ABCDEF, 0xFEDCBA98, 0x76543210}; uint32_t keyStream[64]; zuc(k, iv, keyStream); printf("Key Stream:\n"); for (int i = 0; i < 64; i++) { printf("%08X ", keyStream[i]); if ((i + 1) % 8 == 0) { printf("\n"); } } return 0; } ``` 这个示例演示了如何使用C语言实现ZUC序列密码算法。在主函数中,我们定义了初始密钥k和初始向量iv,并创建了一个数组来存储生成的密钥流。然后,我们调用zuc函数来生成密钥流。最后,我们打印出生成的密钥流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

游鲦亭长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值