1

Тема: Шифр Цезаря

Шифр Цезаря реалізує шифрування повідомлення шляхом «зсуву» усіх символів повідомлення на певне число (в оригінальному шифрі дане число дорівнювало 3). Виникла проблема, не вірно функціонує Дешифрування, ніяк не можу побачити помилку, дякую за увагу. Можливо комусь вдасться запропонувати кращий варіант на js або ж php.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Шифр Цезаря</title>
    <link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
    Повідомлення:
    <br /><input type='text' id='message'>
    <br /><br />
    Зсув (число):<input type='text' id='shift' value='3'>
    <br /><br />
    <button onclick='encrypt()'>Зашифрувати</button>
    <br /><br />
    <button onclick='decrypt()'>Розшифрувати</button>
    <br /><br />
    Зашифроване повідомлення: <br />
    <input type='text' id='cipher'>

    <script>
        var alphabet = 'АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ';
        function shiftAlphabet(shift) {
            console.log(shift)
            var shiftedAlphabet = ''; //новий алфавіт 
            for (var i = 0; i < alphabet.length; i++) {
                //console.log(i, alphabet[i+shift]);
                currentLetter = (alphabet[i + shift] === undefined) ? (alphabet[i + shift - alphabet.length]) : (alphabet[i + shift        ]); //Поточна буква з зсувом, якщо виходимо за рамки довжини алфавіту - берем з початку алфавіту

                shiftedAlphabet = shiftedAlphabet.concat(currentLetter);
            }
            return shiftedAlphabet;
        }

        console.log(shiftedAlphabet);

        function encrypt() {
            var message = document.getElementById('message').value;
            var shift = parseInt(document.getElementById('shift').value);
            var shiftedAlphabet = shiftAlphabet(shift);
            var encryptedMessage = '';
            for (var i = 0; i < message.length; i++) {
                var indexOfLetter = alphabet.indexOf(message[i].toUpperCase());
                encryptedMessage = encryptedMessage.concat(shiftedAlphabet[indexOfLetter]);
            }
            document.getElementById('cipher').value = encryptedMessage.toLowerCase();
        }

        function decrypt() {
            var message = document.getElementById('message').value;
            var shift = parseInt(document.getElementById('shift').value);
            var shiftedAlphabet = shiftAlphabet(shift);
            var encryptedMessage = '';
            for (var i = 0; i < message.length; i++) {
                if (message[i] == ' ') {
                    encryptedMessage = encryptedMessage.concat(' ');
                    continue};
                var indexOfLetter = shiftedAlphabet.indexOf(message[i].toUpperCase());
                encryptedMessage = encryptedMessage.concat(alphabet[indexOfLetter]);
            }
            document.getElementById('cipher').value = encryptedMessage.toLowerCase();
        }
    </script>
</body>
</html>

2

Re: Шифр Цезаря

ви для дешифровки витягуєте текст який шифруєте. ось правильно

 function decrypt() {
            var message = document.getElementById('cipher').value;
               ...
 }
(function(){
  console.log("called anonymously");
})()
Подякували: Bygryn1

3

Re: Шифр Цезаря

muhasjo написав:

ви для дешифровки витягуєте текст який шифруєте. ось правильно

 function decrypt() {
            var message = document.getElementById('cipher').value;
               ...
 }

І справді, спасибі *YES*

4 Востаннє редагувалося koala (10.03.2016 23:57:45)

Re: Шифр Цезаря

1. Користуйтеся jsfiddle.net
2. Перед викладанням коду прибирайте з нього зайве (закоментовані рядки, дебагінг, якщо він не показує критичних деталей для питання). Поважайте тих, хто буде читати ваш код.
3. Ефективність алгоритмів не коментуватиму, тільки скажу, що (i+shift)%alphabet.length завжди буде в алфавіті.
4. У мене все працює (для українських літер). Опишіть детальніше проблему, що таке "невірно працює" - шахаду проголошує чи медитує в пошуках дзену?
5. Я надто довго пишу відповіді...

5

Re: Шифр Цезаря

koala написав:

1. Користуйтеся jsfiddle.net
2. Перед викладанням коду прибирайте з нього зайве (закоментовані рядки, дебагінг, якщо він не показує критичних деталей для питання). Поважайте тих, хто буде читати ваш код.
3. Ефективність алгоритмів не коментуватиму, тільки скажу, що (i+shift)%alphabet.length завжди буде в алфавіті.
4. У мене все працює (для українських літер). Опишіть детальніше проблему, що таке "невірно працює" - шахаду проголошує чи медитує в пошуках дзену?
5. Я надто довго пишу відповіді...

Дякую, врахую Ваші зауваження.