2017-02-15 58 views
0

我發現了一個使用有趣的Javascript函數加密iframe代碼的流式網站。在網頁上可以看到解密功能(顯然),但不是加密功能。這是函數:Python - 用於已知解密函數的Javascript加密函數

function base64_decode(data) { 
    var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/='; 
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, 
     ac = 0, 
     dec = '', 
     tmp_arr = []; 
    if (!data) { 
     return data; 
    } 
    data += ''; 
    do { 
     h1 = b64.indexOf(data.charAt(i++)); 
     h2 = b64.indexOf(data.charAt(i++)); 
     h3 = b64.indexOf(data.charAt(i++)); 
     h4 = b64.indexOf(data.charAt(i++)); 
     bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; 
     o1 = bits >> 16 & 0xff; 
     o2 = bits >> 8 & 0xff; 
     o3 = bits & 0xff; 
     if (h3 == 64) { 
      tmp_arr[ac++] = String.fromCharCode(o1); 
     } else if (h4 == 64) { 
      tmp_arr[ac++] = String.fromCharCode(o1, o2); 
     } else { 
      tmp_arr[ac++] = String.fromCharCode(o1, o2, o3); 
     } 
    } while (i < data.length); 
    dec = tmp_arr.join(''); 
    return dec.replace(/\0+$/, ''); 
} 

function ord(string) { 
    var str = string + '', 
     code = str.charCodeAt(0); 
    if (0xD800 <= code && code <= 0xDBFF) { 
     var hi = code; 
     if (str.length === 1) { 
      return code; 
     } 
     var low = str.charCodeAt(1); 
     return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; 
    } 
    if (0xDC00 <= code && code <= 0xDFFF) { 
     return code; 
    } 
    return code; 
} 

function decrypt(sData, sKey) { 
    var sResult = ""; 
    sData = base64_decode(sData); 
    var i = 0; 
    for (i = 0; i < sData.length; i++) { 
     var sChar = sData.substr(i, 1); 
     var sKeyChar = sKey.substr(i % sKey.length - 1, 1); 
     sChar = Math.floor(ord(sChar) - ord(sKeyChar)); 
     sChar = String.fromCharCode(sChar); 
     sResult = sResult + sChar; 
    } 
    return sResult; 
} 

所以這個代碼:

decrypt('s+Dd6djk3Jfq6dq0md/r6+fqsaam5ufc5ePm2Nul2uam3OTZ3Numy83Zw87aqazMvbimmZfq2unm4+Pg5d60meXmmZfd6djk3Nnm6dvc6bSZp5mX7uDb69+0mainp5yZl9/c4N7f67SZqKennJmX2OPj5u7d7OPj6trp3NzltJnr6ezcmZfu3Nni4OvY4+Pm7t3s4+Pq2unc3OW0mevp7NyZl+Tm8djj4+bu3ezj4+ra6dzc5bSZ6+ns3Jm1s6bg3enY5Ny1', 'w') 

將返回:

<iframe src="https://openload.co/embed/TVbLWc25UFA/" scrolling="no" frameborder="0" width="100%" height="100%" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true"></iframe> 

mathbase64模塊翻譯在Python解密函數和它運作良好,但現在我需要加密函數(在Python中),從字符串開始輸出加密的字符串+密鑰。它是一種已知的加密?

回答

1

這似乎是Vigenère密碼的不好實現,沒有模數,因爲結果sChar可能有更高的值。它只是將一個關鍵字符的值添加到每個普通字符,如果該關鍵字被耗盡,則重新使用該關鍵字符的值。它主要用作混淆病毒掃描程序或數據包檢測防火牆的功能,因爲加密本身當然完全不安全。它不會有一個名字(並且沒有自尊的密碼學者也會把它的名字借給它)。

似乎是在這裏的代碼中的錯誤:

sKey.substr(i % sKey.length - 1, 1); 

我爲什麼需要或如何發揮出來在實踐中- 1(這就是爲什麼語言和API的應該是嚴格不知道什麼是可以接受的)。

ord似乎已經實施,以避免與16位Unicode字符的問題。

base64_decode只是實現base 64解碼,沒有什麼可以在那裏看到。