Skip to content

Octarine-Phaneron/Vigenere-Cipher

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JavaScript - Vigenère Cipher

Try it HERE

Code :

window.onload = function(){

  // Get html elements
  let clearTextArea = document.getElementById("clear");
  let encryptedTextArea = document.getElementById("encrypted");
  let keyInput = document.getElementById("key");
  let encrypt = document.getElementById("encrypt");
  let checkSwitch = encrypt.checked;
  let topTitle = document.getElementById("topTextTitle");
  let bottomTitle = document.getElementById("bottomTextTitle");

  // init default values
  const alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
  const onlyLetters = new RegExp("^[a-zA-Z\\s]+$");
  let key = "";
  let clearText = "";
  let encryptedText = "";


  // starts the loop to check if anything's changed every 1s.
  let loop = setInterval(check, 1000);

  function setEncryptionKey(){
    if( onlyLetters.test(keyInput.value) ){
      return keyInput.value.replace(/\s/g,"");
    }
    return "";
  }

  /* Checks if the text/key have changed, if it has,
  * gets the new text and sends it to the encrypt function  */
  function check(){
    // Removes diacritics
    normalizedClearText = clearTextArea.value.normalize('NFD').replace(/[\u0300-\u036f]/g, "");
    if( clearText != normalizedClearText || key != setEncryptionKey() || encrypt.checked != checkSwitch){
      if( setEncryptionKey() != "" ){
        checkSwitch = encrypt.checked;
        key = setEncryptionKey();
        clearText = normalizedClearText;
        encryptedText = changeText(clearText);
        encryptedTextArea.value = encryptedText;
      }
      else{
        encryptedTextArea.value = "";
      }
    }
  }
  /* For each letter of the clear text, checks if it's a letter.
  * Returns encrypted text */
  function changeText(clearText){
    let tempEncrypted = "";
    let j = 0; // index to skip
    for(let i = 0; i < clearText.length; i++){
      char = clearText.charAt(i);
      // if char i is a letter
      if( char.match(/[A-z\\s]/)){
        keyChar = key[ j % key.length ].toLowerCase();
        char = encryptDecrypt(char, keyChar);
        // if char was uppercase => char.toUpperCase()
        char = (clearText.charAt(i) == clearText.charAt(i).toUpperCase() ? char.toUpperCase() : char);
        j++;
      }
      // Other chars aren't encrypted
      tempEncrypted += char;
    }
    return tempEncrypted;
  }
  // Chiffré[i] = (Texte[i] + Clés[i]) modulo 26
  function encryptDecrypt(char, keyChar){
    if(encrypt.checked == true){ // encrypt
      return alphabet[ ( alphabet.indexOf(char.toLowerCase()) + alphabet.indexOf(keyChar) ) % alphabet.length ];
    }else{ // decrypt
      return alphabet[ ( alphabet.indexOf(char.toLowerCase()) -  alphabet.indexOf(keyChar) + 26 ) % alphabet.length ];
    }
  }

  encrypt.onclick = function(){
    if( encrypt.checked == true ){
      topTitle.innerText = "Texte à chiffrer";
      bottomTitle.innerText = "Texte chiffré";
    }else{
      topTitle.innerText = "Texte à déchiffrer";
      bottomTitle.innerText = "Texte déchiffré"
    }
  };

}

Releases

No releases published

Packages

No packages published