Сжать JS-зашифрованную строку - PullRequest
2 голосов
/ 20 сентября 2019

Я 14-летний любитель, обучающийся JS, и я решил, что должен запрограммировать свой собственный шифр.Я попробовал самый простой со сдвигом кодового символа (смещение charCode каждой буквы на), но мне не нравились показанные иностранные символы.

Так что через некоторое время я каким-то образом оказался с этим прототипом.Сначала я был очень доволен этим, но когда вы вводите более длинный текст, зашифрованная форма становится слишком объемной.У кого-нибудь есть идеи как сделать вывод меньше?Спасибо (извините за возможные языковые ошибки, английский не мой родной язык)

function encrypt(text, password){
    if(!password)
        return text;
    var chars = text.split("");
    var passes = window.btoa(password).split("");
    passes.push(password.length);
    var addto = 0;
    var toreturn = [];
    passes.forEach(function(cnt, idx){
        passes[idx] = cnt.toString().charCodeAt(0) * 16;
    });
    chars.forEach(function(content, index){
        toreturn.push((content.charCodeAt(0) + passes[index % passes.length] + addto).toString(32));
        addto += ((index % passes.length) == 0) ? password.length : 0;
    });
    return window.btoa(toreturn.join("/"));
}
function decrypt(text, password){
    if(!password)
        return text;
    var chars = window.atob(text).split("/");
    var passes = window.btoa(password).split("");
    passes.push(password.length);
    var addto = 0;
    var toreturn = [];
    passes.forEach(function(cnt, idx){
        passes[idx] = cnt.toString().charCodeAt(0) * 16;
    });
    chars.forEach(function(content, index){
        toreturn.push(String.fromCharCode(parseInt(content, 32) - passes[index % passes.length] - addto));
        addto += ((index % passes.length) == 0) ? password.length : 0;
    });
    return toreturn.join("");
}

var msg1 = "Hello world!"; document.getElementById("msg1").innerHTML = msg1;
var enc1 = encrypt(msg1, "myPass1"); document.getElementById("enc1").innerHTML = enc1;
var dec1 = decrypt(enc1, "myPass1"); document.getElementById("dec1").innerHTML = dec1;

var msg2 = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed vel lectus. Donec odio tempus molestie, porttitor ut, iaculis quis, sem";
document.getElementById("msg2").innerHTML = msg2;
var enc2 = encrypt(msg2, "myPass1"); document.getElementById("enc2").innerHTML = enc2;
var dec2 = decrypt(enc2, "myPass1"); document.getElementById("dec2").innerHTML = dec2;
Password: <i>myPass1</i><br><br>
<b>message: </b><span id="msg1"></span><br>
<b>encrypted: </b><span id="enc1"></span><br>
<b>decrypted: </b><span id="dec1"></span><br>
<br>
<b>message: </b><span id="msg2"></span><br>
<b>encrypted: </b><span id="enc2" style="word-wrap: break-word;white-space: -moz-pre-wrap;white-space: pre-wrap;"></span><br>
<b>decrypted: </b><span id="dec2"></span>

1 Ответ

0 голосов
/ 20 сентября 2019

Я не тратил много времени на изучение вашего алгоритма шифрования, но мне показалось, что в результирующем зашифрованном выводе может быть много избыточности, отсутствия случайности или отсутствия энтропии .В первую очередь, я думаю, вы будете искать хороший алгоритм шифрования.Я взял из вашего фрагмента кода зашифрованный вывод из 700 символов и применил утилиту сжатия Unix gzip и смог сжать ее до размера 424 байта.Итак:

Самый простой способ уменьшить объем выходных данных без серьезной перестройки алгоритма - это пройти через этап сжатия.Тем не менее, тот факт, что мне удалось сжать вывод, очень сильно говорит о том, что ваш алгоритм может быть не самым сильным, если он способен противостоять атаке дешифрования.Я уверен, что это было не вашей главной заботой, и я не хочу останавливаться на этом.Но вас все равно могут заинтересовать статьи, в которых обсуждаются энтропия и криптография.

Кстати, у вас отличный английский.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...