比如一个非常有实力的公司的绝密专利技术内部存储的话,,,能不能自己造服务器,使用新造的字母加密 答: 从题主的问法看,你需要补足的知识还不是一般的多…… 好吧,看我从头给你科普。 你需要补足的第一个基础叫做“编码”。 恰好,我之前回答过这样一个问题:知乎用户:假如有无限种可能,一加一会不会等于三? 其中提到,对于“1”这个抽象概念,人类可能用“壹、一、幺、Ⅰ、①、one、un/une”等诸多光学符号来记录它。 事实上,每个人都知道,不仅“1”这个抽象概念可以用光学符号来记录,我们还可以用一个特定的音频序列(yi、yao、one等)来表示它。 学术点说,“抽象概念”可以叫做“所指”;而拿来代表这个“所指”的声音信号/光学符号则为“能指”。 我们可以进一步扩展这个关系:对英语这样的拼音文字,我们可以用一个三位十进制数字(实际小于128,本质上是7位二进制数字;计算机里,8个二进制位被称为一个字节)给它们编码——比如“a”的编码可能是“97”,“b”的编码可能是“98”……而阿拉伯数字“0”的编码则是“48”…… 事实上,这个编码规则就是:ascii - 国内版 Bing 现在,“ab0”这个字符串,我们就可以用“979848”表示了…… 换句话说,在我们这个“基于ASCII码的文本体系”里,“能指”“979848”的“所指”就是英文中的“ab0”——至于英文中的“ab0”这个“能指”真正代表着什么样的“所指”,需要根据上下文确定。 比如说,“ab0”可能是某款集成电路的某个引脚;那么,英文文档中的“ab0”、磁盘文件中的“979848”、电路中的“低高高低低……”,归根结底都是在说这个引脚。 这也是个典型的“编码现实事物”的例证。只不过日常生活中,我们把它叫做“起名字”——新发现个物种,给它起个名字;家里买了只狗娃,给它起个名字;你生了个小孩,也起个名字……嗯,就这么回事,没啥神秘的。 事实上,你的身份证号、银行卡号、工作单位的工号等等,也是国家/银行/工厂给你(的身份/账号)起的一个名字。 你已经有名字了,他们为什么还要拿数字给你起个名字呢? 因为你的名字可能和别人重复,区分不了谁是谁。所以才不得不拿数字按严格规则给你起个新的名字,确保一个名字对应唯一一个客观实体。 “按严格规则起名字”就是所谓的“编码”;编码的目的除了避免重复外,也可能有其它目的,比如方便机器管理等等。 注意编码和实体的对应关系只是一种约定。你是你,(在工厂里)你也是9527;和你同名同姓者犯了死罪,被枪毙的可绝对不能是你。因此切不可把编码本身和它代表的实体混淆。 类似的,我们也可以给每个汉字一个编码——汉字太多,所以至少需要16位二进制才行;同时为了和ASCII码区分,规定编码汉字的第一个字节必须大于等于128…… 著名的GB2312就采用了类似的方案:信息交换用汉字编码字符集_百度百科 再后来,随着计算机的普及,专家们又做了个巨大无比的编码表,把全世界几乎所有人类语言使用的文字符号编了进去——这就是著名的Unicode编码。 这个编码也有几种不同的方案。目前最常用的可能是utf-8。utf-8是一种变长编码:UTF-8_百度百科 计算机里面,一切都是二进制。 一切语言文字,都需要先编码成二进制才能被计算机处理(事实上,这些二进制码还会被转换成电路中的高低电平、信号的上升沿、光线的有无,等等);然后,这些二进制编码需要经过“解码”,最终才会变成我们人眼可识别的光学符号显示到屏幕上。 因此,所谓“独特的、无法输入的符号”是不存在的。 归根结底,所有符号都是一种编码而已;随便制定个编码方案就能把它二进制化。 其中,我们习惯的报刊/杂志/小说中使用的文字,属于“光学编码”;我们听收音机和人交谈,这叫“声学编码”;盲人用的盲文则是一套基于触觉的编码;莫尔斯电码则是利用长短对比搞的一套编码,从根本上说也是一种二进制编码。 不同编码之间可以相互转换——只要把代表相同意义的“码点”联系起来即可。 比如说,壹、一、幺、Ⅰ、①、one、un/une,这些来自相同/不同语言的光学/音频符号,它们的“所指”都是抽象概念“1”;假设我们不懂汉语也不懂英语,但只要把它们放进一组二维表里,从“壹”查到“1”,然后再从“1”查到“one”,就可以完成汉语到英语的翻译了——需要翻译到俄语/德语,说白了也不过是几次类似的查表运算而已(当然了,凑合能懂而已,语法结构就别想了)。 嗯,说的这么高大上,其实不就是查字典嘛。 很多古典密码,比如著名的凯撒密码,其实就是这种“符号替换”思路:凯撒密码 - 国内版 Bing 中国古代,武将出征时,也会和国君约定某本经典,比如《易经》;将来需要通报军情了,不直接写汉字,而是写数字:28 6 5 32 7 4…… 国君一看,哦,易经第28页第6行第5字,然后是第32页第7行第4字……拼起来一看,“救”“命”……(这段是胡扯的,我手边真没放易经) 这封信如果被外人抢到了,他不知道双方约定的是哪本书、哪个版本,就不可能明白这一堆奇怪的数字是什么意思…… 类似的,还有人脑洞大开,通过画小人来传信息——小人端正站着是字母A,小人抬左手是字母B……依此类推,就把所有英文字母编码了。 然后,外人搞到密信了,他还以为是一本武(舞)学秘籍呢:你看,第一招分明是黑虎掏心,第二招猴子摘桃,第三招过肩摔,第四招锁喉……咦?过肩摔了还怎么站着锁喉?其中微言大义实难索解…… 其实翻译过来可能是 I love U…… 但是,对近现代人来说,一切古典密码都是纸老虎——它甚至都不配叫加密,至多算是一种“编码”而已。 比如说吧,画小人的密码,我们可以统计它一共有多少个姿势,然后给每个姿势一个编号,于是就把它转换成“1、2、3...”了。 然后,我们知道,不同语言里面不同字符的出现频率是不一样的。比如英文里字符“e”出现频率最高,中文里“的”字最喜欢刷存在感…… 那么,如果加密前的信息是英文写的,只要我们多截获一些这类信息,很容易就能分辨出“编码23就是字母e”(中文类似,以后不再专门说明)。 此外,我们还可以“选择明文攻击”——比如,当年日军以“AF”指代中途岛,美国人大惑不解,不知道这个“AF”究竟是哪里:但根据种种蛛丝马迹可以断定,它或者是中途岛,或者是阿留申群岛。 于是,他们就故意放出假消息,说中途岛缺乏淡水;日本人果然上当,在机密情报里说“AF缺乏淡水”…… 中途岛战役(美日战役)_百度百科 你看,我甚至压根不需要懂你的语言,只需寻找你经常重复出现的“信号序列”(字符/语音都是一种信号);然后,把特定序列和现实世界的事物正确对应起来,你们在说什么,我就了解的七七八八了。 这个思路甚至可以拿来破解失传的古文字——归根结底,古文字也不过是已经消失了的某个古代民族对地球上各种客观事物抽象概念的“编码”嘛。 只要搜集的资料够多,搭配文字配套的图画(相当于“选择明文攻击”),很容易借助统计等技术手段,在正确的单词和它指代的事物之间连上线——甚至包括这种古语言的时态变化语法结构,都可能借此破解。 你看,理工科的思路总是这么简单粗暴、直指根本;你们想当然搞出来的虚头八脑,我们只当花架子看。 题外话:其实古典加密术也不单纯是这么简单的逐字替换,后期也有更为复杂、可以部分破坏统计学特征的一些加密方法。 到此,已经完全可以回答题主的问题了:自己制造怪异的符号能否影响破解?甚至像托尔金那样,自己设计符号、语法搞一套“精灵语”,能不能抵抗破解? 精灵语_百度百科 答案是,那至多算是编码,压根就不配叫加密。哪怕在古代都称不上先进;对现代人来说,那更已经是落后NNN个时代的技术了。 如果你这个符号体系创建出来、只用来向准女朋友传递一句I 【心】 U然后就没有然后的话,那的确拿你没办法。但想要像现在这样支持加密的日常通信……这种固定编码方案压根不存在任何保密性。 PS:以密码学视角看,二战中美军用的纳瓦霍语同样算是一种“古典加密术”;只是它采用了“音频编码”而不是“光学字符编码”,因此分析起来更难一些:不熟悉这门语言的外人甚至压根无法把未知语言录音里的一个个语素正确拆分出来,后续分析自然就没法进行下去了——尤其语音识别不够成熟的过去,给一个音频流分词本身就是个无法解决的技术难题。 好奇心旺盛的你可能会问,那,现在是怎么加密的呢? 嗯……这个问题可太大了。 真正“配”称为现代加密术的、又最易理解的,大概就是二战德国的ENIGMA机了:德国密码机ENIGMA的兴亡_图文_百度文库 这个机器只靠3个转子的不同初始位置便可以提供17576种不同的替换方案;三个转子间不同的相对位置又有6种可能性;每次加密前,先按照当日密钥设置转子初始状态(也就是从17576X6种编码表格中选取其中一组17576种方案、然后再从这17576种方案其中之一开始);每加密一个字符,转子旋转一格,替换方案便随之一变……除非连续加密17576个字符,否则不会像古典加密法那样出现重复(但哪有那么长的密信)。 事实上,ENIGMA还有个连接板,可以调整其上六条连线,从而使得替换方案的可能性进一步暴增到若干亿(不过,这个设计后来被图灵想办法抵消掉了,从而大幅降低了破解难度)。 面对这种怪物,“传统”的破解技术就彻底失去了效用——这种东西,压根就不是人力可破解的…… 不过,ENIGMA虽然一只脚已经迈进现代加密学的大门,但它的密钥空间还太小、加解密规则的漏洞还太多…… 人力不可破解?机器能破解岂不照样白瞎?! 不过,它的思路还是正确的:加密不仅需要把原始信息、信息的编码方案等等尽量扰乱,不要留一丁点信息给破解者;还要做到“可能性爆炸”,把加密者-破解者的对抗变成纯计算力的比拼——绝不能让破解者找出“可以节约计算力”的漏洞来。 如果打个比方的话,古典加密术就好像设计一个非常非常难的“华容道”游戏,解不了这个游戏你就打不开锁。 WIFI的“一键加密”就有个经典的漏洞:它把密码分成两部分分别提交,每部分4个数字。 换句话说,现代加密学把加密操作看作一个“函数求值”过程;经过数字编码的明文通过加密函数,被映射成密文编码。 对这个函数有很多很严苛的要求。最最基本的一点是,通过明文(+密码)计算密文要很容易;但如果不知道密码,从密文反推明文/密码就极端困难——满足这一点的函数被称为“单向函数”。 单向函数确保破解者需要付出许多许多倍的努力,才能揭破加密者隐藏的信息。这个“倍增效应”必须非常非常的大,比如加密时候的一个毫秒就要换加密者的几千几万甚至几万亿年,这才能使得攻击者不仅无法人力攻破,甚至利用专门的机械、电子破解工具也无法攻破。 典型如RSA,把几个大数字乘起来很容易;但要把它因式分解就不是一般的困难(你需要尝试用它去除很多很多的数字,这才有可能找出它的因子)。 前些年RSA还是用1024个二进制位的大数字;随着计算机性能的发展,现在已经普遍使用2048甚至4096位了——理论上说,凭现在计算机的能力,全世界的计算机一起跑几百亿年,都不可能破解2048位的密钥Just How Strong is 2048-bit SSL Certificate Encryption?。 和笨重缓慢的RSA原理不同,AES等加密算法只需128位密钥就可以达到相同甚至更高的强度;不过,RSA是非对称的公钥加密体系,适用领域不同,AES等对称加密算法是无法替代它的。 同时,现代加密还必须能够破坏明文的统计学特征(以及能量/时间特征),并且需要应对来自现代解密技术(比如差分分析_百度百科等等)的各种挑战,避免像古典加密术那样轻易暴露死穴,使得攻击者可通过自己的脑力找出突破点…… 举例来说,对DES这样的分组加密算法,“abcdefgh”这8个字节会同时替换成另外一组8个密文;你把它改成"bbcdefgh",哪怕只有一位的差异,加密后的结果也必须面目全非、绝无半点规律可言(此所谓“雪崩效应”)——如果做不到这一点,就很容易受到“选择明文攻击”的影响。 再比如,加解密算法比较两个字符串不能用“strcmp”或“==”,因为它们遇到第一个不同的字母就会返回。这样攻击者就可以通过提交-返回时间差估计自己猜对了多少。甚至,哪怕你自己设计strcmp,强制比较每一个字符,但条件跳转/分支预测等方面的细微差异也可能多少透露出一些关于密码的细节来。对于加解密这种敏感应用,这就是不可接受的。正确做法是逐字节异或然后检查结果是否为0,确保任何情况下消耗时间一致。 此外还有利用CPU消耗功率的细微变化、显示器信号泄露等等完成攻击的成功案例。这类旁路攻击与主题无关,就不多说了。 总之,现代密码学是一个非常专业非常高端的学科。没有足够的数学水平、计算机水平,甚至连理解的门槛都过不了,更不要说研究了…… 和过去“隐藏编码规则”就以为天下无敌的古典加密术不同,现代密码学可以说是一种“数学律武器”,它追求的是“自然规律上的不可破解”。 因此,现代密码学要求“加密算法公开”——只有经受过全世界最最聪明的大脑们的检验,才能确保“挑战它等同于挑战数学/自然规律”,才能确保它的安全。 RECOMMEND - 点个在看你最好看 - |
|