用户:冰阅/图书馆/标准SH5——介绍与加密解密
![]() |
本页面之全部或部分原来自哔哩哔哩专栏或百度贴吧或未知来源的Standard Short Hide5(标准SH5) 等文章,依 CC BY-NC-ND 4.0 授权引入;原贡献者是烟楼-天青-鸣。 |
前言
相信有些人知道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密文,分别是Lpd4和K11bj,每组的首字母都是大写字母,也就是(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就转换成了2022442,11bj则转换成了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的公式为
其中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