Home > database >  Caesar cipher with JavaScript
Caesar cipher with JavaScript

Time:11-28

I've checked different websites with different code variations, but couldn't find the appropriate answer. I need to create 2 functions where : -1st function will cipher the given message with key, which is string; e.g. If Message=hello and key=123(so keys will be 1, 2, 3), output should be 'igomq' -2nd one will decipher I've already wrote code, but this only works when key is '123'. How can it be improved?

`

function cipher(message, key) {
    const arrOfKeys = key.split("")
    const cipheredMessage = []
    let newLettersArr = []
    for (let i = 0; i < message.length; i  ) {
        let remain = i % arrOfKeys.length
        if (remain >= 0) {
            let newLetter = message.charCodeAt(i)   (remain   1)
            newLettersArr.push(newLetter)
        }
    }
    newLettersArr.forEach((letter) => {
        let cipheredLetter = String.fromCharCode(letter)
        cipheredMessage.push(cipheredLetter)
    })
    return cipheredMessage
}

function deCipher(message, key) {
    const arrOfKeys = key.split("")
    const cipheredMessage = []
    let newLettersArr = []
    for (let i = 0; i < message.length; i  ) {
        let remain = i % arrOfKeys.length
        if (remain >= 0) {
            let newLetter = message.charCodeAt(i) - (remain   1)
            newLettersArr.push(newLetter)
        }
    }
    newLettersArr.forEach((letter) => {
        let cipheredLetter = String.fromCharCode(letter)
        cipheredMessage.push(cipheredLetter)
    })
    return cipheredMessage
}

console.log(cipher("hello", "123"))
console.log(deCipher("igomq", "123"))

`

CodePudding user response:

It looks like you need get the value from arrOfKeys for incrementing/decrementing the char code.

Beside this, you need to remove the check for having remain not zero. This is wrong, because it is the index for the incrementing/decementing value.

In deCipher I show you a more compact result.

function cipher(message, key) {
    const arrOfKeys = key.split("");
    const cipheredMessage = [];
    let newLettersArr = [];
    for (let i = 0; i < message.length; i  ) {
        let remain = i % arrOfKeys.length;
        let newLetter = message.charCodeAt(i)    arrOfKeys[remain];
        newLettersArr.push(newLetter);
    }
    newLettersArr.forEach((letter) => {
        let cipheredLetter = String.fromCharCode(letter);
        cipheredMessage.push(cipheredLetter);
    });
    return cipheredMessage;
}

function deCipher(message, key) {
    const keys = Array.from(key, Number);
    return Array.from(
        message,
        (c, i) => String.fromCharCode(c.charCodeAt(0) - keys[i % keys.length])
    )
}

console.log(cipher("hello", "5123"))
console.log(deCipher("mfnot", "5123"))

  • Related