DEV Community

mosemet

Posted on • Originally published at teboho01.hashnode.dev

1 Line Caesar Cipher

In cryptography, a Caesar cipher, also known as Caesar's cipher, the shift cipher, Caesar's code or Caesar shift, is one of the simplest and most widely known encryption techniques. It is a type of substitution cipher in which each letter in the plaintext is replaced by a letter some fixed number of positions down the alphabet. For example, with a left shift of 3, D would be replaced by A, E would become B, and so on. The method is named after Julius Caesar, who used it in his private correspondence.[1]

The encryption step performed by a Caesar cipher is often incorporated as part of more complex schemes, such as the VigenΓ¨re cipher, and still has modern application in the ROT13 system. As with all single-alphabet substitution ciphers, the Caesar cipher is easily broken and in modern practice offers essentially no communications security.

For example, shifting each of the 26 letters of the English alphabet by 3 places to the left, is equivalent to shifting by 23 places to the right. A plain text message without encryption applied is below:

``````Plaintext:  THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
``````

To take a look at what is going on, we can take the letter A. shifting A to the left by 3 places, with 1 shift, we get Z, with 2 shifts, we get Y and with 3rd shift we get X. With this cipher, this is done for all letters of the alphabet and shifted.

``````Ciphertext: QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD
``````

To decrypt, one will need to shift each letter of the encrypted in the opposite direction to which it was shifted. So A is now X, to get back to A, we shift to the right by 3 to get back to A.

In order to do this computationally, this encryption uses modular arithmetic by transforming the letters to numbers. Computers use ASCII code. From ASCII tables, A is 65, counting incrementally until Z is 90, and a is 97, counting incrementally to z which is 122.

The complete code is given below:

``````const caesarCipher = (str, shift=13) => str.replace(
/[A-Za-z]/g, char => String.fromCharCode(
65 + ((char = char.charCodeAt()) & 32) +((char&~32) - 65 + shift) % 26
)
)
``````

The `char.charCodeAt()` merely transforms the given character, char to its ASCII number, while the `String.fromCharCode()` method transforms the given number back to its alphabetic form. Now using this inside the `Array.prototype.replace()` method, we are simply replacing a given English alphabet with a shifted ASCII alphabet, thus scrambling the message.

It is worth noting that Caesar cipher is one of the most famous encryption algorithms in simplicity and cannot offer any information security.

Jon Randy ποΈ • Edited

The code needs fixing:

``````// actual results
caesarCipher('JON')      // WBA
caesarCipher('jon')      // CHG
caesarCipher('Jon')      // WHG

// expected results
caesarCipher('JON')      // WBA
caesarCipher('jon')      // wba
caesarCipher('Jon')      // Wba
``````

Jon Randy ποΈ • Edited

Fixed version:

``````const caesarCipher = (str, shift=13) => str.replace(
/[A-Za-z]/g, char => String.fromCharCode(
65+((char=char.charCodeAt())&32)+((char&~32)-65+shift)%26
)
)

caesarCipher('JON')      // WBA
caesarCipher('jon')      // wba
caesarCipher('Jon')      // Wba
``````

mosemet

Thanks Jon. I love this.

Also, to get JS syntax highlighting in your post - add `js` after the opening 3 backticks π