首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >伪随机数发生器加密文件的解密(线性同余rand()

问伪随机数发生器加密文件的解密(线性同余rand()
EN

Cryptography用户
提问于 2018-03-24 16:18:16
回答 1查看 2.1K关注 0票数 1

如何解密此文件:

https://drive.google.com/open?id=1gZCujDYmEL-FZ5o_xBUS-Ng5979HSsZ7

鉴于现有的唯一资料是:

  1. 它是在2018年的21/3/‎,‏‎9:05:15创建的。
  2. 该文件的明文可能以“\documentclass{ The }”开头,它是一个latex文件
  3. 用于加密的代码使用C,并使用伪随机数生成器(线性同余rand()):

/* C标准*/ #的ISO/IEC9899:1990年版定义RAND_MAX 32767静态无符号长int next = 1;int rand( void ) // RAND_MAX假定为32767 { next = next * 1103515245 + 12345;返回(无符号int)( next /65536) % 32768;}RAND_MAX srand(无符号int种子){next= seed;}包含 #包含 /在rand()密钥流char ()时返回字节(静态int键);静态int i= 0;i=i% 4;if (i == 0) key = rand();返回(( char * )(&key));} int main(int argc,const char * argv[]) {静态字符随机状态;srand(空);文件*输入,*输出;输入= fopen("Homework1b.tex","r");输出= fopen("Homework1b.tex.enc","w");int c,rc;而((c = fgetc(input)) != EOF) { rc=randchar();printf("c=%d (%c)和rc=%d\n",c,c,rc);fputc(c^rc,output);

我读到了C随机的弱点,我知道知道明文的一部分会有帮助,但我无法理解。

EN

回答 1

Cryptography用户

发布于 2018-03-24 16:55:30

简单回答:只需将srand(time(NULL));替换为srand();,然后再对加密的文件进行“加密”以解密。

长答案:这个程序的基本原理是流密码,正如您在标记中已经提到的那样,这意味着纯文本$P$是使用随机密钥流$K$进行的。要撤消此操作,只需再次使用相同的密钥流对密文$C$进行xor,$C \oplus K= (P \oplus K) \oplus K=P_oplus 0= P$证明了这一点。

因此,要重建明文,我们需要通过两种方式重建可以实现的密钥流:

  1. 使用嵌入时间:正如您在主方法的第二行中所看到的,rand函数的种子被设置为当前时间(在secconds中)。由于rand函数的所有输出都依赖于该种子,因此可以通过将种子设置为unix时代以来的秒来重构密钥流。
  2. 使用已知的明文:让我们看一下密钥流是如何生成的:$K_{i+1}=(1103515245 \cdot K_i + 12345)\ /\ 65536\ (mod\ 32768)$ --这在一开始看起来可能很复杂,但是有一个简单的属性很容易被利用:下一个状态只依赖于前一个状态。这允许我们只使用一种状态计算所有以下状态。为此,我们只需使用$K_0 = C_0 \oplus P_0$中的明文对密文进行xor处理,并将其用作$K_1$的种子。然后,您可以继续使用rand函数来获取密钥流。

最后,您需要知道加密源的特性,以便您的解密程序能够匹配并正确解密。

票数 2
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/57799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档