enigma: implementation of Enigma cipher machine.
parent
79b8ee5a24
commit
2a17c47736
|
@ -0,0 +1 @@
|
||||||
|
John Benediktsson
|
|
@ -0,0 +1,12 @@
|
||||||
|
|
||||||
|
USING: enigma kernel math sequences sorting tools.test ;
|
||||||
|
|
||||||
|
IN: enigma.tests
|
||||||
|
|
||||||
|
[ t ] [ <reflector> natural-sort 26 iota sequence= ] unit-test
|
||||||
|
|
||||||
|
[ "" ] [ "" 4 <enigma> encode ] unit-test
|
||||||
|
|
||||||
|
[ "hello, world" ] [
|
||||||
|
"hello, world" 4 <enigma> [ encode ] keep reset-cogs encode
|
||||||
|
] unit-test
|
|
@ -0,0 +1,46 @@
|
||||||
|
! Copyright (C) 2011 John Benediktsson
|
||||||
|
! See http://factorcode.org/license.txt for BSD license
|
||||||
|
|
||||||
|
USING: accessors arrays ascii kernel locals math random
|
||||||
|
sequences sequences.extras vectors ;
|
||||||
|
|
||||||
|
IN: enigma
|
||||||
|
|
||||||
|
: <alphabet> ( -- seq )
|
||||||
|
26 iota >array ;
|
||||||
|
|
||||||
|
: <cog> ( -- cog )
|
||||||
|
<alphabet> randomize ;
|
||||||
|
|
||||||
|
: <reflector> ( -- reflector )
|
||||||
|
<alphabet> dup length iota >vector [ dup empty? ] [
|
||||||
|
[
|
||||||
|
[ delete-random ] [ delete-random ] bi
|
||||||
|
pick exchange
|
||||||
|
] keep
|
||||||
|
] until drop ;
|
||||||
|
|
||||||
|
TUPLE: enigma cogs prev-cogs reflector ;
|
||||||
|
|
||||||
|
: <enigma> ( num-cogs -- enigma )
|
||||||
|
[ <cog> ] replicate dup clone <reflector> enigma boa ;
|
||||||
|
|
||||||
|
: reset-cogs ( enigma -- enigma )
|
||||||
|
dup prev-cogs>> >>cogs ;
|
||||||
|
|
||||||
|
: special? ( n -- ? )
|
||||||
|
[ 25 > ] [ 0 < ] bi or ;
|
||||||
|
|
||||||
|
:: encode ( text enigma -- cipher-text )
|
||||||
|
0 :> ln!
|
||||||
|
enigma cogs>> :> cogs
|
||||||
|
enigma reflector>> :> reflector
|
||||||
|
text >lower [
|
||||||
|
CHAR: a mod dup special? [
|
||||||
|
ln 1 + ln!
|
||||||
|
cogs [ nth ] each reflector nth
|
||||||
|
cogs reverse [ index ] each CHAR: a +
|
||||||
|
cogs length iota [ 6 * 1 + ln mod zero? ] filter
|
||||||
|
cogs [ unclip prefix ] change-nths
|
||||||
|
] unless
|
||||||
|
] map ;
|
|
@ -0,0 +1 @@
|
||||||
|
Enigma cipher machine
|
Loading…
Reference in New Issue