置顶公告:【置顶】关于临时开启评论区所有功能的公告(2022.10.22) | 【置顶】关于本站Widget恢复使用的公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

用户:冰阅/图书馆/标准SH5——介绍与加密解密

来自萌娘百科
跳到导航 跳到搜索

前言

相信有些人知道ShortHide5,并且掌握了它的解密方法(加密方法比较麻烦)

但是它事实上仍然是存在一些问题的,这一次,我对于旧版的ShortHide5经过了一点点的改进,正式命名为Standard Short Hide 5,即标准化的ShortHide5,以下仍然简称sh5,接下来是它的正式定义。

正则匹配项"[A-Z][0-9a-z]+"

sh5的密文字符串为1至3个以下的正则表达式匹配项目组合而成

[A-Z][0-9a-z]+

简单来说,1至3个,加上若干个数字和小写字母的组合,例如以下几个都是符合条件的模式。

Tef5
GopvF225
Gopvfh640F2sdgBgs2vs0

也就是说,sh5仅仅支持1组,2组,3组,不存在4组,并且也无此必要,因为2组在极限情况下可以做到覆盖5^2=25个不同的字符,不过在解释这个之前,我们还是先看一个例子吧。

Lpd4K11bj

这是一个拥有2组的sh5密文,分别是Lpd4K11bj,每组的首字母都是大写字母,也就是(L,K)它们可以转换成数字,不过是通过下面这个字母表。

XABCDEFGHIJKLMNOPQRSTUVWYZ

也就是说,A转换成1,B转换成2,...W转换成23,Y转换成24,Z转换成25。

为什么要用这样一张表?X又起什么作用?

简单来说,X作为开头的英文单词的最少的,特例的情况就会比较少,这个稍后会介绍的。

总之(L,K)=>(12,11),而每一组剩余的部分为(pd4,11bj),这事实上是2个36进制的数字,而且使用的36个符号就是[0-9a-z],我们需要把它转换成5进制,这里是没有改动的。

可以使用在线网站完成这一步。

于是pd4就转换成了202244211bj则转换成了3021432

(2022442,3021432)排列成如下的形式。

2  3
0  0
2  2
2  1
4  4
4  3
2  2

每一组数字分别乘以它们的前缀。

12 * 2 + 11 * 3 = 57
12 * 0 + 11 * 0 = 00
12 * 2 + 11 * 2 = 46
12 * 2 + 11 * 1 = 35
12 * 4 + 11 * 4 = 92
12 * 4 + 11 * 3 = 81
12 * 2 + 11 * 2 = 46

把结果对于26求模。

57 % 26 = 05
00 % 26 = 00
46 % 26 = 20
35 % 26 = 09
92 % 26 = 14
81 % 26 = 03
46 % 26 = 20

剩余的数字通过一开始的字母表转换成字母,得到结果为extinct

对于曾经的sh5有印象的人估计会发现,好像少了什么步骤,没错,减去2的步骤消失了,其实这么做,对于sh5的加密能力并不会什么变化。

(上述步骤其实也可以用一个矩阵乘法来描述。)

特例X

现在,假设你要加密一个单词xenophobia,很不巧它是个为数不多的x开头的单词,我们忽略后面的字母,思考一下,x在开头的结果是什么。

对于这个问题,可以先考虑一下,什么情况下,什么时候会得到x,首先,假设开头的大写字母是U1和U2,表示一个字母的运算系数为V1和V2,那么运算想要得到x的公式为

$U1 \times V1+U2 \times V2\equiv 0\left(\mod 26\right)$

其中V1和V2只取0,1,2,3,4这5个数,如果在V1和V2都不为0的情况下,这个等式能成立,那当然很好。

但如果做不到,即当且仅当V1=V2=0时,等式成立,而V1和V2又处于首位,在5进制向着36进制转换的过程中,首位的0的信息就丢失了,如果你试图反推,就很容易发现这个问题。

为了解决这个问题,当要加密的单词以x开头的时候,直接把它转换成大写字母,对后续的部分进行sh5加密。

也就是说加密就结果以X开头,后面直接跟随着enophobia的加密结果,XA6t1fEcy5e

如果单词开头有2个X,那么加密结果的开头也会有2个X。

在此处就需要引出一个额外的规定,虽然密文的匹配项原则上允许使用大写字母X,但因为X=0本就完全无必要作为运算的大写字母,所以实际根本不会使用它,自然也不会产生混淆。

AE可以表达25个字母

(A,E)=(1,5)

这是一个致胜组合,使用它可以加密绝大多数的单词,只要单词不含有字母Z

1 5       1 5       1 5       1 5       1 5
------------------------------------------------
0 0 = 00| 1 0 = 01| 2 0 = 02| 3 0 = 03| 4 0 = 04
0 1 = 05| 1 1 = 06| 2 1 = 07| 3 1 = 08| 4 1 = 09
0 2 = 10| 1 2 = 11| 2 2 = 12| 3 2 = 13| 4 2 = 14
0 3 = 15| 1 3 = 16| 2 3 = 17| 3 3 = 18| 4 3 = 19
0 4 = 20| 1 4 = 21| 2 4 = 22| 3 4 = 23| 4 4 = 24

可以看得出来,0到24这25个数字都能运算出来,自然除了Z以外的字母都可以用这个组合来表达。

如果碰到有Z的单词,基本上也总存在其他的字母组合可以表达,所以2个大写字母的表达能力其实也是很强的。

扩展的三组

如果很不巧,你想要加密的单词无法用2组来表达,那么就只能使用3组了。

但是3组的表达能力实在是太强了,仅仅用来表示26个字母实在是浪费了,所以3组的字母表有64个字符(后续的计算步骤也是对于64求模)。

.ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,

开头的小数点只是为了显示,它其实代表了空格,并且它的特殊意义就类似于原本的X,处理方法也是相同的。

注意,此处仅仅是字母表扩展,而sh5密文的规则仍然是不变的[A-Z][0-9a-z]+,但是因为字母表改变了,X的特殊意义也消失,它变回了普通的可以使用的字母。

在这个扩展的3组规则下,sh5就可以表达更多样化的信息。

结尾

关于1组的sh5,它的字母表是未定义的,并且默认情况下不使用它,你可以在自己的实现中定义它,但是它可以表达的范围太小,并且同样也存在首字母问题,比方说你也许可以使用UILOVEANDY

以上就是标准化的ShortHide5的全部内容,也许各位编程高手也可以试着挑战一下,实现这个密码的加密和解密,虽然听上去有点云里雾里的,但是只要认真看完这些步骤,完全能够理解步骤。

如果你已经跃跃欲试了,那么请务必注意这非常重要的一点,sh5的特性是加密的结果不唯一,但解密唯一,这里不是很推荐加密出全部的结果(它们很多是相似的),但是至少要做到能在全部结果中随机选择出N个结果,和指定一组大写字母进行加密的功能。

另外,没有密钥的密码,除非能做到方法的保密,否则就没有安全性可言,而方法本身就很难做到保密,所以密钥才是真正能保障安全性的,而不是加密的方法。

编者附. 神秘数字

6731383216