百科问答小站 logo
百科问答小站 font logo



用无理数加密,如何破解? 第1页

  

user avatar   kuang-qi-84 网友的相关建议: 
      

先说结论:题主设计的算法是没有应用价值的,但思路有可取之处。


现代密码学中的加密算法可以分为两大类,分组加密流加密。分组加密例如DES、AES等等,是用同一个密钥对数据分块加密。而流密码例如RC4、RC5等,是通过一个流密钥发生器,不断产生新的密钥流,然后与原数据做异或运算实现加密。题主设计的这个算法,其实就是流密码的思路。这一点目前所有的回答都没有指出,我感到非常的意外和困惑。


题主的这个算法不具有实际意义的原因,大家基本都已经说得比较清楚了。那就是你无法有效地计算一个无理数。让我们来看一则新闻:

Yahoo科技公司的尼古拉斯·苏使用Yahoo的Hadoop云计算技术将以前的π值计算的记录位数整个翻了一番,达到2千万亿位,这次计算在Yahoo公司1000台电脑上运算了23天,相当于单台电脑运算500多年的工作量。

听起来好厉害,我们看看这个数有多长,2,000,000,000,000,000位,好厉害,假设加密一个字节用1位,可以加密2000TB的数据,好像又觉得不是很厉害了。一台电脑,算500年,只能加密2000TB的数据,那我要把我的2TB移动硬盘加密一下,要不间断地算上半年!


=======================================

这个问题至此就回答完了,重新贴一遍结论:

题主的这个算法没有应用价值,但思路有可取之处。

=======================================


=======================================

以下内容受到诸多网友质疑,我进一步说明一下


感谢各位知友的提醒,题主这个算法的主要问题在于试图使用一个[0, 9]的噪声去覆盖[1, 26]的字母甚至是[0, 255]的整个字节。要想隐藏原始信息,我们需要改变原始信息的分布特性,而一个[0, 9]的随机数是不足以做到这一点的。通过对图像像素的变换,我们可以清楚地看到这种不完全的覆盖,还是会让原始信息的一些蛛丝马迹泄漏出来,甚至是严重地泄漏出来。


我不认为我的答案是具有误导性的,我首先指出了题主的算法在性能上的巨大缺陷,开门见山地指出了其不具有实用价值的事实。第二,我使用了对图像像素进行『加密』的方法,直观地演示了用较小的随机数变换较大的原始数据会导致的安全问题。其中『计算无理数』和『(一个字节的)原始数据与(一个十进制位的)随机数做加法』两个关键点都是由题主明确指出的,不是由我恶意曲解的。其中『计算无理数』的主要问题是性能低,『做加法』的主要问题是会导致信息泄露。上面引用的新闻说明了第一点『性能低』,下面的实验说明了第二点,也就是『信息泄露』。


我说题主的算法是不安全的,我仍然这样认为,因为『算法』这两个字就表示了从随机数生成到应用随机数加密的整个过程。我没有试图说明OTP(一次性密码本)是不安全的,如果说我的回答有问题,那我只不过是没有指出恰当地应用OTP是安全的,而只是证明了不恰当地应用OTP是不安全的。而对OTP的不恰当应用,是题主的问题,我只不过是编程实现了题主描述的算法。

========================================

以下是原答案的后半部分,可以探讨,不要喷

========================================


然而遗憾的是,题主这个算法的问题还不仅如此。一个加密算法,其安全性的保障来自于2个特性。一是“混淆”,二是“扩散”。混淆大家都比较容易做到,然而扩散就不是那么容易了。为了证明题主的算法不具备“扩散”特性,我专门编写了一个程序来进行了实验。我去网上找到了圆周率100万位的数表,删掉了小数点,存在一个叫做pi.txt的文档里。我们要使用这个数表对512*512像素的Lena图进行加密。图片设置为灰度模式,每像素8位(1字节),每像素使用一个pi的数位来加密。


加密前的Lena女神是这样的~



加密之后的Lena女神是这样的:


。。。。。。。。。。。。



加密的核心代码大概是:


       int c = fgetc(fp) - '0'; pImg[0] = (pImg[0] + c) % 256;     


加密后跟加密前几乎没有区别。如果你仔细观察,会发现加密后左上角的灰色背景上的一些噪声好像被增强了一些。这并不是因为我的程序写错了,而是因为对一个字节加密时,一个字节的取值范围是0~255,而加上的数字只可能是0~9,加上的数字比本身的数字可能小2个数量级,所以加上跟没加几乎没区别,照片看起来就没啥变化。


如果就这样否定了题主,我觉得还是不够有说服力,我们既然发现了问题,不如就解决一下。我们把一个字节拆成两半,也就是4位,然后分别加密,这样十进制的取值是0~15,跟0~9在一个数量级上了。也就是说每个字节使用2位pi的数值来加密,代码大概是这样的:

       int c = fgetc(fp) - '0'; unsigned char low = (pImg[0] & 0x0F); unsigned char high = (pImg[0] >> 4); low = ((low + c) % 0x10); c = fgetc(fp) - '0'; high = ((high + c) % 0x10); pImg[0] = ((high << 4) | low);     


现在再来看看效果,加密后的图是这样的:



哇塞酷!变成一坨了!但是仔细看一下,其实还是能够看出图像中人脸的轮廓,这个加密过程其实主要破坏了图像的低频部分,而对高频部分影响较小,使得我们仍能识别出Lena的五官、头发、草帽穗等高频元素。

我们再试试另外一张图



加密之后变成:


尽管加密后文字变得很难识别,但是用力看,是可以大概识别出文字内容的。如果我们把上面的这张图扔到Photoshop里调整一下色阶:


呵呵。。。一个可以使用Photoshop破解的加密算法。。。


祝题主好运~


==========分割线===========

下面回答网友们的疑问~!


@笨蛋小明 说,把加法换成异或是不是就看不出来了。答案是否定的~!而且即使你找到了一个猥琐的运算,使得加密后的图看不出来原来的东西了,也并不能证明算法是安全的。一个算法不具备”扩散“的特性,不管你采用加法还是异或还是什么奇葩的方法,它都不具备”扩散“特性。我还就真的写了一个异或的版本,下面上图~!!


加密的程序核心部分是这样的:


       unsigned char low = (pImg[0] & 0x0F); unsigned char high = (pImg[0] >> 4); low = ((low ^ c) % 0x10); c = fgetc(fp) - '0'; high = ((high ^ c) % 0x10); pImg[0] = ((high << 4) | low);     


上面那两张图加密后的效果是这样的:


以及



这不还是坑爹吗!!!


感谢 @刘巍然-学酥 大牛提出的算法,我又做了一个实验,每个字节使用8个数加密,奇数为1,偶数为0,8个小数位对应8个二进制位,形成一个字节,再与原图异或,确实取得了非常理想的加密效果,肉眼不能识别,而且直方图也基本上是均匀分布的。这样做应该是一个OTP的效果了,所以如果使用正确的话应该是可以安全加密的。

然后再附上加密程序的核心部分


       unsigned char mask = 0; for(int b = 0; b < 8; b++) {     c = fgetc(fp) - '0';     mask <<= 1;     mask |= (c & 1); } pImg[0] ^= mask;     


user avatar   liu-wei-ran-8-34 网友的相关建议: 
      

存在主义哲学认为人的存在是先于本质的,所以说先有了存在,然后才有了各种标签,含义,分类,角色,也包括所谓的生命的意义。

我们是自由的存在,能够思考,感受和行动,因此存在主义的角度来回答这个问题,会认为我们活着的意义是由我们一生中所有的选择组成的。当我们即将离世,回顾人生时,或者当我们在任何一个时刻回顾自己的生活时,你都会发现你如何看待自己的生活,你的人生迄今为止的意义是什么,都是由各种大小决定来界定的。

每个人只要活着,不论以怎样的方式活着,那么她所做所想所选择的所有东西,都是在不断地为自己的存在赋予意义。换句话说,活着就是一个不断地变成(becoming)的过程,我们在不断走向我们将会变成的那个样子,但是具体要变成什么样子,又是完全由我们自己来决定和支配的。

所以存在主义里面会提到存在主义焦虑这个概念,这种焦虑就是源自于我们必须完全为自己的存在意义负责。一个很经典的例子就是当我们站在悬崖边时,唯一阻止我们跳下去的是我们自己的选择和意愿。我们承担着很沉重的负担,因为我们的生死,哀乐,兴衰,都是我们自己来负责的。

Erich Fromm在《Escape from freedom》里提出,存在的自由是沉重的,因此我们会想要逃离自由,想要选择一些现成的框架和体系来替代自己定义自己存在的意义。因此有的人选择了宗教,有的人选择了逃避思考,过的糊里糊涂,还有的人选择了到知乎上来问人为什么活着这样的问题 :P

我自己也曾经特别渴望别人能够给我一些现成的答案,然后我再照着这个答案去努力就好了。但是比较不同人的生命轨迹,你会发现那些看上去循规蹈矩的人,他们生活的意义会趋于平淡(至少是在我的评价标准来看),而那些活得比较非主流,路线比较小众而大胆的人,他们的人生意义却非常清晰明确。

所以说当很多人思考人为什么活着这个问题的时候,我想一个更重要的问题是:在尝试找到活着的意义时,你有两个选择,一个是自由定义自己的人生意义但是会比较辛苦,另一个是让别人来帮你设计人生旅程但是会比较平庸,而你更倾向于哪一种选择?

很多时候,每天混着日子过,不想自己活着是为了什么,是一件很轻松的事情。混日子是一个我们明知道不好但是忍不住做的事情,因为混日子的确可以让我们更加放松。我曾经在企业里面工作的经验就是如此,一天天很快就过去了,不用想太多,精神上总体是比较慵懒舒适的。可是我无法忍受长时间如此,因为我的思维或许过于活跃,我无法停止思考和探寻。

反过来,如果你像我一样选择了一种非主流的生活方式(创业,独自工作,小众专业),那么你可能会需要承受很多孤独,自我怀疑和挑战,但是你会更加清晰地看到自己生活的意义和乐趣所在,你也会更加在乎自己的热情和兴趣。

延展阅读:关于人生意义的问题,Viktor Frankl的《活出生命的意义》一书给我启发很大,推荐给好奇宝宝们。




  

相关话题

  《黑客帝国》中的先知是人还是程序? 
  为什么大家都说程序员需要好键盘? 
  为什么操作系统不能屏蔽底层的架构(arm,x86,mips),为应用软件提供一个统一的运行环境呢? 
  GPU 与 CPU 比较,为什么说 GPU 更适合深度学习? 
  非计算机专业学生怎么走上计算机技术之路? 
  为什么最后 1% 的进度条很难加载? 
  分析、抽象代数这种课对搞 data science 帮助大吗? 
  你写过哪些比较酷的十行以内的 Matlab 代码? 
  是不是机器学习的框架都偏向 Python ?如果是,为什么? 
  如何评价清华大学刘知远老师? 

前一个讨论
花费高额学费去英国留学,但是以后很可能得回国找工作,这样的留学有意义吗?
下一个讨论
如何回答「你们九零后吃过什么苦」这个问题?





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利