首页
论坛
课程
招聘

解密就是个笑话

2020-5-9 10:56 2014

解密就是个笑话

2020-5-9 10:56
2014

  信息加密这里主要说文件加密,大家公认一次一密的加密是不可破解的安全加密,但为什么大家不用呢,因为那种加密需要和被加密文件一样长的真随机数,这样长的数据存放传递都不方便,而且获得真随机数也不太容易,所以一般不用。
  真随机数不好用,只好选择其它,调用随机函数可以产生无穷无尽的数,有个缺陷就是有周期性,好在一般周期都比较大,周期之内数据是不重复的,截取一段和文件一样长的不重复数据就可以加密了,随机函数生成的数组由于来自一套生成方式所以随机性并不好,被称为伪随机数,用它们来加密似乎不太安全,其实大可不必担心,因为随机函数的值只在运算内部出现,窃密者不掌握随机函数的应用起点即便知道了随机函数的运算结构,也不能从密文中得到任何有用的信息,既然如此加密依然是安全的。
  用随机函数加密一般也称为序列密码加密,这些伪随机数值形成的数组比真随机数组要好管理的多,它们几乎不占有空间,只要一个种子就可以调用了,实际是选择了随机序列的一个起点,那有人就想了,可以排查这个起点啊,如果你用两个不同的种子各引导一个数组再合并成一个数组的话,基本就很难寻找种子了,如果用两个随机函数参与建造密钥数组就更好了,有的随机函数周期长的吓人,例如Twister MT19937周期大约10的6000次方,找到的可能性几乎为零。即便是周期小的随机函数因为被加密的文件数据的影响密文也很难从那些小周期的随机函数重复性中得到些破解的好处。
  程序用随机函数加密一般是这样的:程序得到用户密码,用这些数据算出一些种子是很容易的事,有了种子用随机函数生成和被加密文件一样长的数组加密即可,解密就是将用于加密的数组请出来。通过上面的分析得知虽然是伪随机数加密和真随机数加密的破解难度不分伯仲,况且算出的几个种子可以使用几个随机函数同时参与加密或解密,这在程序里是易如反掌的,运算速度也是差不多的,解密难度确增加了不知多少倍。
  上面仅从随机函数加密文件说明想要靠分析法破解此类加密的密文是不可能的,至于穷举攻击有专门的方法对付这里就不多述了。



[推荐]看雪工具下载站,全新登场!(Android、Web、漏洞分析还未更新)

最后于 5天前 被sjdkx编辑 ,原因: 丰富内容
最新回复 (31)
下咯 2020-5-9 11:40
2
0
大佬ctf是咋回事,看他们用的都是一些主流的加密,怎么还能被逆出来,什么这个函数,那个方程我看了都头疼
Barrientos 2020-5-9 15:41
3
0
但凡有点花生米楼主也不至于醉成这样。随机函数不随机,加密的安全性不仅仅取决于加密算法的复杂度,还包括计算机算力、代码逻辑、代码安全性(第三方库安全性、自带库安全性)等等,安全攻击一直都是防御面的问题。
回复下楼上,CTF中的加密程序只是出题人设置好的有问题的加密程序,至于哪里设置问题要看出题人,在这个过程中能考察选手对加密算法的了解程度(大概率是考数学,是数学不是算术),当然更能考察这个选手是不是能坐的住
sjdkx 2020-5-9 19:02
4
0
打嘴仗是最没意思的,有本事解个最简单密文试试。随机函数是不怎么随机,即便如此您能得到任何好处吗?随机函数真只是个过程中的参数,从来也不单独出现。您们的看家本事就是穷举攻击,在长密码多入口下也是废柴,现代密码学只是混饭吃的东西。
Boring勇哥 2020-5-9 20:15
5
0

https://bbs.pediy.com/thread-257050.htm

最后于 2020-5-9 20:35 被Boring勇哥编辑 ,原因:
wx_沁沁她爸 2020-5-9 22:54
6
0
你们这些说大话的,现在都什么年代了,MD5 都给你碰撞出来。
sjdkx 2020-5-9 23:17
7
0
@Boring勇哥  一个字节凭空扩展成任意字节没见过这种怪东西,这种假设就是空谈,我举的例子是借助于随机函数丰富的信息量的,也很容易用现有的函数来实现,请不要拿些虚幻的假设来说事,那样毫无意义。
stand ot law 2020-5-9 23:27
8
0
能加密就能解密。加密的目的是为了让特定对象得到有用信息。如果对信息加了密,连接收方都无法解密,那直接发送垃圾信息给对方就好,反正对方也看不懂。
sjdkx 2020-5-9 23:50
9
0

再说一遍为什么不可破解

如果我用一个字符去加密另一个字符得到密文,谁也不能破解,因为这是一次一密。

现在改用随机函数来加密了,随机函数的妙处在于定义一个种子,就可以使用其后许多数值,并且可以使用多个随机函数,随机函数不同但种子可以是相同的,所以能用大量的数值去加密少量的明文,并且用户密码的用途只是算出种子而已,所以不用多长。这样的加密能破解吗?不能和一次一密媲美才怪。

sjdkx 2020-5-10 00:11
10
0
@stand ot law   一粒沙子藏在桌子上和藏在沙漠里的寻找难度相差太大了。不能找到也就是没解。
nengmao 2020-5-17 17:54
11
0
建议先看看PRG(伪随机数生成器) PRF(伪随机函数) 和PRP(伪随机置换)的区别
像流密码很多是基于PRF,分组密码很多是基于PRP,他们虽然跟PRG名字类似但是完全不一样的东西。如果你的另一篇帖子底下的一个大神发的逆向源码没错的话,你的算法只是设计了一个PRG
一个安全的密码学算法应该能一定程度上抵御唯密文攻击,已知明文攻击,选择明文攻击,选择密文攻击和已知文本攻击,攻击的强度是由低到高的,燃鹅你的算法似乎连已知明文攻击都防不了,因为你设想的安全场景局限于唯密文攻击
nengmao 2020-5-17 18:11
12
0

我再详细解释一下已知明文攻击吧,意思是一个密码应该能抵御这种场景:我知道密文及其对应的明文,要求是不能由此推断出密钥
那么你的算法如何推断出密钥呢,首先因为你的密码算法是公开的,所以攻击者应该能自己实现一套加密解密算法,包括随机数生成算法
你的加密流程如下:用户输入一个短密码(这里假设只有一字节)作为seed
key = Rand(seed)
ciphertext = Encrypt(key, plaintext, length)

这里是key是很长的,是你认为的不可被攻破的点,但你想想下面这种攻击方式

我现在有ciphertext和plaintext,只要
for(seed=0; seed<=0xff; seed++)
  key = Rand(seed)
  if( plaintext == Decrypt(key, ciphertext, len) )
    print("Cracked")

    print("seed= %d", seed)

只要这样就能直接算出用户输入的seed,密码也就算是被破解了

最后于 2020-5-17 18:15 被nengmao编辑 ,原因:
sjdkx 2020-5-18 00:31
13
0

你这样规定的场景,一个字节的密码,那用穷举攻击只要用从0-255个数值走一走就OK了。是不是太简单了。
我的程序也许是这样的,从那个字节的密码,用CRC16函数算出,一个整数当种子,用一号随机函数生成和明文一样长的密钥数组。还用那个字节用CRC32再算出一个整数以此为种子,用二号随机函数生成和明文一样长的密钥数组。不多说了就用这两个数组加密明文吧。你怎么求解呢,请说说高见。当然你还可以用穷举攻击,因为就一个字节的密码,不过那也太让人笑话了,你需要考虑如果密码是几个到几十个字节您怎么破解?

最后于 2020-5-18 00:53 被sjdkx编辑 ,原因: 详细内容
nengmao 2020-5-18 01:06
14
0
sjdkx 你这样规定的场景,一个字节的密码,那用穷举攻击只要用从0-255个数值走一走就OK了。是不是太简单了。我的程序也许是这样的,从那个字节的密码,用CRC16函数算出,一个整数当种子,用一号随机函数生成和 ...
你还是没懂我的意思啊。。。你提出的生成密钥数组的方法一切都是基于你的生成方法不为人所知(即从你所谓的短密码生成长密码的方法)。一旦有人知道你生成密钥数组的算法它只需要爆破你的短密码就能得到长密码,方法就是用与你的算法相同的程序从短密码生成长密码,再用这个长密码去解密,看看跟明文一不一样,如果不一样就继续遍历。这样只需要遍历完你短密码的密钥空间就可以爆破了,具体对应我上面回帖的伪代码,你所说的一字节密码对应seed,对seed求CRC16和CRC32并且初始化随机数对应Rand,使用两个随机数生成的序列解密对应Decrypt
你提出的这个方法跟流密码基本没有什么本质区别,只不过流密码没有所谓的短密码和长密码,或者说流密码的随机数种子本身已经够长了,从计算角度上无法爆破
然后如果你说seed是几个到几十个字节,那跟我们现在使用的密码有什么区别么。或者说你这个项目初衷不就是不用那么长的密码么(当然我上面那些话都是为了证明这样使用短密码的方法是不成立的)
fqbqrr 2020-5-18 08:23
15
0
好像有真随机吧.
fqbqrr 2020-5-18 08:24
16
0
楼主不要骗我.
野狼 2020-5-18 09:29
17
0
不管你怎么加密,你一定要给对方能解密出来。只要对方能解密出来,就可以破解。不要不信
koop 2020-5-18 10:20
18
0
哪有什么真随机啊,所谓的随机甚至还不如摇骰子来的随机呢
fqbqrr 2020-5-18 10:47
19
0
我就是给你的加密的东西呢.而且我就不打算让你们解密.你能解密吗?
fqbqrr 2020-5-18 10:47
20
0
连我也解密不了的,你能解密吗?
任蝶飞 2020-5-18 11:16
21
0
我们的老鹰又出来了么
Barrientos 2020-5-18 12:07
22
0
就喜欢楼主这样,建议推广全国
红颜小学生 2020-5-18 15:00
23
0
台湾那老哥学会简体字了?
sjdkx 2020-5-18 20:32
24
0

@nengmao 短密码如果只有一个入口,那不可避免的是容易受到穷举攻击的,而且因为密码短成功的可能性很大。我说的方法似乎没什么用。尽管方法中利用了长的默认密码,但只要短密码被攻破,后面都是程序自动运行的所以办法没用。还不如我以前提出的密码加后缀的办法好,这是爆破不能突破的,但穷举时也可以是加后缀的,所以后缀要经常更换才好。还有入口最好不要单一,增加一些选项每一选项对应不同的方法或参数,这样穷举攻击就没有决心了。我用的加密方法就是流密码,思考的东西也是不完善的,希望发现者指正,谢谢大家了。
寻找种子可不容易,有的随机函数周期特别长,找起来太难了。尤其是使用两种以上的随机函数。即便使用一种随机函数若用多个种子得到数组综合起来使用也是不好对付,你有多种加密方式,让用户密码的衍生值,去控制程序的走向是不错的选择,即使读懂了程序的方法也没有用,不知用户密码是没有办法的。
已知明文攻击在这里是无效的,这里虽然也是流密码加密,这里的流密码并不是直接使用随机函数当密钥,它有一个进一步随机化的操作,就是对随机函数形成的数组做随机排序,基本上确保了数组类似于真随机数,明温和密文之间没有逻辑关系,什么已知啊选择啊等攻击都不起作用。

最后于 6天前 被sjdkx编辑 ,原因: 丰富内容
敏而好学 6天前
25
0
没有解不了的密这是句哲学思想,为什么非要用自然哲学,去解读唯心主义?
nengmao 2天前
26
0
sjdkx @nengmao&nbsp;短密码如果只有一个入口,那不可避免的是容易受到穷举攻击的,而且因为密码短成功的可能性很大。我说的方法似乎没什么用。尽管方法中利用了长的默认密码,但只要短密码被攻破, ...
本身现在使用的流密码都是用类似的方法做的,即对于当前的密钥引入一系列变换(假设是F1 F2 F3等),输出无限长序列y = F1( F2( F3(key) ) ),这里的各个F和你说的控制程序走向类似,就是用来打乱输出中包含的有关于key的信息的特征,使其与真随机数没有区别
这件事的难点在于,所谓的与真随机数没有区别的理想情况是指这样一个伪随机发生器的所有统计测试与一个真随机数的统计测试结果无法区分
这里的统计测试不仅仅是所有随机数输出的值近似于均匀分布或者所有输出值加起来除以输出数量刚好等于输出范围的一半这种简单的统计指标,还可以是随机抽取n组长度为l的伪随机序列其方差要符合正态分布,对随机数序列求傅里叶变换之类的与真随机结果相似之类的
总而言之数学家和密码学家能想到的测试方法肯定比你自己想的要多,这也是为什么我觉得你想自己设计一个流密码算法安全性大概率是不行的
sjdkx 2天前
27
0
说的好像有理,其实即使随机性不好,您能从里面得到什么破解的信息吗?密钥的好坏不在于其随机性,而在于其未知性,随机性次之。一般的伪随机数经过变换都可以达到NIST那些标准,这样的东西与真随机数区别不大,用它们做密钥分析法无能为力,这就是安全的基础。唯一的出路是用穷举攻击,但使用长密码和多入口也能让次攻击绝望。
nengmao 1天前
28
0
sjdkx 说的好像有理,其实即使随机性不好,您能从里面得到什么破解的信息吗?密钥的好坏不在于其随机性,而在于其未知性,随机性次之。一般的伪随机数经过变换都可以达到NIST那些标准,这样的东西与真随机数区别不大, ...
流密码的安全性是基于伪随机数的,如果本身伪随机数不是安全的那么这个流密码也不是安全的,至于你所说的从里面得到破解信息,可以考虑这样一种办法
一个伪随机数发生器的种子长度肯定是固定的,假设这个种子长度有32位,再假设这个伪随机数生成器对于某种统计测试F可以与真随机数区分,那么可以对于种子空间2^32中所有可能的种子进行统计测试F,然后其结果与真随机数的结果的比较值(这个比较值应该是采用某种计算方式以正确反映两个结果的差别的值,比如,如果这个统计测试的方法是计算结果中出现1的概率,那么显然对于真随机数是0.5,而伪随机数可能是0.55,那么比较值算法可以是两者概率之差的绝对值0.05,或者可以是概率之差的平方,这样更能凸显出概率差大的部分)
那么计算完之后就可以打一张表,对应了这2^32个种子对于这种统计测试与真随机数的比较值
这时候如果我拿到了用这样一种伪随机数生成算法生成的密钥流(只知道密钥流但不知道原始秘钥,即伪随机数的种子),那我可以对这串秘钥流进行统计测试F,把得到的结果与真随机数的比较值算出,爆破的时候从上面打好的表中找比较值相近的值开始爆破,就可以显著提高破解的概率
虽然这个办法看似也需要遍历2^32的空间来打这张表,但这张表只需要打一次就可以用来爆破用同样一种方法加密的密码
上面只是其中一个可能的算法,真正的攻击可能还有很多种(不过再深入的我就不懂了
nengmao 1天前
29
0
nengmao 流密码的安全性是基于伪随机数的,如果本身伪随机数不是安全的那么这个流密码也不是安全的,至于你所说的从里面得到破解信息,可以考虑这样一种办法 一个伪随机数发生器的种子长度肯定是固定的,假设这个种子长度 ...
说了那么多其实说白了就是因为伪随机数对于统计测试F不具有随机性,因此可以对每个种子生成的伪随机序列计算统计测试F与真随机结果的偏差量,作为特征值,这样当你只能拿到一串伪随机序列但不知道种子时就可以用特征值来反推种子
sjdkx 21小时前
30
0
您考虑的太简单了。真随机数并不像你想象的那样可望而不可及。有一种谬论说计算机不能生成真随机数,根据热力学第二定律一个系统在各种因素的作用下只能向着越来越混乱的方向发展,一个数据串也是这样,一个元素均衡的数据串(不能太短否则数据没有统计学意义),只要不断的打乱其排列,就可以达到完全随机的程度,也就是各元素之间没有任何逻辑联系完全是独立的,用这样的密钥加密是不可破解的,加之我提出的使用长密码的方法,穷举攻击也就别想了。分析法和爆破都不灵那加密就是安全的。这也是解密是笑话的原因。
现实中真随机数组不可能存在的,因为现成的数组都不符合真随机数的定义,真随机数存在于其发生机制中,如果数据发生器生成的东西,看上去像乱码,不可预测,不重复,那它就是真随机数发生器。加密程序里有真随机数发生器,是不可破解的基础。
少妇之友 21小时前
31
0
talk is cheap show me the code
sjdkx 12小时前
32
0
没有什么复杂的只对数组做适当的随机排序即可。结果是可控的,但逆运算是不可能的。就如你去搅合几种带颜色的沙子,容易使其混乱,想让其恢复秩序就难了。
游客
登录 | 注册 方可回帖
返回