Add crack_caesar functionality

This commit is contained in:
Smaug123
2016-01-04 12:46:55 +00:00
parent 46ba92fcc7
commit d0bda1d6e7
6 changed files with 30 additions and 7 deletions

View File

@@ -43,6 +43,12 @@ decrypt_caesar("Khoor, Zruog!", 3)
Likewise, `decrypt_caesar` turns everything lower-case, but retains symbols.
Automatically crack the same text:
```julia
crack_caesar("Khoor, Zruog!")
# outputs ("hello, world!", 3)
```
### Monoalphabetic cipher
Encrypt the text "Hello, World!" with the same Caesar cipher, but

View File

@@ -9,7 +9,7 @@ include("vigenere.jl")
include("solitaire.jl")
export encrypt_monoalphabetic, decrypt_monoalphabetic,
encrypt_caesar, decrypt_caesar,
encrypt_caesar, decrypt_caesar, crack_caesar,
encrypt_vigenere, decrypt_vigenere,
encrypt_solitaire, decrypt_solitaire,
string_fitness

View File

@@ -24,3 +24,16 @@ function decrypt_caesar(ciphertext, key::Integer)
key = ((key-1) % 26) + 1
lowercase(encrypt_caesar(ciphertext, 26-key))
end
"""
Cracks the given ciphertext according to the Caesar cipher.
Returns (plaintext, key::Integer), such that encrypt_caesar(plaintext, key)
would return ciphertext.
Converts the input to lowercase.
"""
function crack_caesar(ciphertext)
texts = [(decrypt_caesar(ciphertext,key), key) for key in 1:26]
texts = sort(texts, by=(x -> string_fitness(first(x))))
texts[end]
end

8
test/caesar.jl Normal file
View File

@@ -0,0 +1,8 @@
using ClassicalCiphers
using Base.Test
@test encrypt_caesar("THIS CODE WAS INVENTED BY JULIUS CAESAR", 3) == "WKLV FRGH ZDV LQYHQWHG EB MXOLXV FDHVDU"
@test decrypt_caesar("WKLV FRGH ZDV LQYHQWHG EB MXOLXV FDHVDU", 3) == "this code was invented by julius caesar"
@test crack_caesar("WKLV FRGH ZDV LQYHQWHG EB MXOLXV FDHVDU") == ("this code was invented by julius caesar", 3)

View File

@@ -9,7 +9,3 @@ using Base.Test
@test decrypt_monoalphabetic("5@coD", Dict{Char, Char}('a' => '5', 'B' => '@', 'b' => 'o', 'D' => 'D')) == "aBcbD"
@test decrypt_monoalphabetic("WKLV FRGH ZDV LQYHQWHG EB MXOLXV FDHVDU", "DEFGHIJKLMNOPQRSTUVWXYZABC") == lowercase("THIS CODE WAS INVENTED BY JULIUS CAESAR")
@test encrypt_caesar("THIS CODE WAS INVENTED BY JULIUS CAESAR", 3) == "WKLV FRGH ZDV LQYHQWHG EB MXOLXV FDHVDU"
@test decrypt_caesar("WKLV FRGH ZDV LQYHQWHG EB MXOLXV FDHVDU", 3) == lowercase("THIS CODE WAS INVENTED BY JULIUS CAESAR")

View File

@@ -1,6 +1,6 @@
using ClassicalCiphers
tests = ["vigenere", "monoalphabetic", "solitaire"]
tests = ["vigenere", "monoalphabetic", "solitaire", "caesar"]
println("Running tests:")