crypto

function Service_PreInvokeMethod (MethodName, Inputs, Outputs)
{
    if (MethodName == "EncryptString")
    {
        var plainText = Inputs.GetProperty("InputText");
        var key = Inputs.GetProperty("Key");

        var encrypted = XorCipher(plainText, key);
        var b64 = Base64Encode(encrypted);

        Outputs.SetProperty("Result", b64);
        return (CancelOperation);
    }
    else if (MethodName == "DecryptString")
    {
        var cipherB64 = Inputs.GetProperty("InputText");
        var key = Inputs.GetProperty("Key");

        var cipherText = Base64Decode(cipherB64);
        var decrypted = XorCipher(cipherText, key);

        Outputs.SetProperty("Result", decrypted);
        return (CancelOperation);
    }

    return (ContinueOperation);
}

/**
 * XOR-шифрование строки с ключом (обратимо)
 */
function XorCipher(text, key)
{
    var outStr = "";
    var keyLen = key.length;

    for (var i = 0; i < text.length; i++)
    {
        var charCode = text.charCodeAt(i);
        var keyCode = key.charCodeAt(i % keyLen);
        var xorCode = charCode ^ keyCode; // побитовый XOR
        outStr += String.fromCharCode(xorCode);
    }
    return outStr;
}

/**
 * Base64 Encode
 */
function Base64Encode(input)
{
    var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var output = "";
    var i = 0;

    while (i < input.length)
    {
        var chr1 = input.charCodeAt(i++);
        var chr2 = i < input.length ? input.charCodeAt(i++) : NaN;
        var chr3 = i < input.length ? input.charCodeAt(i++) : NaN;

        var enc1 = chr1 >> 2;
        var enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        var enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        var enc4 = chr3 & 63;

        if (isNaN(chr2)) { enc3 = enc4 = 64; }
        else if (isNaN(chr3)) { enc4 = 64; }

        output += keyStr.charAt(enc1) + keyStr.charAt(enc2) +
                  keyStr.charAt(enc3) + keyStr.charAt(enc4);
    }
    return output;
}

/**
 * Base64 Decode
 */
function Base64Decode(input)
{
    var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var output = "";
    var i = 0;

    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

    while (i < input.length)
    {
        var enc1 = keyStr.indexOf(input.charAt(i++));
        var enc2 = keyStr.indexOf(input.charAt(i++));
        var enc3 = keyStr.indexOf(input.charAt(i++));
        var enc4 = keyStr.indexOf(input.charAt(i++));

        var chr1 = (enc1 << 2) | (enc2 >> 4);
        var chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
        var chr3 = ((enc3 & 3) << 6) | enc4;

        output += String.fromCharCode(chr1);

        if (enc3 != 64) output += String.fromCharCode(chr2);
        if (enc4 != 64) output += String.fromCharCode(chr3);
    }
    return output;
}

Comments

Popular posts from this blog

xlam