密码基础(序列密码算法-付ZUC算法详解)

(一)基本概念

序列密码,又称为流密码,属于对称密码体制,它一次只对明文消息的单个字符(通常是二进制位,单比特)进行加解密变换,具有实现简单、速度快、错误传播少等特点,是世界各国的军事和外交等领域中使用的主要密码体制。
序列密码的起源于20世纪20年代的维尔姆(Vernam),由美国电话电报公司的G.W.Vernam于1917年发明。若Vernam体制中的密钥序列是随机序列时,则为“一次一密”密码体制(one-time-pad),理论上是不可破译的。由于随机密钥序列的产生、分发及管理等方面存在一定的困难,Vernam体制在当时未得到广泛应用。
序列密码算法(也称为流密码算法)将明文逐位(字节也可以)转换成密文,序列密码体制模型如图所示。


特点
加解密运算只是简单的模二加运算
密码安全强度主要依赖密钥流的安全性

在序列密码中,明文按一定长度分组后表示成一个序列,称为明文流(序列中的每一项称为明文字)。
加密时,先由种子密钥(或称为主密钥)通过密钥流产生器生成一个密钥流序列该序列的每一项和明文字具有相同的比特长度,称为密钥字;然后依次把明文流和密钥流中的对应项做二元加法运算(异或运算),产生相应的密文字,由密文字构成密文流输出。
解密过程是将同样的密钥流与密文流中的对应项做二元加法运算,恢复出原来的明文流。

序列密码和分组密码的区别 :

序列密码是将密钥和初始向量作为输入,通过密钥流生成算法输出密钥流(也称为扩展密钥序列),然后将明文序列和密钥流进行异或,得到密文序列。
分组密码首先对明文消息根据分组大小进行分组,再将明文分组、密钥和初始向量一起作为输入,通过分组加密算法直接输出密文分组。常见的序列密码:RC4,ZUC应用:用于无线通信网络,实现语音、视频即时加密。

序列密码分类

同步序列密码:密钥流的产生需要收发双方进行同步,密钥流的产生完全独立于明文消息和密文消息,密文只与明文和密钥有关,密文不参与加密。
自同步序列密码:密钥流的产生是密钥及固定大小的以往密文位的函数,K=f(k,c)。密文参与加密,密文不仅与明文和密钥有关,还与之前的密文有关

1.同步序列密码SSC(Synchronous Stream Cipher)中,密钥流独立于消息流产生。一个错误传输只会影响一个符号,不影响后面的符号。
无错误传播:一个错误传输只会影响一个符号,不影响后面的符号。
优点: 无错误传播,容易检测插入、删除、重放等主动攻击。
缺点:一旦接收端和发送端的种子密钥和内部状态不同步,解密就会失败,两者
必须立即借助外界手段重新建立同步。

 

2.自同步序列密码

自同步序列密码也称为异步流密码,其密钥流的产生不是独立于明文流和密文流的,与种子密钥和其前面已产生若干密文字有关(k,c)。密文不仅与明文和密钥有关,还与之前的密文有关。

自同步能力:自同步序列密码的核心特性是具有自同步能力。密钥序列的产生依赖于种子密
钥和固定个数的以前的若干位的密文。这意味着,即使在密文传输过程中出现插入或删除等
非法攻击,导致通信双方失去同步,接收端在连续接收到一定数量的正确密文后,密钥序列
产生器能够自动恢复同步解密。
有限的错误传播:因为自同步序列的状态取决于t个已有的密文字符,若一个密文字(或位)
在传输过程中被修改(插入或删除),则解密时最多只影响到后续 t个密文字的解密,即只发
生有限的错误传播。
其他特点:明文统计特性的扩算、自动对齐、检错和纠错等

      

序列密码与分组密码比较

(1)分组密码是以一定的固定长度的分组作为每次处理的基本单元;而序列密码则是以一个元素(一个字符或一个比特位)作为基本处理单元。
(2)分组密码使用的是一个不随时间变化的固定变换,具有扩散性好、插入敏感等优势,其缺点是加密处理速度慢,存在错误传播;而序列密码是用的一个随时间变换的加密变换,具有传播速度快、低错误传播和硬件实现电路简单等优势,其缺点是低扩散(意味着混乱不够)、插入及修改不敏感。

序列密码体制的安全性取决于密钥流的性能,当密钥流是完全的随机序列时,序列密码是不可破的;随机序列的主要特点表现为无规律性和不可预测性。 如果密钥流能做到真正的随机,此时的序列密码就是“一次一密”的密码体制,是绝对安全的。

在实际应用中,密钥流都是用有限存储和有限复杂逻辑的电路来产生的,此时的密钥流只有有限个状态。这样的密钥流生成器迟早要回到初始状态而使其呈现出周期性。但如果密钥流周期足够长,且随机性好,其安全强度是可以得到保证的。序列密码的安全强度取决于密钥流生成器的设计。
目前,产生密钥流最重要的部件是线性反馈移位寄存器(LFSR,Linear Feedback Shift Register),这是因为LFSR非常适合硬件实现、能产生较大周期和统计特性良好的序列。

(二)线性反馈移位寄存器

上面已经说到产生密钥流最重要的部件就是线性反馈移位寄存器,现在来讲述一下原理。

移位寄存器是指有n个寄存器(称为n级移位寄存器)r1,r2,…,rn从右到左排列,每个寄存器中能存放1位二进制数,所有寄存器中的数可以统一向右(或向左)移动1位,称为进动1拍. 即r1的值(b1)右移1位后输出,然后r2的值(b2)送r1, r3的值(b3)送r2,……最后, rn的值(bn)送rn-1

反馈移位寄存器(feedback shift register,FSR)是由n位的寄存器反馈函数(feedback function)组成,如下图所示,n位的寄存器中的初始值称为移位寄存器的初态。

标有a1,a2,...,a(n-1),an的小方框表示(0,1)二值存储单元(都是0或1),信号流从左往右,这n个二值存储单元称为该反馈移位寄存器的

这是一个动态过程,比如f(a1,a2,...an)=a(n+1),移位给an,an的值移位给a(n-1)

是不是线性反馈移位寄存器是由反馈函数f是不是线性函数决定的

(三)ZUC算法

定义

ZUC算法是中国自主研发的流密码算法,是一个对称密码算法

在这里需要明白一些基础概念:

算法结构

祖冲之算法由线性反馈移位寄存器(LFSR)比特重组(BR)非线性函数F组成

先说线性反馈移位寄存器(LFSR)

LFSR包括16个31bit的寄存器单位变量,s0,s1....s15,LFSR运行模式有两种,初始化模式和工作模式初始化模式是LFSR接受1个31比特字的输入u,然后对寄存器单元变量s0,s1...s15进行更新,计算过程如下:

工作模式:LFSR无输入,直接对寄存器单元变量s0,s1...s15进行更新

比特重组:

输入为LFSR寄存器单元变量s0,s2,s5,s7,s9,s11,s14,s15,输出为4个32比特字X0,X1,X2,X3,计算过程如下:
  比特

比如X0=s15取高16bit和s14的低16bit拼接起来;比特重组就是从LFSR寄存器单元中抽取128比特组成4个32比特X0,X1,X2,X3。将X0,X1,X2带入下方的非线性函数

非线性函数F:

X0查S0盒,比如X0的十六进制是SA,查询S0盒的3行A列,是FD。S0盒和S2盒一样,S1盒和S3盒一样。

密钥装入

初始密钥k初始向量iv分别扩展为16个31比特字作为LFSR寄存器单元变量s0,s1,...s15的初始状态。步骤如下:

将k和iv分别分16份,比如s0就是k0和d0和iv0的拼接,di如右上角那个小图,是给定的

算法运行

祖冲之算法的输入参数为初始密钥k,初始向量iv和正整数L,输出参数为L个密钥字Z。算法运行过程包含初始化步骤和工作步骤。

初始化步骤:将初始密钥k和初始向量iv装入到LFSR的寄存器单元变量s0,s1...,s15中,作为LFSR的初态;令32比特记忆单元变量R1和R2为0;重复执行下述过程32次。

这个流程图很关键,各步骤输入输出

工作步骤:

(丢弃W:其实上这一步也就是把参数进行更新,我们并不需要这个结果)

附:基于祖冲之密码的机密性算法 128-EEA3

ZUC(祖冲之密码算法)特点:

引入素数域运算、比特重组、最优扩算的线性变换等先进理念和技术

三层结构的综合运用

高的理论安全性,能够有效抵抗目前已知的攻击方法,具有较高的安全冗余

算法速度快,软硬件实现性能比较好

(四)RC4算法

定义

RC4是美国RSA数据安全公司1987年设计的一种序列密码,密钥长度可变,可使用 64 位或 128 位密钥大小,按目前的计算能力,RC4算法的密钥长度至少应为128位,广泛应用于SSL/TLS标准等商业密码产品中,是目前所知应用 最广泛的对称序列密码算法。

该算法以OFB方式工作,密钥流与明文相互独立。RSA数据安全公司将其收集在加密工具软件BSAFE中。最初并没有公布RC4的算法,人们通过软件进行逆向分析得到了算法,在这种情况下,RSA数据安全 公司于1997年公布了RC4密码算法。RC4与基于LFSR的序列密码不同,它是以随机置换为基础、基于非线性数据表变换的序列密码,面向字节操作。它以一个足够大的数据表为基础,对表 进行非线性变换,产生非线性的密钥序列。

RC4属于对称密码算法中的流密码加密算法。密钥长度可变,面向字节操作。它以一个足够大的表S为基础,对表进行非线性变化,产生密钥流。明文和密钥异或形成密文,密文和密钥异或为明文。

加密过程:

step2:如果值小于256,就循环赋值填满

密钥流生成:

生成密钥序列,循环执行: 更新:i=(i+1) mod 256 更新:j=(j+S[i]) mod 256

交换 :S[i]和S[j]

输出函数,RC4的输出函数定义如下:

计算临时变量 :h=(S[i]+S[j])mod 256

生成密钥流字节:z=S[h]

在加密和解密期间,RC4不断生成密钥流字节,和明文密文进行加解密。

RC4算法的优点是:算法简单、高效,特别适合软件实现。目前,RC4所用的初始密钥至少为128位。RC4被广泛应用于商业密码产品中, 例如已经用于Microsoft Windows、Lotus Notes和Oracle的SQL数据库中、为网络浏览器和服务器之间的通信定义的安全套接字层(Secure Socket Layer, SSL);还用于无线系统以及保护无线连接的安全 , 如应用于 IEEE802.11 无 线 LAN 标准的 WEP ( Wired Equivalent Privacy)协议和Wi-Fi保护访问协议等。

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
根据提供的引用内容,以下是一个使用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函数来生成密钥流。最后,我们打印出生成的密钥流。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值