# Playfair cracker - measure of best fit?

**From:** Rob Sullivan (*cogito.ergo.cogito_at_gmail.com*)

**Date:** 08/06/05

**Next message:**Nicol So: "Re: Skybuck's universal code"**Previous message:**Johan Wevers: "Re: What can one do against Keylogger Attacks?"**Next in thread:**Joe Peschel: "Re: Playfair cracker - measure of best fit?"**Reply:**Joe Peschel: "Re: Playfair cracker - measure of best fit?"**Reply:**Twittering One: "Re: Playfair cracker - measure of best fit?"**Reply:**Crypto_at_S.M.S: "Re: Playfair cracker - measure of best fit?"**Reply:**Douglas A. Gwyn: "Re: Playfair cracker - measure of best fit?"**Messages sorted by:**[ date ] [ thread ] [ subject ] [ author ] [ attachment ]

Date: 6 Aug 2005 04:05:51 -0700

I'm writing a Playfair cipher cracker (yes, I know there are several on

the internet), and I'm using a shotgun hillclimbing method. I basically

do the following:

1. Generate a random key.

2. Decrypt the ciphertext using the key, and score it against the

plaintext. This is done by taking the logarithms of the trigram

frequencies in standard English text and the ciphertext, and then

calculating the chi square statistic ( (O - E)^2 / E). Note that the

logarithms of the standard English text are only calculated once, and

then placed in an array - this is done at the beginning of the program.

3. Try some perturbations of the key - swap letters around, and so on.

Score the key for each perturbation.

4. If the score improves, check it against the global score. If it is

greater than the global score, output the key and start from another

random key.

5. If it is not, try a few other perturbations, and then start from

another random key.

The problem I'm having is with step 2 - compared to other Playfair

crackers, mine can only try a fraction of the keys tried by the other

programs in a given time. Is there a better statistic I can use, in

terms of appropriateness and efficiency?

The pseudocode for step 2 would be:

x = decrypt(ciphertext)

ciphertext_trigrams = get_trigrams(x)

for each element of ciphertext_trigrams:

ciphertext_trigram[element] = log(ciphertext_trigram[element])

score += ((ciphertext_trigram - plaintext_trigram)^2) /

plaintext_trigram

Thanks,

Rob

**Next message:**Nicol So: "Re: Skybuck's universal code"**Previous message:**Johan Wevers: "Re: What can one do against Keylogger Attacks?"**Next in thread:**Joe Peschel: "Re: Playfair cracker - measure of best fit?"**Reply:**Joe Peschel: "Re: Playfair cracker - measure of best fit?"**Reply:**Twittering One: "Re: Playfair cracker - measure of best fit?"**Reply:**Crypto_at_S.M.S: "Re: Playfair cracker - measure of best fit?"**Reply:**Douglas A. Gwyn: "Re: Playfair cracker - measure of best fit?"**Messages sorted by:**[ date ] [ thread ] [ subject ] [ author ] [ attachment ]