Geffe序列生成器及安全性

Geffe序列生成器

Geffe序列生成器由三个长度为L1,L2,L3的最长LFSR定义组成,其中L1,L2,L3两两互素其中LFSR2作为控制生成器使用。其非线性组合函数为:
f ( x 1 , x 2 , x 3 ) = x 1 x 2 ⊕ x 2 x 3 ⊕ x 3 f(x_1,x_2,x_3)=x_1x_2\oplus x_2x_3\oplus x_3 fx1,x2,x3)=x1x2x2x3x3
其密钥流周期为 (2L1-1) (2L2-1) (2L3-1)

线性复杂度为 L=L1L2+L2L3+L3

结构图为

在这里插入图片描述

+++

当LFSR2输出为1时,LFSR2与LFSR1相连接;当LFSR2输出0时,LFSR2与LFSR3相连接。若设LFSRi的输出序列为(a(i) k}(i=1,2,3),则输出序列(bk)可以表示为
b k = a k 1 a k 2 + a k 3 a k 1 ‾ = a k 1 a k 2 + a k 3 a k 2 + a k 3 b_k=a_k^1a_k^2+a_k^3\overline{a_k^1}=a_k^1a_k^2+a_k^3a_k^2+a_k^3 bk=ak1ak2+ak3ak1=ak1ak2+ak3ak2+ak3

Geffe生成器是否能够抵御相关攻击?为什么?

Geffe生成器实际上认为是不够安全的。

虽然这个发生器从理论上来看似乎很好,但是实质上你是一个很弱的密码,不能够抵御相关的攻击。

这是因为发射器的输出有75%与LFSR1的时间系数相同。因此若已知LFSR的级数n1和各级的系数c1,c2,…,cn1,便能猜出LFSR1的初始值和寄存器所输出的序列,就可猜出LFSR2 的输出中与这个发射器的相同的次数。如果猜对了,这两个序列相同的概论就是75%,若猜错了,两个序列相同的概率为50%。

类似的 ,发射器输出与LFSR3的输出相等的概论为75%,有了这种相关性,密钥序列发生器很容易被破译。

例如,如果三个本原多项式都是三项,其中最大长度为n,那么仅需要37n的一段输出序列就能够重构这三个LFSR的内部状态。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用3级LFSR和Geffe序列生成器实现的二进制流密码系统的C代码: ``` #include <stdio.h> #define LFSR_SIZE 3 // 定义LFSR的初始状态和线性反馈函数 int lfsr_state[LFSR_SIZE] = {1, 0, 1}; int lfsr_feedback[LFSR_SIZE] = {1, 0, 1}; // 定义Geffe序列生成器的三个LFSR int geffe_lfsr1[LFSR_SIZE] = {1, 0, 1}; int geffe_lfsr2[LFSR_SIZE] = {0, 1, 1}; int geffe_lfsr3[LFSR_SIZE] = {1, 1, 0}; // 定义Geffe序列生成器的输出 int geffe_output = 0; // 定义加密函数 void encrypt(char* plaintext, char* key, char* ciphertext, int length) { int i, j; for (i = 0; i < length; i++) { // 生成一个8位的密钥流 int key_stream = 0; for (j = 0; j < 8; j++) { // 计算Geffe序列生成器的输出 geffe_output = (geffe_lfsr1[0] & geffe_lfsr2[1]) ^ (geffe_lfsr2[0] & geffe_lfsr3[1]) ^ (geffe_lfsr3[0] & geffe_lfsr1[1]); // 将Geffe序列生成器的输出放入LFSR的反馈位 lfsr_feedback[0] = geffe_output; // 计算LFSR的下一个状态 int lfsr_next_state = 0; for (int k = 0; k < LFSR_SIZE; k++) { lfsr_next_state ^= lfsr_feedback[k] & lfsr_state[k]; } for (int k = LFSR_SIZE - 1; k >= 1; k--) { lfsr_state[k] = lfsr_state[k - 1]; } lfsr_state[0] = lfsr_next_state; // 将LFSR的输出位加入密钥流 key_stream |= lfsr_state[LFSR_SIZE - 1] << j; } // 对明文进行异或操作 ciphertext[i] = plaintext[i] ^ key_stream; } } int main() { char plaintext[] = "01101110"; // 明文 char key[] = ""; // 密钥 char ciphertext[sizeof(plaintext)]; // 密文 int length = sizeof(plaintext) / sizeof(char); encrypt(plaintext, key, ciphertext, length); printf("Plaintext: %s\n", plaintext); printf("Ciphertext: "); for (int i = 0; i < length; i++) { printf("%d", ciphertext[i]); } printf("\n"); return 0; } ``` 在这个代码中,我们首先定义了LFSR的初始状态和线性反馈函数。然后定义了Geffe序列生成器的三个LFSR和输出。在加密函数中,我们使用了一个嵌套循环,其中外部循环迭代明文中的每个字符,内部循环生成一个8位的密钥流。在每个密钥流中,我们首先计算Geffe序列生成器的输出,然后将其放入LFSR的反馈位,计算LFSR的下一个状态,并将LFSR的输出位加入密钥流。最后,我们对明文进行异或操作,得到密文。 需要注意的是,由于我们没有提供一个完整的Geffe序列生成器或J-K触发器的实现,因此我们在代码中简单地使用了三个LFSR来模拟Geffe序列生成器的行为。具体来说,我们使用了一个3级LFSR作为Geffe序列生成器的第一个LFSR,以及两个2级LFSR作为Geffe序列生成器的第二个和第三个LFSR。我们使用了异或操作来计算Geffe序列生成器的输出,并将其放入LFSR的反馈位中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值