The Bifid cipher was invented around 1901 by Felix Delastelle. It is a “fractional substitution” cipher, where letters are replaced by pairs of symbols from a smaller alphabet. The cipher uses a 5×5 square filled with some ordering of the alphabet, except that “i”‘s and “j”‘s are identified (this is a so-called Polybius square; there is a 6×6 analog if you add back in “j” and also append onto the usual 26 letter alphabet, the digits 0, 1, …, 9). According to Helen Gaines’ book “Cryptanalysis”, this type of cipher was used in the field by the German army during World War I.
The Bifid cipher was discusses in Alasdair McAndrew’s book on Cryptography and Sage. We shall follow his discussion. As an example of a Polybius square for the Bifid cipher, pick the key to be “encrypt” (as Alasdair does). In that case, the Polybius square is BTW, the
analog is:
.
Here is Sage code to produce the case (the
case is in Alasdair’s book):
def bifid(pt, key): """ INPUT: pt - plaintext string (digits okay) key - short string for key (no repetitions, digits okay) OUTPUT: ciphertext from Bifid cipher (all caps, no spaces) This is the version of the Bifid cipher that uses the 6x6 Polybius square. AUTHOR: Alasdair McAndrew EXAMPLES: sage: key = "encrypt" sage: pt = "meet me on monday at 8am" sage: bifid(pt, key) [[2, 5], [0, 0], [0, 0], [1, 0], [2, 5], [0, 0], [3, 0], [0, 1], [2, 5], [3, 0], [0, 1], [1, 3], [1, 1], [0, 4], [1, 1], [1, 0], [5, 4], [1, 1], [2, 5]] 'HNHOKNTA5MEPEGNQZYG' """ AS = AlphabeticStrings() A = list(AS.alphabet())+[str(x) for x in range(10)] # first make sure the letters are capitalized # and text has no spaces key0 = [x.capitalize() for x in key if not(x.isspace())] pt0 = [x.capitalize() for x in pt if not(x.isspace())] # create long key long_key = key0+[x for x in A if not(x in key0)] n = len(pt0) # the fractionalization pairs = [[long_key.index(x)//6, long_key.index(x)%6] for x in pt0] print pairs tmp_cipher = flatten([x[0] for x in pairs]+[x[1] for x in pairs]) ct = join([long_key[6*tmp_cipher[2*i]+tmp_cipher[2*i+1]] for i in range(n)], sep="") return ct def bifid_square(key): """ Produced the Polybius square for the 6x6 Bifid cipher. EXAMPLE: sage: key = "encrypt" sage: bifid_square(key) [E N C R Y P] [T A B C D E] [F G H I J K] [L M N O P Q] [R S T U V W] [X Y Z 0 1 2] """ AS = AlphabeticStrings() A = list(AS.alphabet())+[str(x) for x in range(10)] # first make sure the letters are capitalized # and text has no spaces key0 = [SR(x.capitalize()) for x in key if not(x.isspace())] # create long key long_key = key0+[SR(x) for x in A if not(x in key0)] # the fractionalization pairs = [[long_key.index(SR(x))//6, long_key.index(SR(x))%6] for x in A] f = lambda i,j: long_key[6*i+j] M = matrix(SR, 6, 6, f) return M
Have fun!