首页
社区
课程
招聘
[原创]实用流密码文件加密
发表于: 2015-11-21 22:49 9503

[原创]实用流密码文件加密

2015-11-21 22:49
9503
  这里介绍一套适用于计算机的文件加密方法,实际要做好信息加密不需要什么高深的数学知识,有中学数学就够用了,考查多种加密方式认为流密码加密方式是最好的,这里的加密方法属于流密码加密但不需要线性反馈位移寄存器,那东西限制了普通计算机用户的应用,又因为分组密码方式不但是自找麻烦而且限制了自己所以不被采用,又因为非对称密码的加密方式技术还不成熟速度太慢也不采用。本方法用户密码长度不受限制,但是用户密码不能过短,这是因为用户密码是完成加密的重要参数,如果信息量太少则不能形成千变万化的状态,那样就不能很好地隐藏秘密了。这里的方法关键是建立强有力的密钥数组,它的每个成员都是独立的未知数,所以用分析法解密要完全失败的。
第一节 加密原理
  信息加密技术实际是信息隐藏技术,好的加密能保护信息不被没有授权的人读懂。任何信息都可以用数字表示,所以信息加密一般落实到文件加密。所有各类文件都可以是加密对象。
加密原理很简单:
  就是用未知数来隐藏被加密对象数字而已,设A是被加密对象一般称为明文,一个明文没什么用处,而明文数组则可能是文章或可执行程序或是媒体文件等等,一般文件都可以用字节作为元素。明文是有可能被看懂或识别的,例如字符文章等,也可能是乱码。B表示未知数,一般它和明文有相同的数字单位也就是字节,C表示加密结果的数字,这里用加法加密,当然也可以用别的运算符但必须有相应的逆运算存在。
          A + B = C
  这是一个数字的加密,可见只知道C不知道B是无法知道A的,两个未知数一个方程无法求解。对于一组数字则有:
          A1 + B1 = C1,A2 + B2 = C2,...An + Bn = Cn
  这样明文数组A1,A2,...An被未知数组B1,B2,...Bn加密成了密文数组C1,C2,...Cn。一般未知数组被称为密钥数组,解密是加密的逆运算。如果密钥数组只是用一次,并且密钥数组元素之间没有任何关系这样的加密是不可破解的。那为什么有的加密可以破解呢?
  从上面可见密钥数组和明文数组是一样长的,如果文件长了就很不方便管理密钥数组。现在的常规方式是用户提供“用户密码”,加密程序根据这些数据用一些算法拓展这些数据制作一个密钥数组,密钥数组长度是密码数组的几千倍几十万倍或更多倍都是有可能的。由少量数据生成大量数据总是有漏洞的,根据这些漏洞理论上是能破解密钥数组的,破解者除了得到密文还可能得到加密软件甚至加密程序的源码。
  所以加密者努力寻找好的算法避免缺陷被利用,解密者则努力寻找漏洞突破封锁。
第二节 密钥数组的建立
  鉴于文件是以字节为单位,密钥数组也是以字节为单位,我们知道字节是八位二进制数,数值从0 到 255,共计256个元素。我们要建造的密钥数组是:分布均匀的,数据之间毫无关联的。这样才能确保被加密数据的安全。
  构造法建造密钥数组:字节数组的基本元素就是256个,要建造 N个数据的密钥数组,为了分布均匀,设k为一个整数,让256×k大于等于N并且256×(k-1)小于N,这样每种元素取 k个,做成一个长度为256×k的数组,我们要将这些数据搅拌均匀,最后取N个即可。数组最初的状态是什么样都没关系,顺序排列的比较好形成,这样我们就有了原始数组。
  上面建立了元素绝对均匀的原始数组,现在我们设法将其变为乱码数组,并且数组成员之间是没有关系的,我们采用随机排序的方法,来打乱数组的秩序,随机排序就是让数组内的元素位置随机的交换,一般可以用循环来完成,例如256×k的长度的数组,用一个循环变量i,从头到尾的循环,另外随机的在256×k中选择一个位置,用这个位置的元素和第i个元素进行交换,这样循环一次每个元素都被交换了,交换完成后新的顺序建立了,生成了新的数组。从256×k中随机的选择位置的操作可以用随机函数来完成,也可以拼凑一些随机性较强的变数来完成,让随机函数值和一些变量经代数运算生成一个大数据,用此数据模256×k,就可以得到随机位置了。一遍随机排序不理想可以进行多遍,一般借助于优秀的随机函数一遍就足够了。我们这样控制随机排序,由用户密码的计算值做成随机函数的种子,这里只做最简单的叙述,实际应用时,你可以搞得很复杂,例如将数组分成若干段分别处理,也可以使用多个随机函数参与运算...,这些完成后你将得到一个长度为256×k的乱码数组,从中取 N个就达到目的了。
第三节 文件的加密和解密
  有了密钥数组应用加密原理中的方法就可以加密或解密了,这里是流密码加密方式,被加密文件是以字节为单位的信息流一般称为明文流,在得到用户密码后用第二节中的方法生成以字节为单位的密钥数组这是密钥流,用它们依次做加密操作则得到密文流可以保存于文件中这就是密文。密文可以保存或公开传播。密文可以在加密软件的帮助下,应用你掌握的用户密码,让软件将密文还原为明文这就是解密。
第四节 安全性问题
  加密算法是公开的、加密软件也是公开的安全性取决于你的密钥数组的质量,如果你的密钥数组各项是完全独立的则解密是做不到的。此种方法的理论基础是热力学第二定律——熵增加原理,当我们以多种方式影响数组的序列时,数组将向着更加混乱的方向发展而不可能相反。有人可能想若用穷举法长时间计算理论上就能破解,穷举法不是万能的,本方法用户密码不受限制如果密码长一些穷举攻击是徒劳的,你可以这样组织用户密码,它有相对固定不变的较长的前缀或后缀这样便于记忆和变化的部分,这样就又长又好记了,也可以通过关联大型密钥库或文件的方式来丰富用户密码,也是穷举攻击无法对付的。并且加密软件不检测用户密码的正误,因为任何检测都能帮助破解者,这样穷举攻击必须自己判定结果,这既费时又容易出错。另外还有专门对付穷举攻击的方法就不多说了。

  

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 39
活跃值: (2686)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你这个思路与RC4算法有啥区别?我看差不多啊。
另外,文字写了一大堆,不如来个程序干脆。
2015-11-22 12:08
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
RC4和我说的方法都不是最好的方法,最好是利用现成的优秀的随机函数例如MT19937直接加工作为密钥,想要解密比大海捞针还难得多。
2015-11-27 21:53
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
RC4算法的密钥数组形成过于简单,所以加密强度不高,我那方法如果使用多个优秀的随机函数,加密强度是会更高的。
2015-12-7 10:47
0
雪    币: 402
活跃值: (342)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
5
show me  the demo
2015-12-7 10:59
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
程序使用几个类似mt19937的随机函数作为备用随机排序的工具,程序通过用户密码的数值或衍生值确定选择使用其中某一个函数做排序工具...
2015-12-7 14:16
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不错,学习下,
2016-1-12 18:55
0
雪    币: 10014
活跃值: (2012)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
8
  流密码加密是不错的,不一定使用线性反馈位移寄存器来得到密钥串,用软件算法更灵活实用。
  采用一楼所说的“随机排序”方式实现的密钥数组,是分布均匀的,随机性良好的实现方法,这一点很容易用计算机来证明,例如你任意选择一个字符串,另外用同样长度的元素素材进行随机排序,你在形成的数据集合中总能找到你那个特定的字符串。
  如果密钥串是完全随机的,分析法和穷举攻击将毫无用处,例如你加密的是“我要去开会”,你穷尽所有可能时会发现,“我要去开会”和“我不去开会”出现的概率是一样的,你无法判断哪个是目标,最终什么信息也得不到;分析法也是因为没有规律性的东西而无从下手。
2016-1-14 19:14
0
游客
登录 | 注册 方可回帖
返回
//