url 加密

      今天我有個朋友問我關於url加密的問題,這個問題之前就研究過,通俗的說法url加密就是按照一種編碼規則把url中的某些字符串替換成其他的不規則的字符串。

 

      後來我就上網找url加密相關的資料,結果發現2篇帖子,在此貼出來跟大家共享:

      例子1:http://www.iteye.com/topic/286240   作者:gembler

      例子2:http://www.iteye.com/topic/286810   作者:gembler

     

--------------------------------------------------------------------------例子1 分割線--------------------------------------------------------------------------

 

在淘寶網上用關鍵字“gembler”搜索一下商品,得出以下URL:

 

Java代碼 複製代碼
  1. http://search1.taobao.com/browse/0/n-0-----------------g,m5sw2ytmmvza----------------40--commend-0-all-0.htm?at_topsearch=1  

                                                                           (留意上面這裏:“m5sw2ytmmvza”

 

經過一輪 天昏地暗、沙塵滾滾 的分析、研究之後,得出以下結論:

 

  在Base64中,碼錶是由 [A-Z,a-z,0-9,+,/,=(pad)] 組成的。
  然後自己也弄個碼錶,由 [a-z,2-7(這個2-7是在
淘寶網上搜索了n次而得出的結論] 組成的:

 

 

a b c d e f g h i j k l m n o p q r
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

 

-------------------------------------------------------愚蠢分割線---------------------------------------------

 

 

s t u v w x y z 2 3 4 5 6 7
18 19 20 21 22 23 24 25 26 27 28 29 30 31

 
  在Base64中,是將二進制連成一串,然後再按6位來分割,分割完後在前面補0,這個地球人都知道,不多說了。
  而我呢,哈哈,搗蛋一下,按5位來分割,如果剛好夠分,那就爽了,

  但是,世事往往不如人意,位數不夠,那咋辦呢?看下面 :)
 
  在Base64中,是用"="來解決的吧。
  現在呢,就是在前面補0,然後在後面再補0,其實就是前後補0,

  但是,按5位來分,前面3個0是補定的了,後面的0就看上帝怎麼安排了。
 
  舉個小例子:字符串 "aaa",(編碼/加密)後是 "mfqwc"
  
 

二進制: 01100001 01100001 01100001    
轉換後: (000)01100 (000)00101 (000)10000 (000)10110 (000)0001(0)
十進制: 12 5 16 22 2
碼錶對應: m f q w c

  
 

 反過來,(解碼/解密):
  
 

碼錶對應: m f q w c
十進制: 12 5 16 22 2
二進制: 00001100 00000101 00010000 00010110 00000010
去掉前3個0後: 01100 00101 10000 10110 00010
合併後: 0110000101100001011000010

  
 

 然後把合併後的串的長度除一下8,發現多了個0:
  
 

合併後的二進制碼: 01100001 01100001 01100001 0


  多了就算了,不要了(其實是在{編碼/加密}的分割時候,在分剩的餘數的後面補的0)。
  然後再將 byte[] 轉回字符串

 

  OK!又見回"aaa"了。    :)
 
  *有一點值得注意的是:UTF-8、GBK、GB18030 一般都沒什麼問題,但是 GB2312 可能字符集不夠豐富,繁體字在decode的時候成問號了。

 

搞了半天,“可視化編輯器”的 Java Code不好使,骨幹代碼在回帖裏貼出................(完整的代碼,有興趣的同志們請見附件!

 

 

-------------------------------------------------------------------例子2 分割線------------------------------------------------------------------------------

 

淘寶網的搜索關鍵字的編碼與解碼之後,忽然間,腦袋一閃:“好像拍拍網對於搜索關鍵字的編碼與解碼的規則都是差不多的”。

然後馬上跑去拍拍網,敲入:“gembler”,得出如下URL:

Java代碼 複製代碼
  1. http://sse.paipai.com/s-p7vz42wppy3a--1-40-13---3-4-3----2-2--128-0.html  

                                                    (看上面的:p7vz42wppy3a


是不是與淘寶網的長的差不多阿?答案是:“確實長的很像”。

 

既然長得像,那麼遊戲規則應該也是大同小異。。。

 

分析、研究,有結論了:


其實,就只有碼錶不一樣,其他的,全都跟“淘寶網的搜索關鍵字的編碼與解碼”一樣,OK!我們來看看碼錶的變化。

上文中用的碼錶是由: [a-z , 2-7]          組成的。
而現在,是由:          [
a-c , g-z , 1-9
組成的。


                 oh! gee ··· 就多了 [1 , 8 , 9 ] ,然後幹掉了 [ d-f ]


上文的碼錶:

 

Java代碼 複製代碼
  1. private final static String CODEC_TABLE = "abcdefghijklmnopqrstuvwxyz234567";  

 

 

a b c d e f g h i j k l m n o p q r
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

 

-------------------------------愚蠢分割線---------------------------------

 

 

s t u v w x y z 2 3 4 5 6 7
18 19 20 21 22 23 24 25 26 27 28 29 30 31

 
現在的碼錶:

Java代碼 複製代碼
  1. private final static String CODEC_TABLE = "abcghijklmnopqrstuvwxyz123456789";  

 

 


 

 

a
b
c
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

 

-------------------------------愚蠢分割線---------------------------------

 

 

v
w
x
y
z
1
2
3
4
5
6
7
8
9
18
19
20
21
22
23
24
25
26
27
28
29
30
31

 

OK!測試一下,這裏使用上文提供的 Source Code 中的 main(String[] args) 來測試:

 

測試結果

      輸入:JavaEye論壇頻道
      輸出:

        original: JavaEye論壇頻道
        encode: mmt1p2nisiv6iz8pzsgooqra
        decode: JavaEye論壇頻道

      然後跑去拍拍網敲入"JavaEye論壇頻道"搜索。

      得出:

      http://sse.paipai.com/s-mmt1p2nisiv6iz8pzsgooqra--1-40-13---3-4-3----2-2--128-0.html

      比較一下:

        mmt1p2nisiv6iz8pzsgooqra - console輸出
        mmt1p2nisiv6iz8pzsgooqra - 拍拍網URL


說明兩點:

    1.其實這種規則只是在Base64上進行改造,不是原始的Base64。
    2.可能這兩個貼子出了以後,淘寶網和拍拍網的那個規則可能會有所變動,
      所以以後拿着我
上文提供的Source Code去執行的結果,跟他們倆比較,不一定會準確。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章