2017-02-15 105 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解码,没有什么可以在那里看到。