一、流密码的基本概念
1、一次一密密码
(1)流密码的思想主要来源于一次一密算法。
(2)一次一密密码用于字母文本加密时,可将字母映射为数字0-25,采用模26加法,明文和密钥都是字符串,密文是明文和密钥逐位相加所得到的字符串。密钥是随机生成的,而且只能使用一次。

cpp
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void otp_encrypt(char *plain, int *key, char *cipher, int len) {
for (int i = 0; i < len; i++) {
if (isupper(plain[i])) {
int p = plain[i] - 'A';
int c = (p + key[i]) % 26;
cipher[i] = 'A' + c;
}
else {
cipher[i] = plain[i]; // 非大写字母保持不变
}
}
cipher[len] = '\0';
}
void otp_decrypt(char *cipher, int *key, char *plain, int len) {
for (int i = 0; i < len; i++) {
if (isupper(cipher[i])) {
int c = cipher[i] - 'A';
int p = (c - key[i] + 26) % 26;
plain[i] = 'A' + p;
}
else {
plain[i] = cipher[i];
}
}
plain[len] = '\0';
}
int main() {
char plain[] = "HELLOWORLD";
int len = strlen(plain);
int key[] = { 3, 19, 5, 12, 24, 0, 7, 14, 21, 8 }; // 示例密钥,需真随机
char cipher[len + 1], decrypted[len + 1]; // 如不合法,则需改成动态内存分配
otp_encrypt(plain, key, cipher, len);
printf("密文: %s\n", cipher);
otp_decrypt(cipher, key, decrypted, len);
printf("解密: %s\n", decrypted);
return 0;
}
(3)在现在的信息技术处理中,信息通常以一串二进制数表示,一次一密密码用于二进制数据时,明文和密钥都是二进制比特串,密文是明文与密钥按比特位进行异或处理得到的二进制比特串,解密同理,也是将密文与密钥按比特位进行异或处理。密钥是随机生成的,而且只能使用一次。

cpp
#include <stdio.h>
#include <string.h>
// 加密/解密函数(异或操作,加密和解密使用同一函数)
void one_time_pad(unsigned char *data, unsigned char *key, int len) {
for (int i = 0; i < len; i++) {
data[i] ^= key[i];
}
}
int main() {
unsigned char plaintext[] = "Hello, One-Time Pad!";
int len = strlen((char*)plaintext);
unsigned char key[len]; // 实际应用中需从真随机源生成;如不合法,则需改成动态内存分配
// 示例:用固定值代替随机密钥(仅为演示,不安全!)
for (int i = 0; i < len; i++) {
key[i] = i % 256; // 伪随机,仅供演示
}
printf("原始明文: %s\n", plaintext);
// 加密(原地操作)
one_time_pad(plaintext, key, len);
printf("加密后: ");
for (int i = 0; i < len; i++) {
printf("%02X ", plaintext[i]);
}
printf("\n");
// 解密(再次异或同一密钥)
one_time_pad(plaintext, key, len);
printf("解密后: %s\n", plaintext);
return 0;
}
(3)一次一密密码的特点:
①密钥为随机生成,仅使用一次,敌手无法用已使用的密钥对新密文进行解密,能实现无条件安全。
②加密和解密均为加法运算,计算效率较高。
③密钥长度至少与明文长度一样长,密钥共享困难,实际应用中不太实用。
2、流密码的定义
(1)流密码是一种重要的密码体制,也称为序列密码,明文消息按字符或比特位逐位加密,主要基于硬件实现。
(2)流密码的基本思想:利用长度比较短的密钥k产生一个足够长的密钥流,然后使用加法或者其它简单的处理方法对明文消息串进行加密。
(3)密钥流的产生:


(4)流密码和其它密码算法的区别就在于,流密码的密钥流生成器中有内部记忆原件,而其它则没有。

(5)一次一密密码是加法流密码的原型,如果密钥用作滚动密钥流,则加法流密码就退化成一次一密密码。
(6)密码设计者的最大的期望是设计出一个滚动密钥生成器,使得密钥经其扩展成的密钥流序列具有如下性质------极大的周期、良好的统计特性、抗线性分析。
3、同步流密码
(1)内部记忆元件的状态独立于明文字符的密码叫作同步流密码,否则叫作自同步流密码。
(2)在同步流密码中,由于密钥流与明文字符无关,因而此时密文字符也不依赖于此前的明文字符,因此可将同步流密码的加密器分成密钥流产生器和加密变换器两个部分。
4、两种流密码体制模型
(1)同步流密码体制模型:


(2)加法流密码体制模型:


二、有限状态自动机与密钥流生成器
1、有限状态自动机
(1)有限状态自动机是具有离散输入和输出(输入集和输出集均有限)的一种数学模型,由以下3部分组成:

(2)有限状态自动机可用有向图表示,称为转移图。



2、密钥流生成器
(1)密钥流生成器的组成:

(2)密钥流生成器设计的关键:

(3)密钥流生成器的分解:
密钥流生成器可分成驱动部分和非线性组合部分,驱动部分控制密钥流生成器的状态转移,并为非线性组合部分提供统计性能好的序列,非线性组合部分要利用这些序列组合出满足要求的密钥流序列

(4)常见的两种密钥流产生器:
目前最为流行和实用的密钥流产生器,其驱动部分是一个或多个线性反馈移位寄存器(LFSR,在后续会有详细介绍),前者称为滤波生成器或前馈生成器,后者称为非线性组合生成器

三、二元序列的伪随机性
1、二元序列的相关概念
(1)二元序列的伪随机性:

(2)游程的定义:

(3)自相关函数:

2、伪随机序列
(1)Golomb伪随机公设:

(2)伪随机序列的定义:

(3)伪随机序列需要满足的条件:
①周期p要足够大,比如10的50次幂。
②序列易于高速生成。
③当序列的任何部分暴露时,如果想分析整个序列,仅通过提取产生它的电路结构信息,在计算上是不可行的,这也是伪随机序列的不可预测性。(该条件决定了密码的强度,是流密码理论的核心,它包含了流密码要研究的许多主要问题,如线性复杂度、相关免疫性、不可预测性等等)
四、线性反馈移位寄存器(LFSR)
1、反馈移位寄存器
(1)反馈移位寄存器的组成:
①GF(2)上的n级反馈移位寄存器,由n个二元存储器和1个反馈函数组成。

②每个二元存储器只能存储0或1,如上图所示的,它们排成一排,数据会按箭头指示的方向移位。
③反馈函数是一个输入为若干个0/1,输出为一个0/1的布尔函数,它会根据当前所有存储器的值,算出一个新的0/1值,再送回最左边的存储器里,最右边存储器的值直接输出。反馈函数中的运算可以包括但不限于逻辑与、逻辑或、逻辑补。
④反馈移位寄存器的工作流程举例:

(2)反馈移位寄存器的状态:

2、线性反馈移位寄存器
(1)线性反馈移位寄存器的结构和工作逻辑:
①下图所示的是GF(2)上的n级线性反馈移位寄存器,它是反馈移位寄存器里最常用的一种,它的反馈函数是线性的,只用到GF(2)上的异或运算,没有与、或这种非线性操作。

②与基本的反馈移位寄存器一样,它有n级寄存器,每个寄存器只存储1个0/1,数据从左往右移位,最右端的数据直接输出。
③每一级寄存器都有一个反馈系数(,注意下标顺序与寄存器的级数相反),反馈系数为1则表示把对应寄存器的值接入反馈函数,为0则表示不接入。
④LFSR的输出序列满足递推关系:

(2)LFSR产生密钥流的周期:

(3)LFSR的关键性质:
