欢迎光临散文网 会员登陆 & 注册

密码学之流密码(Stream Cipher)

2021-05-20 21:22 作者:刹那-Ksana-  | 我要投稿

前言

Stream cipher由两个部分组成,一个是内部的state,一个是key。

一般而言,Stream cipher通过keyinitialization vector进行初始化(初始化只进行一次)。然后每一个timestep t,基于我们的key和state,stream cipher将输出一个单位的密码。重复执行的话就能连续地输出密码。

一、Linear Feedback Shift Registers (LFSR)

LFSR有两个部分,一个是内部的state,由n个所谓的register组成——s_%7Bn-1%7D%2C%20s_%7Bn-2%7D%2C...%2Cs_1%2Cs_0,每一个register只储存1个bit的信息(要么是0要么是1,另外注意下标的顺序)。另外一个是,长度同样为nfeedback coefficients——c_%7Bn-1%7D%2Cc_%7Bn-2%7D%2C...%2Cc_1%2Cc_0.

在初始化阶段,我们让state s等同于我们的key k,设置好我们的feedback c。接下来,每一个timestep t,我们输出最右侧的那个bit s_0,然后将state里面的所有bit朝右位移1个bit:s%5E%7B(t%2B1)%7D_i%3Ds%5E%7B(t)%7D_%7Bi%2B1%7D%2Ci%3D0%2C1%2C...%2Cn-2,最后,最左侧的那个bit s_%7Bn-1%7D由我们的state和feedback决定:s%5E%7B(t%2B1)%7D_%7Bn-1%7D%3D%5Coplus%20%5E%7Bn-1%7D_0c_is_i

示意图

当我们的LSFR遍历所有2%5En-1 state,并且没有遇到过重复时,这个时候我们称我们的LFSR具有maximum length. 而LFSR具有maximum length的条件是:

t(x)%3Dx%5En%2Bc_%7Bn-1%7Dx%5E%7Bn-1%7D%2Bc_%7Bn-2%7Dx%5E%7Bn-2%7D%2B...%2Bc_1x%2Bc_0

为primitive.

LFSR并非一个安全的cipher,因为我们可以从前n个输出的bit中知道我们的初始state(也就是我们的key),然后从前2n个输出的bit中知道我们的feedback coefficient c.

二、RC4

RC4以8-bit的byte为单位,每次输出一个byte的密码。我们使用一个长度为256-byte的state,以及一个任意长度的key:

RC4流程(引用自:Introduction to Modern Cryptography)

下面是自己用Python写的一段代码(未验证正确性,只供参考):

RC4也并不是一个安全的cipher,如果我们的初始state的第3个byte为0第2个byte不为2,那么我们输出的密码流的第2个byte为0,这个情况出现的概率为%5Cfrac%7B1%7D%7B128%7D%20

RC4还有其他的一些统计学上的bais,导致攻击者可以利用这些特性来攻击基于RC4的密码.

后记

Stream cipher(看上去)其实还是挺简单的。

参考资料:

Jonathan Katz; Yehuda Lindell - Introduction to Modern Cryptography

使用工具:Drawio

THE END.

密码学之流密码(Stream Cipher)的评论 (共 条)

分享到微博请遵守国家法律