迅雷、旋風、快車的下載地址加密算法解析

      我們平時在網上尋找資源時,都看到一些網站裏特別標明分開,用迅雷下載;用旋風下載;用快車下載等這些標籤,如迅雷,我們常常會見到類似於如下的鏈接地址: thunder://QUFodHRwOi8vZG93bmxvYWRzLmFwcG1hcnRzLmNvbS9hcHBtYXJ0cy5leGVaWg== ,當你點擊該地址後,如果你的系統裏安裝了迅雷軟件,迅雷識別它自己的協議頭“thunder://”,就彈出詢問是否執行下載,因爲它可以正確解析這樣的地址。

       現假設有一軟件下載地址:http://downloads.appmarts.com/appmarts.exe。下面來說明一下整個地址的加密過程:

迅雷:
        在完整的下載鏈接前加“AA”(不包括引號),後加“ZZ”(不包括引號),得到:
        AAhttp://downloads.appmarts.com/appmarts.exeZZ

        然後再用BASE64算法進行加密,得到:
        QUFodHRwOi8vZG93bmxvYWRzLmFwcG1hcnRzLmNvbS9hcHBtYXJ0cy5leGVaWg==

        最後在前面加上迅雷自己的協議就搞定:thunder://QUFodHRwOi8vZG93bmxvYWRzLmFwcG1hcnRzLmNvbS9hcHBtYXJ0cy5leGVaWg==
快車:
        快車地址加密算法是大同小異,它使用了同樣的原理,只是的原完整的下載鏈接前後各加上“[FLASHGET]”(不包括引號),

        然後同樣使用BASE64算法進行加密,加密後在前面再加上快車自己的協議頭:
        flashget://W0ZMQVNIR0VUXWh0dHA6Ly9kb3dubG9hZHMuYXBwbWFydHMuY29tL2FwcG1hcnRzLmV4ZVtGTEFTSEdFVF0=
旋風:
        旋風的加密法比迅雷和快車簡單了第一個步取,就是直接將原下載鏈進行BASE64算法加密,然後加上協議頭:“qdl://”,即可:
        qqdl://aHR0cDovL2Rvd25sb2Fkcy5hcHBtYXJ0cy5jb20vYXBwbWFydHMuZXhl

 

附Javascript的BASE64加密/解密函數和獲取對應加密鏈接地址方法: 


[javascript] view plaincopyprint?
  1. var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";    
  2. var base64DecodeChars = new Array(    
  3. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,    
  4. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,    
  5. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,    
  6. 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,    
  7. -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,    
  8. 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,    
  9. -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,    
  10. 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);    
  11.     
  12. /*  
  13. * <summary>  
  14. * 加密  
  15. * </summary>  
  16. */    
  17. function Base64Encode(str) {    
  18.     var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";    
  19.     var out, i, len;    
  20.     var c1, c2, c3;    
  21.     len = str.length;    
  22.     i = 0;    
  23.     out = "";    
  24.     while (i < len) {    
  25.         c1 = str.charCodeAt(i++) & 0xff;    
  26.         if (i == len) {    
  27.             out += base64EncodeChars.charAt(c1 >> 2);    
  28.             out += base64EncodeChars.charAt((c1 & 0x3) << 4);    
  29.             out += "==";    
  30.             break;    
  31.         }    
  32.         c2 = str.charCodeAt(i++);    
  33.         if (i == len) {    
  34.             out += base64EncodeChars.charAt(c1 >> 2);    
  35.             out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));    
  36.             out += base64EncodeChars.charAt((c2 & 0xF) << 2);    
  37.             out += "=";    
  38.             break;    
  39.         }    
  40.         c3 = str.charCodeAt(i++);    
  41.         out += base64EncodeChars.charAt(c1 >> 2);    
  42.         out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));    
  43.         out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));    
  44.         out += base64EncodeChars.charAt(c3 & 0x3F);    
  45.     }    
  46.     return out;    
  47. }    
  48.     
  49. /*  
  50. * <summary>  
  51. * 解密  
  52. * </summary>  
  53. */    
  54. function Base64Decode(str) {    
  55.     var c1, c2, c3, c4;    
  56.     var i, len, out;    
  57.     len = str.length;    
  58.     i = 0;    
  59.     out = "";    
  60.     while (i < len) {    
  61.         do {    
  62.             c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];    
  63.         } while (i < len && c1 == -1);    
  64.         if (c1 == -1) break;    
  65.         do {    
  66.             c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];    
  67.         } while (i < len && c2 == -1);    
  68.         if (c2 == -1) break;    
  69.         out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));    
  70.         do {    
  71.             c3 = str.charCodeAt(i++) & 0xff;    
  72.             if (c3 == 61) return out;    
  73.             c3 = base64DecodeChars[c3];    
  74.         } while (i < len && c3 == -1);    
  75.         if (c3 == -1) break;    
  76.         out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));    
  77.         do {    
  78.             c4 = str.charCodeAt(i++) & 0xff;    
  79.             if (c4 == 61) return out;    
  80.             c4 = base64DecodeChars[c4];    
  81.         } while (i < len && c4 == -1);    
  82.         if (c4 == -1) break;    
  83.         out += String.fromCharCode(((c3 & 0x03) << 6) | c4);    
  84.     }    
  85.     return out;    
  86. }    
  87.     
  88. /*  
  89. * <summary>  
  90. * 獲取迅雷地址  
  91. * </summary>  
  92. */    
  93. function GetThunderUrl(url) {    
  94.     var thunder = "AA" + url + "ZZ";    
  95.     thunder = "thunder://" + Base64Encode(thunder);    
  96.     return thunder;    
  97. }    
  98.     
  99. /*  
  100. * <summary>  
  101. * 獲取旋風地址  
  102. * </summary>  
  103. */    
  104. function GetQQDownloadUrl(url) {    
  105.     var qqDownload = url;    
  106.     qqDownload = "qqdl://" + Base64Encode(qqDownload);    
  107.     return qqDownload;    
  108. }    
  109.     
  110. /*  
  111. * <summary>  
  112. * 獲取快車地址  
  113. * </summary>  
  114. */    
  115. function GetFlashgetUrl(url) {    
  116.     var flashget = "[FLASHGET]" + url + "[FLASHGET]";    
  117.     flashget = "flashget://" + Base64Encode(flashget);    
  118.     return flashget;    
  119. }    

發佈了1 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章