4 kyu

Vigenère Cipher Helper

4,748 of 8,712jacobb

Description:

The Vigenère cipher is a classic cipher originally developed by Italian cryptographer Giovan Battista Bellaso and published in 1553. It is named after a later French cryptographer Blaise de Vigenère, who had developed a stronger autokey cipher (a cipher that incorporates the message of the text into the key).

The cipher is easy to understand and implement, but survived three centuries of attempts to break it, earning it the nickname "le chiffre indéchiffrable" or "the indecipherable cipher."

From Wikipedia:

The Vigenère cipher is a method of encrypting alphabetic text by using a series of different Caesar ciphers based on the letters of a keyword. It is a simple form of polyalphabetic substitution.

. . .

In a Caesar cipher, each letter of the alphabet is shifted along some number of places; for example, in a Caesar cipher of shift 3, A would become D, B would become E, Y would become B and so on. The Vigenère cipher consists of several Caesar ciphers in sequence with different shift values.

Assume the key is repeated for the length of the text, character by character. Note that some implementations repeat the key over characters only if they are part of the alphabet -- this is not the case here.

The shift is derived by applying a Caesar shift to a character with the corresponding index of the key in the alphabet.

Visual representation:

"my secret code i want to secure"  // message
"passwordpasswordpasswordpasswor"  // key

Write a class that, when given a key and an alphabet, can be used to encode and decode from the cipher.

Example

var alphabet = 'abcdefghijklmnopqrstuvwxyz';
var key = 'password';

// creates a cipher helper with each letter substituted
// by the corresponding character in the key
var c = new VigenèreCipher(key, alphabet);

c.encode('codewars'); // returns 'rovwsoiv'
c.decode('laxxhsj');  // returns 'waffles'

Any character not in the alphabet must be left as is. For example (following from above):

c.encode('CODEWARS'); // returns 'CODEWARS'

NOTE FOR PYTHON

The Python implementation requires Unicode conversion, i.e. input.decode('utf-8'), output.encode('utf-8')

Trying to print utf-8 strings without encoding them first (as mentioned above) will give you an error:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
Algorithms
Ciphers
Security
Object-oriented Programming
Strings

More By Author:

Check out these other kata created by jacobb

Stats:

CreatedJan 11, 2014
PublishedJan 12, 2014
Warriors Trained29170
Total Skips9321
Total Code Submissions108532
Total Times Completed8712
JavaScript Completions3496
CoffeeScript Completions57
Python Completions4748
PHP Completions457
Java Completions63
Total Stars909
% of votes with a positive feedback rating90% of 1114
Total "Very Satisfied" Votes938
Total "Somewhat Satisfied" Votes136
Total "Not Satisfied" Votes40
Ad
Contributors
  • jacobb Avatar
  • adam-tokarski Avatar
  • anter69 Avatar
  • donaldsebleung Avatar
  • siebenschlaefer Avatar
  • Chrono79 Avatar
  • kazk Avatar
  • Voile Avatar
  • Madjosz Avatar
  • FArekkusu Avatar
  • user8436785 Avatar
  • sid114 Avatar
Ad