一种简单的纯手工汉字加密方式

这个纯手工加密方式仅供娱乐研究,如果在恶劣环境下没有电子设备,其可以用于短期内保护私密信息的安全。

“把纸条上书写的句子加密”是我在小学四年级想出来的点子,其实也就是密码学的最简单的一个雏形。当时并不懂那么多东西,先后想出来的几种方式使用字典对应汉字,重写字母表对应顺序,还有隔空书写再逆向填补(有点类似栅栏)。但最后都因为不方便、不灵活而成为Naive的想法。

下面介绍的这个方式是初二时我在物理课上开小差时想出来的,经过了数次改善,在初三时已经可以简单的传授给他人使用了。
严格意义上来说这并不是汉字加密,而是汉字混淆,通过混淆拼写顺序使中间人难以解读。本文介绍的是一种对称的算法。

加解密所需的工具只有脑子和手和笔,甚至不需要草稿纸即可完成加解密过程。

编码

汉字转拼音

这里要用到一个双拼键盘表,需要强记。我在这里以小鹤双拼为例子进行演示。

小鹤双拼键位图
小鹤双拼键位图

微信=wwxb; 蔡徐坤=cdxvky; 天安门=tmanmf.

声调

同时,利用字母的大小写变化来表示每个字的平仄

输出对应的汉字声调
ni第一声
nI第二声
NI第三声
Ni第四声

标点

在小鹤双拼的拼写规范中,有许多没有意义的字母组合方式。对这些组合赋予意义,我们可以用他们表示出标点符号。

组合对应标点组合对应标点
eaes:
ebep(
em......eq)
ew?ej换行符
ex!ed数据体终止符

我只给出一些我用的定义,至于哪个组合对应什么标点,你也可以自己定义。
EaeA是等效的,不区分大小写。
ed之后的数据为无效数据,在解密时应当抛弃。

示例

下面给出按以上编码方式转码的实例:
当时,具体管床的同事在我耳边嚼了几遍:艾主任,那个人报的是冠状病毒
dhuIeAJuTIGRiLdetSUiZdWOERbmjNleJIBmESAiVURfeaNagerFBcdeuiGrVlBkdU
12 月 30 日那天中午,
uIErytsjuIRiNatmvsWUea
值得注意的是,由于暂时只支持中文转码,阿拉伯数字需要您按中文阅读习惯输出拼音格式。

加密和KEY

为了兼顾加密效率和安全性,我们选用3x3的九宫格作为一个数据块,并以1~9表示秘钥。
(依照这个原理,你也可以以最多5x5为数据块并以a~y表示秘钥。)
秘钥由整数1~9组成,不可以出现重复数字
格式如下:
KEYNAME=00000000#(混淆参数h)
同时,顺便支持一下多KEY,可选用于提升安全性。

KEYNAME(循环参数c1)=00000000#(混淆参数h1)
       (循环参数c2)=00000000#(混淆参数h2)
       (循环参数c3)=00000000#(混淆参数h3)

循环参数正整数,用于表示循环次数。#混淆参数选填,在下一节会详细介绍。
一个人可以和不同的人约定不同的KEY,只要他们的KEYNAME不一样,就不会搞混。
KEYNAME也可以使用汉字或者任何符号,随你喜好。实际使用中推荐KEYNAME为中文字词,在表明对应KEY的同时起到纸上签名的效果,提高信息可靠性。

KEY值与填充轨迹一一对应,例如
exp=23568741 时,有效数据的轨迹如下图所示

单Key时的轨迹图
单Key时的轨迹图

多key时给出如下示例:
exp(1)=23568741 (2)=32145689,有效数据的轨迹如下图所示
多key时的轨迹图
多key时的轨迹图

依次按编码输出字符,混乱的数据就跃然纸上了

混淆

混淆指的是填充无效数据,使传输内容看起来更凌乱,也加大了破解的难度
混淆分为两种:

静态混淆

即使用随机字符填充数据块内的空余空间,和ED终止符后的剩余空间。
例如当 exp=23568741时,每个数据块的9号格即为无效数据。

动态混淆

在KEY的尾部带上#表示启用动态混淆,按KEY值对应的位置对每个数据块填充无效数据。在书写时,这些数据格优先被填充无效数据,有效数据则顺势延后到KEY值声明的下一个数据格中。
例如当 exp=23568741# 混淆参数h为空时,
第一个数据块的9 2为无效数据
第二个数据块的9 3为无效数据
第三个数据块的9 5为无效数据
···
第九个数据块的9 2为无效数据,以此类推。
混淆参数h的使用:
当h为一位正整数时,即表示动态混淆对于KEY的起始点偏移,
例如当 exp=23568741#8 时,
第一个数据块的9 8为无效数据
第二个数据块的9 7为无效数据
第三个数据块的9 4为无效数据
···
第九个数据块的9 8为无效数据,以此类推。
当h为两位及以上正整数时,开启蒙版混淆,
例如当 exp=23568741#85563 时,
第一个数据块的9 8为无效数据
第二个数据块的9 5为无效数据
第三个数据块的9 5为无效数据
第四个数据块的9 6为无效数据
第五个数据块的9 3为无效数据
第六个数据块的9 8为无效数据,以此类推。
蒙版混淆支持数组,所以你可以写成:
例如当 exp=23568741#85.56.31 时,
第一个数据块的9 8 5为无效数据
第二个数据块的9 5 6为无效数据
第三个数据块的9 3 1为无效数据
第四个数据块的9 8 5为无效数据,以此类推。
当用户启用多KEY时,我们规定需要对每一个KEY值分别设置混淆和混淆参数,如不设置则默认为静态混淆。
动态蒙版混淆会与多KEY的循环参数产生逻辑冲突,故我们规定,如果启用蒙版混淆则无论是否启用多KEY均只允许设置一个蒙版,蒙版的循环不受循环参数影响,且蒙版覆盖全局数据块,不考虑其他KEY的混淆设置。

使用

使用的前提条件是双方(或多方)提前通过安全的方式交换了KEY
正文的开头应该写上KEYNEME, 便于接收者识别和解密。
下面给出一个加密后的样本和解密展示。
exp=23568741#
密文:当时,具体管床的同事在我耳边嚼了几遍:艾主任,那个人报的是冠状病毒

手工加密
手工加密

解密原理
解密原理

当您熟练地掌握了这套方法后,可以做到提笔即输出,入眼即解密的效果。虽然说现在是信息时代了,但是掌握一套手工加密方式无论如何是非常装逼的。尽管没有什么用处

安全评估

密钥数量

3x3大小的数据块下,KEY长度在4~9位间,一共可以产生985824种不同密钥。
4x4大小的数据块下,KEY长度在8~16位间,密钥总组合数达到了惊人的56873975558400种。
5x5的我没算,手工加解密用不到那么多的格子,效率太低了。
在启用了多KEY或者蒙版混淆的情况下,安全性会上升一个非常大的台阶。
有一说一,中间人如果也想纯手工解密是很难的,几乎不可能。
但如果中间人用计算机写了个程序去暴力解密的话,那就没有什么安全性可言了。

密码分析

对于此加密方式的安全审计主要是唯密文攻击的研究,因为此方式并不涉及数论中的大因数分解等计算过程,故对已知明文攻击或选择明文攻击的防御能力为零。好在此手工加密方法并无必要产生已知明文数据,可以直接写出和读入大脑。
这里提供一个可能可行的手工解密方式,因为其可以有效降低KEY值的组合数。
这些分析方式需要数据体长度足够大,否则不能观察出规律。
假定分析
随意选择一个位置5,假设其是有效数据,且秘钥的下一位是6,如若假设正确,则每个数据体中的56连接都应该是存在的双拼组合,秘钥应当包含56。若假设错误则进一步尝试575859。同时,根据每个数据体的假设的正确和错误周期,也可以判断出是否存在多KEY普通动态混淆。依据这个原理,只要不停地尝试就有可能分析出正确的秘钥。
蒙版混淆的提出用于对抗假定分析,但会明显降低加密效率,同时也会提高错误率。
这个方法存在的最大痛点是:你不知道在每一个数据体中假设的两位关联格谁是声母,谁是韵母。当KEY的位数为单数时,每个关联单元格的声韵也会呈周期性变化,这无疑给分析增加了难度。
常用词分析
由于双拼组合的读音存在唯一性,即例如 我们=WOmF 唯一,不能用其他字符串表示。故通过对常用标点、字词组合的位置分析可以推断出KEY值的可能片段。中文交流中常用诸如...好的.还是.其实.不过等等词汇。例如倒数的数据块中出现E,D在5,9;第一个数据块出现W,O在2,4;则可以合理推断KEY值含有片段5924,再通过假定分析确认片段是否正确。若片段正确,则可大幅减少KEY取值的范围。

密钥穷举

除了使用顺序排列组合的密钥穷举方式进行破译外,也有进一步提高对密钥猜解准确率的方法。
由于本方案为手工方式,其加密混淆过程符合一般人的思维方式,故可以收集一定数量的人类九宫格图形密码设置样本,并将其批处理为123456789的格式,交由神经网络进行机器学习。再通过神经网络进行密钥猜解,命中率将会大幅提升。由于暂时找不到样本数据,这个方案我还没有进行更深入的研究。

解决方案:暂时没有,这个算法没救了,已弃。但是可以搭配上世纪英国海军的playfair加密法使用,也很简单。

综上,这个纯手工加密方式仅供娱乐研究,如果在恶劣环境下没有电子设备,其可以用于短期内保护私密信息的安全。

添加新评论

已有 1 条评论

一看就会,一写就废  ̄﹃ ̄