@
binux 所以说了,你得加入一大坨*独立于*编码手段的对不同涉众有特异性的假设,才能让一种并没有密钥设计的编码系统用起来显得像是起到了加密的作用。一旦这种假设不存在,任意公开了编码表的 Base64 和 Base64 变体这样的具体编码方法都没法实现隐藏密文无法被任意解读的目的。英文维基中 encryption 的解释中,in such a way that only authorized parties can access it and those who are not authorized cannot 明确指出了实现这个目的应有的性质:保密性。
上面是我一直重申的关键理由,也是你想象中的定义(中文维基定义)少掉的解释不清楚的部分。
就你的例子也可以说明一些问题:印第安语之所以能实际地作为“加密”手段,就是因为你可以预期只有特定的授权方——接触密文并且懂印第安语的——才能解读密文,这是一种和印第安语自身无关但比较容易实现的假设。而换用 Base64,你如何实现这个性质?除非有人肉 Base64 解码大师并且这正好是你需要授权访问的对象,Base64 的“密文”一眼看过去*对谁来讲都是同等不可读的*,何况(上面 @
no1xsyzy 提到过)这种文本表示的 Base64 的编码特征实在太明显了,不靠谱到对不特定访问者来讲几乎都能一看就知道解码有戏,甚至立刻猜出来需要尝试的解码方式;把成功解码 Base64 视为解密,比翻译自然语言还简单,怎么看都不够格跟印第安语比嘛。
关于置换编码表的变体,确实存在一些方案,但是比起任意的置换编码表来讲显然是极少数。这些变体编码方案叫 Base64 是因为和原始的设计有历史渊源,而不是因为编码表指定了多少编码索引。或者说,和你理解的不同,符号表还就是 Base64 的一个部分,只不过不同变体可能稍微调整而有不止一个;但也仅仅“不止一个”,*不是随便你改完以后还能叫做 Base64*。不限制编码表具体编码的这种编码结果,*可以称为 radix-64 表示,但不太可能恰好是 Base64*;任何你找得到叫做 Base64 编码的总和也只是其中的一个很小的公开的真子集。因此如果明确保证用 Base64,所有这些变体也太弱了——暴力遍历这些公开的编码方案中的解码操作即可破解。由于已知密钥的授权方解码 Base64 本身已需要解码开销,授权方和未授权方所需要的计算开销基本上只差一个小的常数( Base64 方案数),实际上没法靠解码成功区分授权方和未授权方,因此保密性不存在。
(其实就魔改加密的目的上说,因为 US-ASCII 是 7-bit 编码,octet 要凑成 8-bit,input padding 这里搞不好花样还能加不少……但非对称加密和 PKI 到处都能用的场景下为啥要自己搞这种吃力不讨好的事呢。)
至于 RSA 算法,前提就要求选取的质数不能都公开了(否则分分钟算出私钥),自然也不能是小到随便能猜到的……非要说小质数的前提下算不算能实现加密,那么确实不算。但这和说 RSA 有效地实现加密是两回事,后者指 RSA-n ( n 可以任意地长)不能在合理资源内成功攻击;如果 n 足够小,你的确可以说这样的 RSA-n 没有资格称为加密算法。只不过就密码学目的来讲,对不确定的 n 分析,犯不着单独算成特例排除而已。
@
epicnoob 是同义词又不是等义词。