diff --git a/vigenere.js b/vigenere.js new file mode 100644 index 00000000..e552d982 --- /dev/null +++ b/vigenere.js @@ -0,0 +1,88 @@ +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; +} + +function encrypt(message, key) { + message = message.toLowerCase(); + key = key.toLowerCase(); + const combinedAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; + const n = combinedAlphabet.length; + const encrypted = []; + let keyIndex = 0; + + try { + 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(""); + } catch (e) { + throw new Error("Encryption error: " + e.message); + } +} + +function decrypt(cipherText, key) { + cipherText = cipherText.toLowerCase(); + key = key.toLowerCase(); + const combinedAlphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; + const n = combinedAlphabet.length; + const decrypted = []; + let keyIndex = 0; + + try { + 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(""); + } catch (e) { + throw new Error("Decryption error: " + e.message); + } +} + +function main() { + try { + const rawMessage = prompt("Enter the message: "); + const rawKey = prompt("Enter the key: "); + try { + 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); + console.log("\nEncrypted Message:"); + console.log(encryptedMsg); + const decryptedMsg = decrypt(encryptedMsg, cleanedKey); + console.log("\nDecrypted Message:"); + console.log(decryptedMsg); + } catch (ve) { + console.log("Input error:", ve.message); + return; + } + } catch (e) { + console.log("An error occurred:", e.message); + } +} + +main(); +