DEV Community

Cover image for 1 Line Caesar Cipher
mosemet
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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
  )
)
Enter fullscreen mode Exit fullscreen mode

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.

Top comments (4)

Collapse
 
jonrandy profile image
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
Enter fullscreen mode Exit fullscreen mode
Collapse
 
jonrandy profile image
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
Enter fullscreen mode Exit fullscreen mode
Collapse
 
tebohom profile image
mosemet

Thanks Jon. I love this.

Thread Thread
 
jonrandy profile image
Jon Randy πŸŽ–οΈ

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