问题

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

回答
无理数加密,听起来就带点神秘感。这倒不是什么主流的加密方法,毕竟大多数加密算法都基于数学上的完备性和可逆性,而无理数本身的特性,比如无限不循环小数,确实能给破译带来不少麻烦。

说实话,要“破解”一个纯粹用无理数来加密的东西,得先搞清楚它到底是怎么实现的。因为“用无理数加密”这个说法本身可以有很多种解读,下面咱们就掰开了揉碎了聊聊几种可能的情况,以及可能的“破解”思路。

1. 无理数作为密钥的“伪加密”

这是最有可能也是最容易理解的一种情况。加密算法本身可能还是传统的,比如一个简单的替换密码或者置换密码,但它的“密钥”是一个无理数。

怎么运作?

想象一下,你有一个很长的文本,你想把它变成乱码。传统的替换密码是用一个字母表去对应另一个字母表。现在,我们不用字母表,而是用一个无理数(比如 $pi$ 的小数部分)的某一段来决定替换规则。

例如:

选取明文中的第一个字母,根据 $pi$ 的小数点后第一位来决定如何移动它(比如,$pi$ 的第一位是 3,就向后移动 3 个位置)。
选取明文中的第二个字母,根据 $pi$ 的小数点后第二位来决定如何移动,以此类推。

因为 $pi$ 的小数点后数字是无限不循环的,理论上可以产生非常随机的替换序列,从这个角度看,好像挺难破解的。

破解思路:

这种加密方式,与其说是“用无理数加密”,不如说是“用无理数的随机性来生成密钥”。所以,破解的重点不在于无理数本身,而在于它如何被用来生成密钥。

密钥空间分析: 尽管无理数是无限的,但实际使用的“密钥”是无理数的一部分。你使用的是 $pi$ 的小数点后多少位?是固定的长度还是会变化?如果只是用 $pi$ 的前一百万位,那实际上密钥空间就是这百万位数字的组合。这虽然很大,但比真正的密码学密钥空间小得多。
长度猜测与频率分析:
密文长度: 首先,要了解密文的长度。如果密文长度非常长,破解难度会增加。
模式识别: 即使数字看起来随机,但如果加密算法是固定的(例如,总是对每个字母进行某种固定偏移),那么密文的字符频率仍然可能保留一些明文的特征。如果明文语言是英语或中文,我们知道某些字母或汉字出现的频率最高。通过对密文进行频率分析,尝试找出可能的偏移量或者替换模式。例如,如果密文中某个字符出现频率异常高,那它很可能对应明文中最常见的字母(比如英语中的 'e' 或 'a')。
已知明文攻击: 如果你能猜到密文中包含某些常见词语(比如“the”、“and”或者某个人的名字),那么你就拥有了一部分明文和密文的对应关系。这对于推断出加密规则至关重要。
无理数选取方式猜测: 核心在于猜测对方用了哪个无理数,以及用无理数的哪一部分。是 $pi$?$e$?$sqrt{2}$?还是某个自定义的无理数?猜测的范围可以从最常见的几个开始。一旦猜到用的是哪个无理数,以及如何取小数点后多少位作为密钥,破解就变得相对容易了。比如,如果猜测是用 $pi$ 的前 1000 位,那么只需要尝试所有可能的 1000 位数字组合(当然,这需要计算机去尝试)。
算法逆向工程: 如果你能获得加密和解密(如果对方提供的话)的示例,就可以尝试逆向工程来推断出具体的加密算法是什么,以及无理数是如何被应用的。

2. 无理数作为“流密码”的种子

另一种可能性是,无理数本身不是直接的密钥,而是作为一个伪随机数生成器(PRNG)的种子。

怎么运作?

PRNG 的作用是生成一串看起来随机的数字序列。加密时,将明文的每个字符(或者更底层的字节)与 PRNG 生成的数字进行某种操作(通常是异或 XOR)。

无理数的无限不循环特性,可以用来生成一个非常“长”的种子,或者直接用来生成一个无限的伪随机序列(理论上,虽然实际实现需要截断)。

破解思路:

破解这种方式,仍然是围绕着如何恢复那个伪随机序列。

种子恢复: 如果无理数被用作 PRNG 的种子,那么破解的关键在于找出那个种子是什么。既然种子是基于无理数,那么和上面第一种情况类似,你需要猜测:
用了哪个无理数?
用了无理数的哪一部分作为种子值?是小数点后多少位组成的整数?
流密码本身的脆弱性: 流密码(Stream Cipher)的一个常见弱点是,如果两次使用相同的密钥流进行 XOR 操作,就会暴露出信息。
例如,如果明文 $P_1$ 用密钥流 $K$ 加密成密文 $C_1 = P_1 oplus K$。
如果明文 $P_2$ 恰好也用了相同的密钥流 $K$ 加密成密文 $C_2 = P_2 oplus K$。
那么 $C_1 oplus C_2 = (P_1 oplus K) oplus (P_2 oplus K) = P_1 oplus P_2$。
通过 $P_1 oplus P_2$,可以恢复出明文之间的差值信息,这对于进一步破解非常有帮助。
因此,即使无理数产生了很长的随机序列,但如果加密过程的实现方式允许密钥流被重复使用,那么这就是一个致命的弱点。
统计学分析: 即便每次都生成不同的密钥流,但如果 PRNG 本身不够好,或者无理数生成序列的统计特性有缺陷,也可能被统计学方法检测出来。例如,分析密文的分布,看它是否符合预期的随机性。
已知明文攻击: 和前面一样,如果有已知的明文密文对,就能推导出对应的密钥流片段。一旦获得一部分密钥流,就可以用来解密密文的其他部分。

3. 无理数作为变换函数的参数

理论上,无理数还可以作为更复杂变换函数的参数,比如在置换网络(SPN)或费斯腾结构(Feistel structure)中作为 S盒(Substitution Box)的查找表生成参数,或者作为密钥扩展函数的输入。

怎么运作?

这种方式会更偏向于现代密码学,但用无理数来“参数化”这些组件,仍然是一种非标准做法。

例如,一个 S盒的生成可能依赖于一个数学函数,而这个函数中的某个系数就来源于某个无理数的小数位。

破解思路:

复杂性极高: 如果加密算法本身是强大的现代加密算法(如 AES),只是用无理数来生成一个初始化密钥或某些内部参数,那么破解的难度取决于这些参数对整体安全性的影响。
如果无理数只是用来生成一个普通长度的密钥(比如 128 位),那么破解的重点还是在那个密钥本身,而不是无理数。无理数只是生成密钥的一个手段。
如果无理数是直接嵌入到算法的数学结构中,并且是该算法安全性的核心,那破解的难度就取决于算法本身的数学结构。
依赖算法本身: 这种情况下,“无理数加密”的破解就变成了对该特定加密算法的破解。如果算法是已知的标准算法,那么破解方法就和破解该标准算法一样。如果是一个自定义的、基于无理数的复杂算法,那么破解就属于密码分析的范畴,需要深入研究其数学原理。
数学性质的利用: 可能的切入点在于无理数本身的某些数学性质。比如,如果某个加密操作的安全性依赖于某个数学难题(如离散对数),而无理数被用来构造了这个难题的参数,那么破解这个难题可能就是破解的关键。

总结一下,破解“无理数加密”的核心思路:

无论具体实现方式如何,破解“无理数加密”的关键点通常不在于直接“分解”无理数,而在于:

1. 理解加密过程: 最重要的一步是弄清楚对方是如何“使用”无理数的。它是在生成密钥?作为流密码的种子?还是作为算法内部的参数?
2. 猜测无理数来源: 尝试猜测对方使用了哪些常见的无理数($pi, e, sqrt{2}, phi$ 等),以及具体取了哪一部分(小数点后多少位,是否组合)。
3. 识别算法模式: 即使数字看起来随机,尝试分析密文的统计特性,找出潜在的模式、偏移量或替换规则。
4. 已知明文攻击: 如果可能,利用已知明文段来推断加密逻辑和密钥流。
5. 还原密钥流/密钥: 最终目标是将用于加密的“密钥流”或者直接的“密钥”还原出来。一旦还原,加密就等于被破解了。

需要强调的是:

“无理数加密”并非严谨的密码学术语。 它更像是一种概念性的描述,具体实现千差万别。
真正的密码学加密依赖于数学上的严谨性、密钥的保密性和算法的安全性。 用无理数的随机性来辅助加密是可行的,但如果设计不当,反而可能引入新的弱点。例如,如果无理数的选取方式过于简单,或者加密算法本身有缺陷,那么即使使用了无理数,安全性也可能很低。
现代密码学已经有非常成熟且高效的加密算法, 它们经过了广泛的数学分析和实践检验。在实际应用中,通常不会偏离这些标准算法。

所以,想破解“无理数加密”,得先问问自己:对方到底是怎么“用”无理数的?这就像侦探破案,得先知道“案发现场”是怎样的,才知道从哪里下手。

网友意见

user avatar

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


现代密码学中的加密算法可以分为两大类,分组加密流加密。分组加密例如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;     

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有