序列加密

对称密码可分为序列密码和分组密码;

序列密码的基本原理

序列密码单独加密每个位,通过密钥序列中的每个位和每个明文相加实现,同步序列密码的密码序列,仅仅取决于密钥,而异步序列密码的密钥序列则取决于密钥和密文。

序列密码的加密和解密

将每个位x_{i}与一个密钥序列位s_{i}相加在使用模数2执行运算

加密:y_{i}=e_{s_{i}}(x_{i})=x_{i}+s_{i}mod2

解密:x_{i}=d_{s_{i}}(y_{i})=y_{i}+s_{i}mod2

1.将加密表达式带入到解密表达式可知,为何加密和解密使用的函数是相同的。

2.为什么mod2加法会是一个很好的加密,函数在执行mod2算术运算时得到的结果只可能是0和1,因为任何数除以二得到的余数只可能为0和1,因此我们可以将魔二的算术运算看作为布尔函数。

3.密钥序列是序列密码安全性的核心问题,实际上序列密码的安全性完全取决于密钥序列密钥序列,密钥序列位的核心要求就是对攻击者而言,他必须看上去是随机的,否则攻击者就可以猜测到密钥序列,进而自行解密。

随机数

1.TRNG

真随机数生成器TRNG突出特点就是它的输出是不可复制的。例如抛100次硬币,并将这100次结果作为100位长的序列,几乎没有人可以产生与这100位相同的序列成功的几率为1/2的100次方,这是一个极小的概率。真随机数生成器都是基于物理过程,主要例子包括抛硬币,掷骰子,半导体声音和放射性衰变。密码学中通常使用TRNG生成会话密钥。

2.PRNG

伪随机数生成器从一个初始种子值开始通过各种计算得到序列,通常为随机数序列是递归执行以下计算得到:s_{0}=seed     s_{i+1}=f(s_{i})

其中最常见的是s_{0}=seed    s_{i+1}=as_{i}+bmodm,i=0,1...

其中a,b,m都是整型常量,注意PRNG并不是真正意义上的随机,他们可以计算出来,因此可以称为是计算确定的,对PRNG的一个一般要求就是必须拥有良好的统计属性,意味着他的输出几乎与真随机数序列相同.

3.加密安全的伪随机数生成器GSPRNG

加密安全的伪随机数生成器是PRNG的一个特例,它拥有以下额外的属性CSPRNG是一种不可预测的PRNG,更准确的定义为,给定密钥序列中n个连续位不存在一个时间复杂度为多项式的算法,使得成功预测下一个位的概率超过50%。CSPRNG的一个属性是给出上述序列,计算任何之前位在计算上都是不可行的

一次一密

无条件安全是指如果一个密码体制在无限计算资源的情况下,也不能被破译,则说明是无条件安全或信息理论上安全的。无条件安全基于信息理论,并对攻击者的计算能力没有任何限制,这个定义非常简单和直观,但要求密码到达无条件安全却十分困难,假设一个密钥长度为10 000对称加密算法,可行的攻击只有蛮力攻击,由于攻击者计算资源无限,我们可以简单地假设攻击者有2^{10000}可用计算机每台计算机只检查一个密钥,在一个时间步长内,那我们可以得到一个正确的密钥,当然拥有2^{10000}台可用计算机是不可能的,这个密码只能是计算安全的,但不是无条件安全的

基于移位寄存器的序列密码

反馈移位寄存器

F 为反馈函数或者反馈逻辑。如果 F 为线性函数,那么我们称其为线性反馈移位寄存器(LFSR),否则我们称其为非线性反馈移位寄存器(NFSR)

LFSR线性反馈移位寄存器

一个LFSR由若干时钟存储元件(触发器)和一个反馈路径组成,存储元件的数目给出了LFSR的度,一个拥有M各]个触发器的LFSR可称为“度为m”,反馈网络计算移位寄存器中某些触发器的XOR和并,将其作为上一个触发器的输出

了使得密钥流输出的序列尽可能复杂,会使用非线性反馈移位寄存器,常见的有三种

  • 非线性组合生成器,对多个 LFSR 的输出使用一个非线性组合函数
  • 非线性滤波生成器,对一个 LFSR 的内容使用一个非线性组合函数
  • 钟控生成器,使用一个(或多个)LFSR 的输出来控制另一个(或多个)LFSR 的时钟

非线性组合生成器 

非线性组合生成器,对多个 LFSR 的输出使用一个非线性组合函数
非线性滤波生成器,对一个 LFSR 的内容使用一个非线性组合函数
钟控生成器,使用一个(或多个)LFSR 的输出来控制另一个(或多个)LFSR 的时钟

RC4

RC4 算法广泛应用于 SSL/TLS 协议和 WEP/WPA 协议。

基本过程:

初始化 S 和 T 数组:
初始化置换 S。
生成密钥流。

//初始化
for i = 0 to 255 do
    S[i] = i
    T[i] = K[i mod keylen])
//置换
j = 0
for i = 0 to 255 do 
    j = (j + S[i] + T[i]) (mod 256) 
    swap (S[i], S[j])
//流密钥
i = j = 0 
for each message byte b
    i = (i + 1) (mod 256)
    j = (j + S[i]) (mod 256)
    swap(S[i], S[j])
    t = (S[i] + S[j]) (mod 256) 
    print S[t]

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值