谈谈流密码

这篇文章来谈谈流密码,这也是我本人的研究方向。

假设老王是一个工作在国外的特工,需要把获得的紧急情报传回国内总部。但是敏感的网络都会有监视,所以他不能直接发明文,必须把情报加密以后才能发出去。假设情报是电子版的,内容比较多,可能有好几 G,老王必须尽可能快的把消息发出去,那么老王应该怎样加密,才能既保证安全性(不被对手破译),又能兼顾效率(国内的同事可以很快解密)呢?

这可难不倒老王。情报么,就是一串有规律的 0-1 序列而已;加密么,就是用某种自己人才能 "看得懂" 的方式把它打乱变成一串没有规律的 0-1 序列而已。经过权衡比较,老王决定采用流密码的加密方法:他先生成一串与明文同样长度的、随机的 0-1 序列,这个序列我们称之为密钥流,然后用这个密钥流与明文相加(即异或运算),得到的新的序列就是要发送的密文。国内的同事收到密文之后,把密文与密钥流再进行一次异或运算就还原出了明文。过程很简单,是不是?(这里需要假定老王的同事是知道这个密钥流的,比如是和老王出发前商量好的)

这个过程说的直观点,就是用一串随机的 0-1 序列像桌布一样 “覆盖” 在明文上,解密的时候把这层布拿掉即可。

这里需要解释一下为什么要采用随机的密钥流。随机的意思就是密钥的各个比特之间是独立的,这样对方即使截获了你的密文并且知道其中一段对应的明文,从而得出这一段密钥,但是由于密钥的随机性,他无法由此段密钥推出密钥流的其余部分,这样就保护了其余的密文的安全。

如果密钥不是随机的呢?比如老王偷个懒,设置成 110110110110 ... 无限循环会怎样?那敌人拿到一段明文和对应的密文以后一对比,哇擦!这人太厚道了!看数字找规律,这游戏小学生都会,于是剩下的明文直接就赤裸裸的呈现在敌人面前了。

所以流密码的一个基本原则,就是生成的密钥流必须是随机的,至少看起来是随机的。

说起来容易做起来难,生成足够长的随机序列可是计算机科学里面的一大难题。有人说这好办,找个均匀的硬币反复地扔,正面朝上记作 1,反面朝上记作 0,得到的就是随机序列。还有人说,鼠标的移动基本是随机的,写个监视程序记录老王鼠标的移动,然后转换成二进制序列不就行了。且不说几个 G 的情报这么加密老王这辈子搞不搞的完,他怎么把生成的随机序列告诉他的同事?要是能安全的把几个 G 的密钥流传回去,那还费心思加密做什么?直接传明文不就得了?

所以只能想办法生成一段伪随机的密钥流。这里一个序列是伪随机序列的意思是表面看起来它是随机的,但实际是用一个确定的算法作用在一小部分随机的比特上得到的。或者说,这个密钥流是从一个比较短的密钥 $K$ 出发,用一个确定的函数 $f$ 生成的。老王只要和同事事先定好这个短密钥 $K$ 和扩张函数 $f$ 即可。

那么这个函数 $f$ 应该满足怎样的性质呢?应该怎么选择呢?这里面的学问可真不少。

时间: 2024-10-12 23:21:17

谈谈流密码的相关文章

谈谈对CAP定理的理解

谈谈对CAP定理的理解 CAP定理的常规解释是任何分布式系统只能在一致性(Consitency),可用性(Availability)和分区容忍性(Partition Tolerance)中三选二.这个解释很让人费解,笔者在看了一些文章后谈谈我对它的理解,还请斧正. 从问题出发 假设我们用一台服务器A对外提供存储服务,为了避免这台服务器宕机导致服务不可用,我们又在另外一台服务器B上运行了同样的存储服务.每次用户在往服务器A写入数据的时候,A都往服务器B上写一份,然后再返回客户端.一切都运行得很好,

谈谈我眼中的安徽企腾信息技术集成有限公司

在这里工作一段时间后,说说自己眼中的安徽企腾,我尽量本着客观的原则,不带任何主观因素与感情色彩. 首先,先说说规模,所谓的分成售前与售后,其实就是虚张声势,售前不过是一些笔记本的售后维修,售后与售前基本上没什么关系.而售后,销售加上技术,最多时也不过7个人.平时一些项目,大一点,一些不能做的直接外包出去,小一点的项目,所谓的"施工队",就是全体总动员. 公司里做了好几块业务,其中一块是飕飕商用路由,刚开始,想的是多么好,但是最后却被浇了一盆冷水,市场根本不接受,唯一做了一家宾馆,还是连

谈谈JS里的{ }大括号和[ ]中括号的用法

谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了. 一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数. 如:var LangShen = {"Name":"Langshen","AGE":"28"}; 上面声明了一个名为"LangShen"的对象,多个属性或函数用,(逗号)隔开,因为是对象的属性, 所以访问时,应该用.(点)来层层访问:LangShe

《谈谈认同》这个文章有点晦涩 写的不太好

认同是一个人主观能动性的一个影响因素.至于人的主观能动性还有什么影响因素,先不讨论,而且我也没学过也没想过.在可选择事物的主观能动性上,认同应该算最基本也是影响最大的了.回到主题,我们来谈谈认同.        认同有三个表现:第一.口头认同.第二.行动认同.第三.心理认同.简单的理解,就是口头认同只说认同,但不做,事前一套事后一套.行动认同就是说也说了,干也干了,但心里不这样想.心理认同就是口手心合一.但我们都清楚认同其实从本质上讲只有一种,就是心理认同.只有心理认同才是真正的认同.但是在工作

谈谈vector容器的三种遍历方法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! vector容器是最简单的顺序容器,其使用方法类似于数组,实际上vector的底层实现就是采用动态数组.在编写程序的过程中,常常会变量容器中的元素,那么如何遍历这些元素呢?本文给出三种遍历方法. 方法一:采用下标遍历 由于vector容器就是对一个动态数组的包装,所以在vector容器的内部,重载了[]运算符,函数原型为:reference operator [] (size_type n);所以我们可以采用类似于数组的方式来访问vector容

谈谈怎么使用JSONP

JSONP是什么,其实它是目前主流的实现跨域通信的解决方案. 因为我们都知道,在我们使用ajax去发起HTTP请求的时候,是不可以跨域的.也就是不能在不同域名下.端口等去请求.如果我们强行这么做的话,它是会报错. 这里举个例子. function createXHR() { var xhr = new XMLHttpRequest(); return xhr; } function ajax(url) { var xhr = createXHR(); xhr.onreadystatechange

你读到了什么:谈谈阅读的空与实

開始写点文字后,有些文章有人留言评论说:「都是些空话,正确的废话」,而有些文章有人又会留言评论说:「就喜欢这种.满满的干货.实在」. 究竟什么是空还是实蛮让我困惑的,思考了一段时间后今天就想谈谈我从阅读文章中究竟读到了些什么? 不管是别人评价是空话还是实在,于写作者我而言仅仅负责将自己思考后的观点清晰的表达,而至于是用「干货」还是「湿货」的形式来表达事实上取决于支撑观点的内容本身. 代入去想我知道评论说文章太空的人本身对阅读的期待是能从中收获实用甚或立马用的上的东西.凡是怀有相似期待的读者多半是

从面试题谈谈js的闭包,原型

最近群里有小伙伴分享了两道面试题,这里我谈谈自己的理解,废话不多说,上第一题: var n = 10; var obj = { n:20, fn:(function(){ this.n += 2; n *= 3; return function(){ this.n *= 2; n += 1; console.log(n) } })(n) } var fn = obj.fn; fn(); obj.fn() console.log(n,obj.n) 这个题目中,定义的obj对象的fn属性是个自执行的

谈谈我对Linux系统学习的历程回顾

众所周知,Windows 和Linux 是目前最流行的2个操作系统.Windows系统适合普通用户,它的优势是图形化界面,简单易用,使用起来门槛很低,很容易上手,所以,windows占有了大多数普通用户群体.而Linux 被誉为黑客的操作系统,因其稳定和命令行操作的高效性而广泛用于开发工作,占有绝大多数开发者群体.当然,关于这两大系统的优缺点,这里就不再赘述,我主要想谈谈我的Linux的学习历程参考书籍<Linux就该这么学>和心得体会. Linux初体验 一年前,我还不知道Linux为何物,