You'll be able to decode and encode messages like using the Enigma Machine with this package. Even more awesome you can try breaking Enigma ciphers using hints ;)
Currently there are five different rotors:
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
I E K M F L G D Q V Z N T O W Y H X U S P A I B R C J
II A J D K S I R U X B L H W T M C Q G Z N P Y F V O E
III B D F H J L C P R T X V Z N Y E I W G A K M U S Q O
IV E S O V P Z J A Y Q U I R H X L N F T G K D C M W B
V V Z B R G I T Y U P S D N H L X A W M J Q O F E C K
and three different reflectors:
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
UKW A E J M Z A L Y X V B W F C R Q U O N T S P I K H G D
UKW B Y R U H Q S L D P X N G O K M I E B F Z C W V J A T
UKW C F V P J I A O Y E D R Z X W G C T K U Q S B N M H L
Additionally you're be able to crack Enigma codes if you have an encrypted message and some kind of hint like Wetterbericht
is part of the first 100 characters of the message.
You can install this julia package using
] add Enigma
or if you want to change code you might want to use
] dev Enigma
.
using Enigma
# initialize the Enigma machine with standard settings
enigma = EnigmaMachine()
# set the rotors to I, II, III (left to right)
set_rotors!(enigma, 1,2,3)
# the start of the rotor positions
set_rotor_positions!(enigma, 10,20,4)
# set the reflector (ukw = Umkehrwalze = reflector) to UKW B
set_ukw!(enigma, 2)
# Connecting A and C, B and E, ... on the plugboard
set_plugboard!(enigma, "AC BE GZ JK ML")
message = "Secret message"
encoded = encode!(enigma, message)
println("encoded: $encoded")
This will generate:
encoded: KPXDG MWRWF SNN
and to decode that message you have to set the starting positions of the rotors again and decode the message. (Actually it's the same as encoding it.)
set_rotor_positions!(enigma, 10,20,4)
decoded = decode!(enigma, encoded)
println("decoded: $decoded")
and surprise we get:
decoded: SECRE TMESS AGE
The Enigma code was famously cracked by Alan Turing and Co. in Bletchley Park.
This package also support to crack codes.
crack_message = "HGHXI AGYEY NDIFW PRMDD QSMJG DCAKP FMIZL RVQIZ WRLJM "
hint = "weatherreport"
You got that weird message and you think that the word weatherreport
starts at the first 5 chars to support something like
A weatherreport
or The weatherreport
and stuff like that.
First you define the BombeMachine
by given the secret text and the hint
.
Then you can crack the code and it will check weatherreport
on all positions and all possible plug setting, rotors, rotor positions and the three ukws.
bombe = BombeMachine(crack_message, hint)
enigmas = run_cracking(bombe; log=false)
That might take a while. Therefore you can give more hints.
# you know that rotor V is not used and the left most rotor is III
set_possible_rotors!(bombe, 3,1:4,1:4)
# Maybe you also know that the rotor position of III is something between 1 and 5.
set_possible_rotor_positions!(bombe, 1:5,1:26,1:26)
# The ukw is UKW A
set_possible_ukws!(bombe, 1)
# and the hint positions
set_possible_hint_positions!(bombe, 1:5)
enigmas = run_cracking(bombe; log=false);
This gets cracked in a few seconds now. The result is a set of enigma machines.
Then you can run:
for enigma in enigmas
encoded = encode!(enigma, crack_message)
println(encoded)
end
One of the 11 found solutions is the message.
Unfortunately sometimes the hint is not enough to get the correct solution because some plugs can be removed from the real setting and still produce the hint. These extra plugs are hard to generate (well sometimes there are a lot) Of course this package gives you the possibility to test all those combinations which often takes much longer and you probably be able to guess the message without it.
You really want to set this option? Okay here you go:
enable_ambiguous!(bombe)
and then run enigmas = run_cracking(bombe; log=false);
again.