平形加密法
维基百科,自由的百科全书
目录 |
[编辑] “平形”加密法
——当事物失去特征时,你将无法描述,也无从辨别。
文章中,当某些字被替换成不同的字后,你如何理解文章的内容?两种可能:一是被误导,二是不知所云。当大量常用的字都被替换了,你能有办法复原文章的内容吗?答案是:No passable!因为它很可能是另一篇文章。
[编辑] 加密原理
- 用一个字串(密钥)循环平移文章中每一个字,使得有含义的文章变成无含义或它义的文字。由于平移后密文仍为正常的文字,所以密文仍可以像普通文本一样正常传输、压缩、甚至加密。
- [注]:这一般仅适用于字含义的加密,对于含有逻辑结构信息的代码文档意义不大。
[编辑] 加密要素
- 原文 + 密钥 + 字表 = 密文
- 字表:值的集合,用于枚举需要加密的字符。变数:字、字数、字序。
[编辑] 算法约定
- (以最简单为原则)
- 密钥为值数组,数组单元称为密钥字,单元值称为钥值。
- 原文中的处于字表内的字称为待密字,该字在字表中的序号称为字值。
- 逐字地,用密钥钥值对待密字值加值变换,取模值为替换字在字表中的位置,替换字即是密字。
- 密钥值串循环使用(连续,无跳跃),直至待密字处理完毕。
- 补充说明
- 待密字值其实也可以直接采用字符本身的值,同时约定一个固定的字表,如中文GB2312的一级简码区汉字,这样会使得计算更简单。但如此字值就与编码有关,同时字值也必须是连续的。为通用性,此设计字表为任意的字集合,字值取它在字表中的序号。
[编辑] 字表方案
- 整集
- 即原始文本包含的所有字符。依不同的文档而有区别,但一般地,英文文本应该肯定包含[a-zA-Z]52个字母。
- 特集
- 任意指定的字集。可能仅包含一些用户觉得必要的字的一个小的集合。或者,随机的取整集的一部分。(推荐)
- 标点集
- 文章中,常用标点和空格(西方语言)起着断句和分词的作用,这明确地表达了文本的结构信息,明显地,密文应该隐藏这一信息。所以作为推荐,这是一个应该必须包含的集合:
- 半角空格、半全角逗号[,,]、句号[.。],计5个字符。
- 可选的,还可以包含:
- 冒号(::)、引号("“”)、分号(;;)、顿号(、)、书名号(《》)等等。
- 另外,根据文本的特点或需要,还应该包含如下有明显前后关联意义的符号:
- -> 标示前后可能是数字的百分号(% %)、运算符(+ - * /)、货币符号;
- -> 在现代信息世界里传达URI信息的正斜杠(/)、邮件地址符(@);
- -> 代码世界中常用的逃逸字标识符反斜杠(\)、xml实体标识符(&)等等。
- 全集
- 包括文档所属语言的全部有效字符,不推荐。它除性能不佳外,加密效果(迷惑性)也不好。
- 子集
- 相对于规范的编码系统命名,如中文的一级简码区汉字。
- 补充说明
- 由于算法极为简单,如果字表公开,我们可以直接从原文和密文得出密钥。而在某些情况下,字表是应该公开和通用的。所以,我们不应该去加密已经被知道原文的信息,因为这样就等于告知了我们用于变形的密钥(呵呵,当然,既然原文已经被知晓,那也就没有去加密的必要了)。
- 加密的原始信息应该是破解者未知的,或是可变的。如银行帐号,它可能由可变的数字和固定的前缀字符组成,而前缀字符肯定广为人知,如果对这固定的前缀字符也加密,同时用于该算法的字表为公用,当破解者怀疑你的密文是银行帐号时,他就可以轻易地解出用于这几个固定字符的密钥。
[编辑] 应用提示
- 1、不推荐字表中包含换行符。
- 换行符普遍存在于一般文本中,它让文本看起来清晰而有条理,但由于字符变换的随机性,所以会有大量的换行符被替换成非换行符,使得变形后的密文行数大量减少。这样既使得文本杂乱,同时也降低了密文的迷惑性。
- 如果换行符不在替换的候选字符中(字表),我们甚至可以编辑密文——如删掉多余的空行而不会影响后来的解密过程。(当然,可以删掉所有不在字表中的字符而对解密无影响,但要记住众多不在字表中的字符应该是困难的,而且也好像无此必要?)
- 2、加密后的文件大小可能会有些变化(虽然字符数没变),它取决于文本的编码环境和替换字有哪些。
- 在多字节编码环境中(如MBS或UTF-8),如果我们在一个字表中同时包含单字节字符和多字节字符,则对于单字节字符较多的原始文本,变形后的密文文件会增大。而对于多字节字符占绝大部分的原始文本,则很可能密文文件会稍小一些(不会小太多,因为相对于单字节字符,多字节字符数量要庞大得多)。
- 所以,如果很在意文件的大小,可以另外定义一个只包含单字节字符的字表,而多字节字符定义在另一个字表中,两者不同字。然后对原始文本参照两者各处理一次即可。这样,文件大小基本上就不会有多少变化了。
[编辑] 参考文献
- 黄忠惠 《平形加密法》 2005.12.30.(本人创作并声明为GNU FDL版权)