diff --git a/vigenere.js b/vigenere.js new file mode 100644 index 0000000000..3a2be958f7 --- /dev/null +++ b/vigenere.js @@ -0,0 +1,91 @@ +/** + * Cleans the input text by removing spaces and ensuring it contains only alphanumeric characters. + * @param {string} text - The input text to be cleaned. + * @returns {string} The cleaned text without spaces or special characters. + * @throws Will throw an error if special characters are found. + */ +function cleanText(text) { + const textNoSpaces = text.replace(/ /g, ""); + if (/[^A-Za-z0-9]/.test(textNoSpaces)) { + throw new Error("Special characters detected. They must be removed."); + } + return textNoSpaces; +} + +/** + * Encrypts a message using a key with a substitution cipher. + * @param {string} message - The message to encrypt. + * @param {string} key - The encryption key. + * @returns {string} The encrypted message. + */ +function encrypt(message, key) { + message = message.toLowerCase(); + key = key.toLowerCase(); + const combinedAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; + const n = combinedAlphabet.length; + const encrypted = []; + let keyIndex = 0; + + for (const char of message) { + if (combinedAlphabet.includes(char)) { + const mIndex = combinedAlphabet.indexOf(char); + const keyChar = key[keyIndex % key.length]; + const shift = combinedAlphabet.indexOf(keyChar); + const newIndex = (mIndex + shift) % n; + encrypted.push(combinedAlphabet[newIndex]); + keyIndex++; + } + } + return encrypted.join(""); +} + +/** + * Decrypts an encrypted message using a key with a substitution cipher. + * @param {string} cipherText - The encrypted message to decrypt. + * @param {string} key - The decryption key. + * @returns {string} The decrypted message. + */ +function decrypt(cipherText, key) { + cipherText = cipherText.toLowerCase(); + key = key.toLowerCase(); + const combinedAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; + const n = combinedAlphabet.length; + const decrypted = []; + let keyIndex = 0; + + for (const char of cipherText) { + if (combinedAlphabet.includes(char)) { + const cIndex = combinedAlphabet.indexOf(char); + const keyChar = key[keyIndex % key.length]; + const shift = combinedAlphabet.indexOf(keyChar); + const originalIndex = (cIndex - shift + n) % n; + decrypted.push(combinedAlphabet[originalIndex]); + keyIndex++; + } + } + return decrypted.join(""); +} + +/** + * The main function to clean, encrypt, and decrypt messages. + */ +function main() { + try { + const rawMessage = prompt("Enter the message: "); + const rawKey = prompt("Enter the key: "); + const cleanedMessage = cleanText(rawMessage); + const cleanedKey = cleanText(rawKey); + + if (!cleanedMessage) throw new Error("Message is empty after cleaning!"); + if (!cleanedKey) throw new Error("Key is empty after cleaning!"); + + const encryptedMsg = encrypt(cleanedMessage, cleanedKey); + alert(`Encrypted Message: ${encryptedMsg}`); + const decryptedMsg = decrypt(encryptedMsg, cleanedKey); + alert(`Decrypted Message: ${decryptedMsg}`); + } catch (e) { + alert(`An error occurred: ${e.message}`); + } +} + +main();