Python - 用于已知解密函数的Javascript加密函数

时间:2017-02-15 13:01:22

标签: javascript python encryption cryptography

我找到了一个流媒体网站,用一个有趣的Javascript函数加密iframe代码。在网页上可以看到解密功能(显然),但不是加密功能。这是功能:

function base64_decode(data) {
    var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
    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中翻译了decrypt函数,它运行良好,但现在我需要加密函数(在Python中)从字符串开始输出加密的字符串+键。它是某种已知的加密吗?

1 个答案:

答案 0 :(得分:1)

这似乎是Vigenère密码的一个糟糕的实现,没有模数,因为结果sChar可能有更高的值。它只是为每个普通字符添加一个关键字符的值,如果它被耗尽则重用该键。它主要用作混淆病毒扫描程序或数据包检查防火墙的东西,因为加密本身当然是完全不安全的。它没有名字(并且没有自尊的密码学家会为它提供他的名字。)

这里的代码似乎有一个错误:

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

我不确定为什么- 1是必需的或者在实践中如何发挥作用(这就是为什么语言和API在可接受的范围内应该严格的原因。)

似乎已经实现了

ord以避免16位Unicode字符出现问题。

base64_decode只是实现base 64解码,没有什么可看的。