R

E

A

C

T

O

xamples 

epeat

ode

pproach

ptimize

est

Square Cipher

The Question

Implement a classic method for composing secret messages called the square code:

 

1. Normalize the input - remove all spaces and punctuation and made all letters lowercase.

2. Create a square with the letters forming rows  - if the number of letters is a perfect square, use the square root as the number of columns. Else, choose the number of columns that corresponds to the smallest square that is larger than the characters in the message, which will result in a rectangular-like shape. 

3. Read vertically down each column going left to right, adding a space character every time the end of a column is reached. 

Example

"If man was meant to stay on the ground god would have given us roots"

Normalized, the sentence is 54 characters long.

The smallest square root larger than 54 is 64 - so we will work with 8 columns:

  ifmanwas
  meanttos
  tayonthe
  groundgo
  dwouldha
  vegivenu
sroots

Reading vertically down each column, we will come up with this as the encrypted message:

imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau

 

1. Normalize Text

var Crypto = function(string) {
    this.string = string;
};

Crypto.prototype.normalizePlaintext = function(){
    this.string = this.string.replace(/[,!%?#$^&\s.]/gi,'').toLowerCase();
    return this.string;
}

2. Calculate number of columns


Crypto.prototype.size = function(){
    return Math.ceil(Math.sqrt(this.string.length));
}

3. Divide the normalized text into blocks of letters of the number of columns calculated above

Crypto.prototype.plaintextSegments = function() {
    var normalized = this.normalizePlaintext().split('');
    var length = this.size();

    for (var i = 0; i < normalized.length; i++) {
        if (i % length === (length - 1) && i < normalized.length -1) {
            normalized[i] += " ay";
        }
    }

    return normalized.join('').split(' ay');
}

Placeholder to determine where to split later on, can be anything

4. Cipher the text ('read' vertically down each column)

Crypto.prototype.ciphertext = function(){

    var squared = this.plaintextSegments();
    var length = squared[0].length;
    var result = '';
    var j = 0;

    function cipher(){
        while (j < length) {
            for (var i = 0; i < length; i++) {  
                if (squared[i] !== undefined) {
                    if (squared[i][j] !== undefined){

                        result += squared[i][j];
                    }
                }
            }
            j = j + 1;
            cipher();
        }
    }
    cipher();

    return result;
}

4. Normalize the ciphered text (add spaces in between each column)

Crypto.prototype.normalizeCiphertext = function(){
    var ciphered = this.ciphertext().split('');
    var length = Math.ceil(Math.sqrt(ciphered.length));

    for (var i = 0; i < ciphered.length; i++) {
        if (i % length === (length - 1) && i < ciphered.length - 1) {
            ciphered[i] += " ";
        }
    }

    return ciphered.join('');
}

Reacto: Square Cipher

By kabibster

Reacto: Square Cipher

  • 1,731