用戶:冰閱/圖書館/標準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