/vigenere

C implementation of the Vigènere cipher and the attack on it using Kasiski examination and frequence analysis

Primary LanguageC

VIGENERE(1)                 General Commands Manual                VIGENERE(1)

NAME
     vigenere, kasiski – polyalphabetic cipher encryption and attack utilities

SYNOPSIS
     vigenere [-de] key
     kasiski [-ep]

DESCRIPTION
     The vigenere utility implements encryption and decryption using the
     Vigenere polyalphabetic shift cipher on a given alphabetic key.  The
     kasiski utility implements a method of cryptanalysis of such cipher based
     on Kasiski examination and frequence analysis.

     vigenere uses the key given as argument to encrypt or decrypt the text
     read from standard input.  The result is written into standard output.
     Both the key argument and the standard input must contain plain
     alphabetic characters (ie, uppercase or lowercase latin letters) encoded
     in ASCII; any other character is ignored and is output as it is, without
     being encrypted or decrypted.

     The options for vigenere are as follows:

     -d      Perform decryption

     -e      Perform encryption (this is the default if no option is given).

     kasiski reads a ciphertext from standard input and tries to guess the key
     used to encrypt it with vigenere.  The guessed key is written into
     standard output.  The read ciphertext must have been generated by
     vigenere on either an English plaintext message or a Portuguese plaintext
     message (only the frequency of letters in those languages are known).

     The options for kasiski are as follows:

     -e      Use letter frequency in the English language for the frequency
             analysis.  (this is the default if no option is given).

     -p      Use letter frequency in the Portuguese language for the frequency
             analysis.

EXAMPLES
     Consider the following message text in the file sample.txt:

           I'd just like to interject for a moment.  What you're referring to as
           Linux, is in fact, GNU/Linux, or as I've recently taken to calling it,
           GNU plus Linux.  Linux is not an operating system unto itself, but
           rather another free component of a fully functioning GNU system made
           useful by the GNU corelibs, shell utilities and vital system components
           comprising a full OS as defined by POSIX.

           Many computer users run a modified version of the GNU system every day,
           without realizing it.  Through a peculiar turn of events, the version of
           GNU which is widely used today is often called "Linux", and many of its
           users are not aware that it is basically the GNU system, developed by
           the GNU Project.

           There really is a Linux, and these people are using it, but it is just a
           part of the system they use.  Linux is the kernel: the program in the
           system that allocates the machine's resources to the other programs that
           you run.  The kernel is an essential part of an operating system, but
           useless by itself; it can only function in the context of a complete
           operating system.  Linux is normally used in combination with the GNU
           operating system: the whole system is basically GNU with Linux added, or
           GNU/Linux.  All the so-called "Linux" distributions are really
           distributions of GNU/Linux.

     The following example encrypts the message: using the string "stallman"
     as key.

           $ <sample.txt vigenere -e stallman
           A'w jfdf lvcx tz tztrjcene roe s foxpzt.  [...]

     The following example encrypts and then decrypts the same message using
     the same key.

           $ <sample.txt vigenere -e stallman | vigenere -d stallman
           I'd just like to interject for a moment.  [...]

     The following example encrypts the same message using the same key and
     then tries to guess the key used to encrypt it.

           $ <sample.txt vigenere -e stallman | kasiski -e
           stallman

HISTORY
     The vigenere and kasiski utilities are the product of a project for 2022
     2nd semester's course of Cyber Security of the Computer Science
     department of the University of Brasilia, Brasil.

BUGS
     kasiski is not perfect.  It may not guess the key for relly short
     messages, messages with more coincidental than accidental trigram
     repetitions, messages with no trigram repetition at all, or messages with
     a letter frequency very different from the ones common in the English or
     Portuguese languages.

     Short keys may be correctly guessed, but repeated a few number of times
     (which are also valid. In the Vigenere cipher, a key is equivalent to its
     repetition).

           $ <sample.txt vigenere -e gnu | kasiski -e
           gnugnugnugnu

     Mid-size to long keys whose length is a prime number are probably guessed
     wrong:

           $ <sample.txt vigenere -e installgentoo | kasiski -e
           inwtallgentooihstaalhpntooinstallkentdoinstallgenguo

     Fiddling with the THRESHOLD value in the code can sometimes make kasiski
     guess the right key.

     kasiski also uses lots of memory.  Mostly because of its trigram
     hashtable with no collision.

AUTHORS
     Lucas de Sena ⟨lucas at seninha dot org⟩

OpenBSD 7.2                    December 9, 2022                    OpenBSD 7.2