日记加密的思路总结

哈喽大家好,这是我们的第一篇文章。喜欢这类文章的小伙伴可以点击这里注册我们官网的账号,一起讨论哦! 也期待你们加入我们的Discord服务器一起聊天!

刚刚看了一下李永乐老师的日记加密算法,现在对视频所介绍的思路进行回忆并做总结。什么?你问视频链接在哪里?Okay,在这里:

  1. Youtube链接:https://youtu.be/32xToL3JdU0
  2. BiliBili链接:https://www.bilibili.com/video/BV11X4y1w77c

这篇文章不会涉及代码实现,纯粹讨论思路。后面我会在 Coding Challenge 里面尝试去吧这个加密功能写出来。所以现在我会根据老师所说,用我们生活中能用到的工具(白纸、美工刀)去演示这个加密过程。


制作密码盘

现在来简单的用图文叙述加密及解密过程。首先,我们准备一张白纸,在纸上划分四个区域,然后在左上方划出 4 × 4 同样大小的方框

第一步:画上小方格

将小方框同样画在其余 3 个区域,然后在第一个区域上写上 1 ~ 16 个号码

第二步:填满其余区域并填上数字

然后用镜像的方法去填满其他三个区域。镜像的意思是以中间分割线用镜子的方式将左边的元素写在右边,上下亦然。

第三步:镜像填充每个格子

这样,我们的密码盘就已经做好了。我会在这里放上密码盘的成品,想要使用的伙伴可以去下载并打印出来。

密码盘

使用密码盘

第四步:每个号码挖一个洞

接下来,我们将四个区域用颜色区分开来。然后我们发现,每个号码都在不同的区域上出现了一次。接下来,从 1 ~ 16 我们分别挑不同的颜色进行挖洞。注意:每个号码只能被挖一次且可以不挖。

然后,我们找来另一张纸,叠在密码盘下方。开始跟着空格从左往右写明文(明文就是一般我们看得懂的问字)。像以下这张图,我们挖了15个格子。

密码盘,已经挖好的洞

当写满一面之后,我们从左往右翻密码卡;再次写满另一面之后,从上往下翻、最后从左往右翻页。其顺序示意图依次如下:

日记加密反转示意图

这里一张卡,最多可以写64个字符。那如果你要写更多的话,可以将字体挤在一起写。具体操作如下:当你写完首64个字符之后,将密码盘上下翻转回正面,然后在第一个格子文字的右侧写上下一个字符,以此类推。直到写完你所有的文章。

还有就是,当密码盘没写完的话,就用其他杂乱无章的文字将剩余的空位填满。加密学,很重要的一个概念就是“障眼法”。我们没有写满的空白地方就可以用这些无意义的字符去填满它。混淆视听。

密码盘原理

看到这里的小伙伴,可以给自己一个鼓励了。那么我们就来分析这个密码盘的原理及其安全性和基本用途。

为什么只能镂空其中一个号码?

首先思考一下,为什么每个数字只能挑其中一个颜色进行挖洞?右侧这张图或许能给你很好的思路。

从这张图中,你可以观察到数字 1 分布在了四个角,配合翻转示意图,就可以发现,其实当我们旋转的时候,数字 1 的确会出现在每个不同的角落。因此我们只能从四个区域里面挑出其中一个位置进行镂空。

密码盘彩色版

日记加密反转示意图

这玩意的安全性?

OK,首先我们知道这个密码盘有 16 个号码,每个号码对应 4 个区域,外加如果完全没有镂空。那么每个号码有 5 种选择,那这个密码盘就有 516 个可能性(152587890625,1500亿种可能性)。但是这个具有固定算法的,用计算机就能暴力破解出来了。所以这个加密手段是不能对抗暴力计算的。

怎么记住密码盘的位置?

这是个好问题!那这里有 64 个格子,我们怎么记得这张卡上的位置呢?李老师教的方法有两个:二进制换算和特殊号码。

二进制记忆法

这就要用到高中学到的二进制了。很简单,逢二进一的那个进制。首先,我们将密码盘转向正面。镂空的部分用黑色填满,没镂空则用白色填满。黑色代表 1,白色代表 0。那么从上往下依次为(这里我将二进制写出来,并且直接换算成十进制):

将镂空的地方用黑色填满,代表 1;没镂空的地方用白色填满,代表 0
将镂空的地方用黑色填满,代表 1;没镂空的地方用白色填满,代表 0

1000 1010 = 138
1001 0110 = 150
1001 0000 = 144
0010 0000 = 32
0100 1000 = 72
0100 1000 = 74
0000 0000 = 0
0000 0100 = 4

那么你只要记住 10 进制的部分就能反推二进制出来。那如果不想记这么几个毫不相关的号码呢?

区域记忆法

那,我们知道这个密码盘已经被我们划分了 4 个区域,那么我们就按照密码盘的区域分别写上一段码,

// 0 代表不镂空,1 表示红色,2 表示黄色,3 表示蓝色,4 表示绿色:
1242 1221 1431 0314

那么这16个代码有什么意义呢?这里我参考了李永乐老师所举的例子,用了牛顿和爱因斯坦的生日(1642 1225 1879 0314),并且做了写处理——因为我们能表示的数值只有 0 ~ 4,所以大于 4 的就减去 4,直到他小于等于 4 为止。

那么我们只需要记得这16个对我们有意义的号码,就能反推成自己的加密卡了。

结语

以上就是我们的镜像加密原理了。后续我会尝试用代码去实现镜像加密及其核心思路。喜欢这类文章的小伙伴可以点击这里注册我们官网的账号,一起讨论哦! 也期待你们加入我们的Discord服务器一起聊天!