初学密码学,今天学了流密码,做做笔记。
流密码体制模型
分类:
根据加密器中记忆元件的存储状态是否依赖于输入的明文字符可分为两类:
1.同步流密码 #独立于明文字符
2.自同步流密码 #依赖于输入的明文字符
目前最常用的流密码体制是二元加法流密码,是一种同步流密码,其加密变换可表示为异或函数。
线性反馈移位寄存器
移位寄存器是流密码长产生密钥流的一个主要组成部分。
线性反馈移位寄存器( LFSR)是指,给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。
线性反馈移位寄存器输出序列的性质完全由其反馈函数决定。
1、n级线性反馈移位寄存器最多有2n个不同的状态
2、n级n级线性反馈移位寄存器的状态周期小于等于2n-1
3、周期达到最大值的序列称为m序列
仅能被非0常数或自身的常数倍除尽,但不能被其他多项式除尽的多项式称为即约多项式或不可约多项式。
n级LFSR产生的序列有最大周期2n-1的必要条件是其特征多项式为不可约的。
若n次不可约多项式p(x)的阶为2n-1,则称p(x)是n次本原多项式。{ai}为m序列的充要条件为p(x)是本原多项式。
伪随机序列
Golomb对伪随机周期序列提出了应满足的如下3个随机公设:
(1)在序列的一个周期内,0与1的个数相差至多为1。
(2)在序列的一个周期内,长为1的游程占游程总数的1/2,长为2的游程占游程总数的1/4,长多为 i 的游程占游程总数的 1/2i ,且在等长的游程中0的游程个数和1的游程个数相等。
(3)异自相关函数是一个常数。
n长m序列满足Golomb的3个随机性公设,具有如下性质:
(1)在一个周期内,0和1出现的次数分别为2n-1-1和2n-1。
(2)在一个周期内,总游程数为2n-1;对 1≤ i ≤ n-2,长为 i 的游程有2n-i-1个,且0和1游程各半;长为n-1的0游程一个,长为n的1游程一个。
B-M算法
直接给公式:
附上码来的的C代码:
#include<stdio.h>
#include<memory.h>
#define max 100
int next(int i,int a[],int f[]){//求下一项离差
if(i==0)
return a[i];
else
{
int d=a[i],j;
j=1;
while(j<=i){
d=d^(f[j]*a[i-j]); //抑或
j++;
}
return d;
}
}
int main()
{
int n,a[max],i,j,q,l=0,m=-1,d;
int t[max]={0},f[max]={0},b[max]={0};
t[0]=1;f[0]=1;b[0]=1;
printf("输入的n为:\n");
scanf("%d",&n);
printf("输入的n长序列为:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
{
d=next(i,a,f);
if(d==1){
for(q=0;q<=n;q++)//t<-f
t[q]=f[q];
for(j=0;j<=n;j++)
if(b[j]==1)
f[j+i-m]=(f[j+i-m]+1)%2;
if(l<=i/2){
l=i+1-l;
m=i;
for(q=0;q<=n;q++)//b<-t
b[q]=t[q];
}
}
}
printf("L=%d\n",l);
printf("%d",f[0]);
for(i=1;i<=n;i++)
if(f[i]!=0)
printf("+x^%d",i);
printf("\n");
return 0;
}