You are on page 1of 15

0 [IF] AES Code Tutotorial

ANS FORTH code to implement the Advanced Encryption Standard AES!"


The National In#titute o$ Standard# and Technolo%y NIST! announced
on Octo&er '( '000 that Ri)ndael( created &y *oan +aemen and ,incent
Ri)men( -a# #elected a# the AES al%orithm to replace the old #ince ./01!
+ata Encryption Standard +ES!" The $ormal AES #peci$ication i# codi$ied
in NIST Federal In$ormation 2roce##in% Standard! FI2S3./0( url &elo-4
http455c#rc"ni#t"%ov5pu&lication#5$ip#5$ip#./05$ip#3./0"pd$
AES Ri)ndael! i# a &loc6 cipher -hich ta6e# a .'73&it input &loc6
and produce# a ciphered .'73&it output &loc6" The AES #tandard de$ine#
8 6ey #i9e# o$ .'7( ./'( or ':1 &it#( thou%h Ri)ndael accommodate# more"
Thi# i# a ;$a#t; implementation o$ the al%orithm( -hich employ# lar%e
precomputed ta&le value# to eliminate repetitive proce##in%" Speci$ically(
%aloi# $ield multiplication# and ro- and column #hi$t operation# are
com&ined into and accommodated &y the array# emi< and dmi<"
Ri)ndael allo-# $or t-o po##i&le architectural #tructure#" The normal
architecture proce##e# the input 6ey to create e<panded 6ey #e%ment#
that can &e u#ed $or &oth the encipher and decipher #tructure#" For
thi# ca#e( the decipher architecture per$orm# the inverted operation#
o$ the encipher al%orithm u#in% the e<panded 6ey#( in rever#e order"
An alternative architecture allo-# decipherin% to &e done -ith the
#ame #tructure $or encipherin%( &ut then re=uirin% the decipher 6ey
to &e modi$ied( -hich ta6e# lon%er to proce##"
Thi# code accommodate# &oth #tructure#" The ,A>?E ;ARCHITECT?RE; i#
u#ed to determine the compilation architecture" A @0@ FA>SE! -ill
compile the #tandard inverted cipher#! #tructure( -hile a non39ero
value compile# the identical cipher# #tructure u#in% a modi$ied 6ey"
The di$$erence &et-een the architecture# i# #peed" I$ $a#t decipher
6ey proce##in% i# mo#t important( the inverted architecture i# $a#ter(
-ith the decipher #trucuture &ein% #lo-er" Thi# i# rever#ed $or the
identical cipher# #tructure" Fa#ter &loc6 decipherin% i# normally
more important than 6ey proce##in% -hich occur# only once per me##a%e!(
#o #ettin% ARCHITECT?RE to @.5TR?E@ i# pro&a&ly &e#t $or mo#t #cenario#"
The -ord S2EE+3TEST can &e u#ed to #ho- the architectural di$$erence#
in #peed $or your #y#tem" Fir#t load thi# #ource $ile -ith the value
ARCHITECT?RE #et to @0@5.@( then run @#peedte#t@( then clear that
ver#ion@# compiled code $rom dictionary -ith -ord @AESCO+E@( and load
#ource $ile -ith ARCHITECT?RE $lipped( and run @#peedte#t@ a%ain"
A include 5Bpath3#ource3$ileA5ae#"$ C ARCHITECT?RE #et to @05.@
A #peedte#t C run #peedte#t $or architecture
A ae#code C remove previou# compiled code
A include 5Bpath3#ource3$ileA5ae#"$ C ARCHITECT?RE #et to @.50@
A #peedte#t C #peedte#t $or ne- architecture
Chan%e ND < to ND! a$ter $ile loaded to chan%e #peedte#t loop count"

The -ord AESTEST provide# 6no-n value te#t#" Output #hould &e &elo-"
A AESTEST
For .'73&it 6ey4 000.0'080E0:0100070/0a0&0c0d0e0$
2lainte<t input4 00..''88EE::110077//aa&&ccddee$$
Fno-n cipherte<t4 1/cEe0d71a0&0E80d7cd&07000&Ec::a
Computed ciphte<t4 1/cEe0d71a0&0E80d7cd&07000&Ec::a
Computed ori%inal4 00..''88EE::110077//aa&&ccddee$$
For ./'3&it 6ey4 000.0'080E0:0100070/0a0&0c0d0e0$.0...'.8.E.:.1.0
2lainte<t input4 00..''88EE::110077//aa&&ccddee$$
Fno-n cipherte<t4 dda/0caE71Ecd$e01ea$00a0ec0d0./.
Computed ciphte<t4 dda/0caE71Ecd$e01ea$00a0ec0d0./.
Computed ori%inal4 00..''88EE::110077//aa&&ccddee$$
For ':13&it 6ey4 000.0'080E0:0100070/0a0&0c0d0e0$.0...'.8.E.:.1.0.7./.a.&.c.d.e.$
2lainte<t input4 00..''88EE::110077//aa&&ccddee$$
Fno-n cipherte<t4 7ea'&0ca:.10E:&$ea$cE//0E&E/107/
Computed ciphte<t4 7ea'&0ca:.10E:&$ea$cE//0E&E/107/
Computed ori%inal4 00..''88EE::110077//aa&&ccddee$$
Finally( the -ord AESFI>E -ill [en5de]cipher a $ile in ECG mode"
To veri$y that a deciphered $ile i# the #ame a# the ori%inal $ile(
ta6e their crypto%raphic ha#he# u#in% H+:( SHA3.( SHA3':1( etc!(
-hich #hould &e the #ame"
The utility -ord FI>ESIIE i# u#ed to di#play the &yte #i9e o$ any $ile"
Thi# AES"F #ource $ile( a# -ell a# variou# NIST crypto%raphic ha#he#
SHA3.( SHA3''E( SHA3':1( SHA387E( etc! I have created or -ill! are
do-nloada&le $rom the FORTH $older located at the url &elo-"
---"E#hared"com5dir5TcHr?vTG5#harin%"html
[THEN]
C Advanced Encryption Standard AES! 33 Ri)ndael 33 in ANS FORTH"
C Accommodate# >ittle or Gi% Endian( &yte addre##a&le 8'3&it C2?#"
C Ri)ndael -a# created &y *oan +aemen and ,incent Ri)men"
C Ri)ndael -a# announced a# the AES al%orithm on '0005.05' &y the
C National In#titute o$ Standard# and Technolo%y NIST! 3 ---"ni#t"%ov
C NIST FI2S3./04 http455c#rc"ni#t"%ov5pu&lication#5$ip#5$ip#./05$ip#3./0"pd$
C ?#e o$ thi# code i# $ree #u&)ect to ac6no-led%ment o$ copyri%ht"
C Copyri%ht c! '00. *a&ari Ia6iya( 33 )9a6iya at %mail dot com( '00.5:5'1
C Revi#ed4 '0.E5.05.8
HARFER AEScode C Set #tart3o$3code mar6er
,ARIAG>E endianJ . endianJ K C I# C2? GIL or >ITT>E endianJ
C MMMMMMMMMMMMMMMMMMMM Hacro Nord#et Code MMMMMMMMMMMMMMMMMMMMM
C HACRO -ord#et $rom Nil Gaden@# Tool Gelt #erie# in
C Forth +imen#ion# F+! ,ol" ./( No" '( *uly5Au%u#t .//0"
C Ori%inal code ha# &een modi$ied to ma6e more e$$icient"
C HACRO allo-# in#ertion o$ parameter# $ollo-in% the macro"
C ;C; repre#ent# place -here parameter i# in#erted
C E<ample4 HACRO JJ ; IF C THEN ;
C 4 FOO "" JJ EOIT """" P JJ compile# to 33 IF EOIT THEN
[?N+EFINE+] 2>ACE [IF]
4 2>ACE caddr n addr 3! '+?2 CK CHARQ SNA2 CHARS HO,E P
[THEN]
4 SSTRINL char ;ccc; 3! NOR+ CO?NT HERE O,ER .Q CHARS A>>OT 2>ACE P
[?N+EFINE+] 5STRINL [IF]
4 5STRINL a n 6 3 aQ6 n36! O,ER HIN! T?CF 3 AR CHARS Q RA P
[THEN]
[?N+EFINE+] ANEN [IF]
4 ANEN AIN R G> NOR+ FIN+ IF EOEC?TE E>SE +RO2 THEN AIN K HARFER P
[THEN]
4 #plit3at3char a n char 3 a 6 aQ6 n36!
AR '+?2 GELIN +?2 NHI>E O,ER CR RR 3
NHI>E . 5STRINL RE2EAT THEN
RA +RO2 T?CF 'AR 3 'RA
P
4 +OESAHACRO C Compile the macro( includin% trailin% parameter#"
+OESA CO?NT GELIN [CHAR] C #plit3at3char 'AR E,A>?ATE RR
NHI>E G> NOR+ CO?NT E,A>?ATE 'RA . 5STRINL RE2EAT
RA +RO2 RA +RO2
P
C Hacro creation -ord -hich allo-# trailin% parameter in#ertion"
4 HACRO CREATE IHHE+IATE CHAR SSTRINL +OESAHACRO P
C MMMMMMMMMMMMMMMMMMMM ?tility Nord# MMMMMMMMMMMMMMMMMMMMM
[?N+EFINE+] ]> [IF] 4 ]> ] 2OST2ONE >ITERA> P IHHE+IATE [THEN]
[?N+EFINE+] CE>>3 [IF] 4 CE>>3 < 3 n ! [ . CE>>S ]> 3 P [THEN]
[?N+EFINE+] ?A+ [IF] 4 ?A+ n 3 n 0 ! 0 P [THEN]
C MMMMMMMMMMMMMMMMMMMMM Start Ri)ndael Code MMMMMMMMMMMMMMMMMMMMM
+ECIHA>
8' CONSTANT CE>>SIIE C Set cpu re%i#ter #i9e
TR?E CONSTANT deciph C Hode value $or decipher 6ey e<pan#ion
FA>SE CONSTANT enciph C Hode value $or encipher 6ey e<pan#ion
. ,A>?E ARCHITECT?RE C 0 3 inverted( . 3 identical cipher #tructure#
CREATE e<p6ey 10 CE>>S A>>OT C Hold# e<panded 6ey data
CREATE ciphdat .1 CHARS A>>OT C Hold# ciphered data
ciphdat CONSTANT col[0] C .#t column o$ STATE matri<
ciphdat . CE>>S Q CONSTANT col[.] C 'nd column o$ STATE matri<
ciphdat ' CE>>S Q CONSTANT col['] C 8rd column o$ STATE matri<
ciphdat 8 CE>>S Q CONSTANT col[8] C Eth column o$ STATE matri<
HEO
C Con#tant# $or 6ey e<pan#ion
CREATE 6eycon# 0. ( 0' ( 0E ( 07 ( .0 ( '0 ( E0 ( 70 ( .G ( 81 (
CREATE #&o< C Ri)ndael S&o< ta&le( accommodate# #hi$ted &yte read#
00000018 ( 0000000C ( 00000000 ( 0000000G ( 000000F' ( 0000001G ( 0000001F ( 000000C: (
00000080 ( 0000000. ( 00000010 ( 000000'G ( 000000FE ( 000000+0 ( 000000AG ( 00000001 (
000000CA ( 0000007' ( 000000C/ ( 0000000+ ( 000000FA ( 000000:/ ( 000000E0 ( 000000F0 (
000000A+ ( 000000+E ( 000000A' ( 000000AF ( 000000/C ( 000000AE ( 0000000' ( 000000C0 (
000000G0 ( 000000F+ ( 000000/8 ( 000000'1 ( 00000081 ( 0000008F ( 000000F0 ( 000000CC (
0000008E ( 000000A: ( 000000E: ( 000000F. ( 0000000. ( 000000+7 ( 0000008. ( 000000.: (
0000000E ( 000000C0 ( 000000'8 ( 000000C8 ( 000000.7 ( 000000/1 ( 0000000: ( 000000/A (
00000000 ( 000000.' ( 00000070 ( 000000E' ( 000000EG ( 000000'0 ( 000000G' ( 0000000: (
0000000/ ( 00000078 ( 000000'C ( 000000.A ( 000000.G ( 0000001E ( 000000:A ( 000000A0 (
000000:' ( 0000008G ( 000000+1 ( 000000G8 ( 000000'/ ( 000000E8 ( 000000'F ( 0000007E (
000000:8 ( 000000+. ( 00000000 ( 000000E+ ( 000000'0 ( 000000FC ( 000000G. ( 000000:G (
0000001A ( 000000CG ( 000000GE ( 0000008/ ( 000000EA ( 000000EC ( 000000:7 ( 000000CF (
000000+0 ( 000000EF ( 000000AA ( 000000FG ( 000000E8 ( 000000E+ ( 00000088 ( 0000007: (
000000E: ( 000000F/ ( 0000000' ( 0000000F ( 000000:0 ( 0000008C ( 000000/F ( 000000A7 (
000000:. ( 000000A8 ( 000000E0 ( 0000007F ( 000000/' ( 000000/+ ( 00000087 ( 000000F: (
000000GC ( 000000G1 ( 000000+A ( 000000'. ( 000000.0 ( 000000FF ( 000000F8 ( 000000+' (
000000C+ ( 0000000C ( 000000.8 ( 000000EC ( 000000:F ( 000000/0 ( 000000EE ( 000000.0 (
000000CE ( 000000A0 ( 0000000E ( 0000008+ ( 0000001E ( 000000:+ ( 000000./ ( 00000008 (
00000010 ( 0000007. ( 000000EF ( 000000+C ( 000000'' ( 000000'A ( 000000/0 ( 00000077 (
000000E1 ( 000000EE ( 000000G7 ( 000000.E ( 000000+E ( 000000:E ( 0000000G ( 000000+G (
000000E0 ( 0000008' ( 0000008A ( 0000000A ( 000000E/ ( 00000001 ( 000000'E ( 000000:C (
000000C' ( 000000+8 ( 000000AC ( 0000001' ( 000000/. ( 000000/: ( 000000EE ( 0000000/ (
000000E0 ( 000000C7 ( 00000080 ( 0000001+ ( 0000007+ ( 000000+: ( 000000EE ( 000000A/ (
0000001C ( 000000:1 ( 000000FE ( 000000EA ( 0000001: ( 0000000A ( 000000AE ( 00000007 (
000000GA ( 00000007 ( 000000': ( 000000'E ( 000000.C ( 000000A1 ( 000000GE ( 000000C1 (
000000E7 ( 000000++ ( 0000000E ( 000000.F ( 000000EG ( 000000G+ ( 0000007G ( 0000007A (
00000000 ( 0000008E ( 000000G: ( 00000011 ( 000000E7 ( 00000008 ( 000000F1 ( 0000000E (
0000001. ( 0000008: ( 000000:0 ( 000000G/ ( 00000071 ( 000000C. ( 000000.+ ( 000000/E (
000000E. ( 000000F7 ( 000000/7 ( 000000.. ( 0000001/ ( 000000+/ ( 0000007E ( 000000/E (
000000/G ( 000000.E ( 00000070 ( 000000E/ ( 000000CE ( 000000:: ( 000000'7 ( 000000+F (
0000007C ( 000000A. ( 0000007/ ( 0000000+ ( 000000GF ( 000000E1 ( 000000E' ( 00000017 (
000000E. ( 000000// ( 000000'+ ( 0000000F ( 000000G0 ( 000000:E ( 000000GG ( 000000.1 (
+ECIHA> 017 CE>>S A>>OT HEO C Allot 017 cell# $or re#t o$ matri<( -ill $ill later
CREATE i&o< C Ri)ndael Inverted S&o< ta&le( acccommodate# #hi$ted &yte# read#
000000:' ( 0000000/ ( 0000001A ( 000000+: ( 00000080 ( 00000081 ( 000000A: ( 00000087 (
000000GF ( 000000E0 ( 000000A8 ( 000000/E ( 0000007. ( 000000F8 ( 000000+0 ( 000000FG (
0000000C ( 000000E8 ( 0000008/ ( 0000007' ( 000000/G ( 000000'F ( 000000FF ( 00000070 (
0000008E ( 0000007E ( 000000E8 ( 000000EE ( 000000CE ( 000000+E ( 000000E/ ( 000000CG (
000000:E ( 0000000G ( 000000/E ( 0000008' ( 000000A1 ( 000000C' ( 000000'8 ( 0000008+ (
000000EE ( 000000EC ( 000000/: ( 0000000G ( 000000E' ( 000000FA ( 000000C8 ( 000000EE (
00000007 ( 000000'E ( 000000A. ( 00000011 ( 000000'7 ( 000000+/ ( 000000'E ( 000000G' (
00000001 ( 000000:G ( 000000A' ( 000000E/ ( 0000001+ ( 0000007G ( 000000+. ( 000000': (
0000000' ( 000000F7 ( 000000F1 ( 0000001E ( 00000071 ( 00000017 ( 000000/7 ( 000000.1 (
000000+E ( 000000AE ( 000000:C ( 000000CC ( 000000:+ ( 0000001: ( 000000G1 ( 000000/' (
0000001C ( 00000000 ( 000000E7 ( 000000:0 ( 000000F+ ( 000000E+ ( 000000G/ ( 000000+A (
000000:E ( 000000.: ( 000000E1 ( 000000:0 ( 000000A0 ( 0000007+ ( 000000/+ ( 0000007E (
000000/0 ( 000000+7 ( 000000AG ( 00000000 ( 0000007C ( 000000GC ( 000000+8 ( 0000000A (
000000F0 ( 000000EE ( 000000:7 ( 0000000: ( 000000G7 ( 000000G8 ( 000000E: ( 00000001 (
000000+0 ( 000000'C ( 000000.E ( 0000007F ( 000000CA ( 0000008F ( 0000000F ( 0000000' (
000000C. ( 000000AF ( 000000G+ ( 00000008 ( 0000000. ( 000000.8 ( 0000007A ( 0000001G (
0000008A ( 000000/. ( 000000.. ( 000000E. ( 000000EF ( 00000010 ( 000000+C ( 000000EA (
000000/0 ( 000000F' ( 000000CF ( 000000CE ( 000000F0 ( 000000GE ( 000000E1 ( 00000008 (
000000/1 ( 000000AC ( 0000000E ( 000000'' ( 000000E0 ( 000000A+ ( 0000008: ( 0000007: (
000000E' ( 000000F/ ( 00000080 ( 000000E7 ( 000000.C ( 0000000: ( 000000+F ( 0000001E (
000000E0 ( 000000F. ( 000000.A ( 0000000. ( 000000.+ ( 000000'/ ( 000000C: ( 0000007/ (
0000001F ( 000000G0 ( 0000001' ( 0000000E ( 000000AA ( 000000.7 ( 000000GE ( 000000.G (
000000FC ( 000000:1 ( 0000008E ( 000000EG ( 000000C1 ( 000000+' ( 0000000/ ( 000000'0 (
000000/A ( 000000+G ( 000000C0 ( 000000FE ( 00000007 ( 000000C+ ( 000000:A ( 000000FE (
000000.F ( 000000++ ( 000000A7 ( 00000088 ( 00000077 ( 00000000 ( 000000C0 ( 0000008. (
000000G. ( 000000.' ( 000000.0 ( 000000:/ ( 000000'0 ( 00000070 ( 000000EC ( 000000:F (
00000010 ( 000000:. ( 0000000F ( 000000A/ ( 000000./ ( 000000G: ( 000000EA ( 0000000+ (
000000'+ ( 000000E: ( 0000000A ( 000000/F ( 000000/8 ( 000000C/ ( 000000/C ( 000000EF (
000000A0 ( 000000E0 ( 0000008G ( 000000E+ ( 000000AE ( 000000'A ( 000000F: ( 000000G0 (
000000C7 ( 000000EG ( 000000GG ( 0000008C ( 00000078 ( 000000:8 ( 000000// ( 0000001. (
000000.0 ( 000000'G ( 0000000E ( 0000000E ( 000000GA ( 00000000 ( 000000+1 ( 000000'1 (
000000E. ( 0000001/ ( 000000.E ( 00000018 ( 000000:: ( 000000'. ( 0000000C ( 0000000+ (
+ECIHA> 017 CE>>S A>>OT HEO C Allot 017 cell# $or re#t o$ matri<( -ill $ill later
CREATE emi< C Colmi< ta&le4 each S&o<[I] &yte value < %8(.(.('!
A:1818C1 ( 7E0C0CF7 ( //0000EE ( 7+0G0GF1 ( 0+F'F'FF ( G+1G1G+1 ( G.1F1F+E ( :EC:C:/. (
:0808010 ( 080.0.0' ( A/1010CE ( 0+'G'G:1 ( ./FEFEE0 ( 1'+0+0G: ( E1AGAGE+ ( /A0101EC (
E:CACA7F ( /+7'7'.F ( E0C/C/7/ ( 700+0+FA ( .:FAFAEF ( EG:/:/G' ( C/E0E07E ( 0GF0F0FG (
ECA+A+E. ( 10+E+EG8 ( F+A'A':F ( EAAFAFE: ( GF/C/C'8 ( F0AEAE:8 ( /10'0'EE ( :GC0C0/G (
C'G0G00: ( .CF+F+E. ( AE/8/88+ ( 1A'1'1EC ( :A81811C ( E.8F8F0E ( 0'F0F0F: ( EFCCCC78 (
:C8E8E17 ( FEA:A::. ( 8EE:E:+. ( 07F.F.F/ ( /80.0.E' ( 08+7+7AG ( :88.8.1' ( 8F.:.:'A (
0C0E0E07 ( :'C0C0/: ( 1:'8'8E1 ( :EC8C8/+ ( '7.7.780 ( A./1/180 ( 0F0:0:0A ( G:/A/A'F (
0/00000E ( 81.'.''E ( /G7070.G ( 8+E'E'+F ( '1EGEGC+ ( 1/'0'0EE ( C+G'G'0F ( /F0:0:EA (
.G0/0/.' ( /E7878.+ ( 0E'C'C:7 ( 'E.A.A8E ( '+.G.G81 ( G'1E1E+C ( EE:A:AGE ( FGA0A0:G (
F1:':'AE ( E+8G8G01 ( 1.+1+1G0 ( CEG8G80+ ( 0G'/'/:' ( 8EE8E8++ ( 0.'F'F:E ( /07E7E.8 (
F::8:8A1 ( 17+.+.G/ ( 00000000 ( 'CE+E+C. ( 10'0'0E0 ( .FFCFCE8 ( C7G.G.0/ ( E+:G:GG1 (
GE1A1A+E ( E1CGCG7+ ( +/GEGE10 ( EG8/8/0' ( +EEAEA/E ( +EECEC/7 ( E7:7:7G0 ( EACFCF7: (
1G+0+0GG ( 'AEFEFC: ( E:AAAAEF ( .1FGFGE+ ( C:E8E871 ( +0E+E+/A ( ::888811 ( /E7:7:.. (
CFE:E:7A ( .0F/F/E/ ( 010'0'0E ( 7.0F0FFE ( F0:0:0A0 ( EE8C8C07 ( GA/F/F': ( E8A7A7EG (
F8:.:.A' ( FEA8A8:+ ( C0E0E070 ( 7A7F7F0: ( A+/'/'8F ( GC/+/+'. ( E7878700 ( 0EF:F:F. (
+FGCGC18 ( C.G1G100 ( 0:+A+AAF ( 18'.'.E' ( 80.0.0'0 ( .AFFFFE: ( 0EF8F8F+ ( 1++'+'GF (
ECC+C+7. ( .E0C0C.7 ( 8:.8.8'1 ( 'FECECC8 ( E.:F:FGE ( A'/0/08: ( CCEEEE77 ( 8/.0.0'E (
:0CECE/8 ( F'A0A0:: ( 7'0E0EFC ( E08+8+0A ( AC1E1EC7 ( E0:+:+GA ( 'G././8' ( /:0808E1 (
A01010C0 ( /77.7../ ( +.EFEF/E ( 0F+C+CA8 ( 11''''EE ( 0E'A'A:E ( AG/0/08G ( 7877770G (
CAE1E17C ( '/EEEEC0 ( +8G7G71G ( 8C.E.E'7 ( 0/+E+EA0 ( E':E:EGC ( .+0G0G.1 ( 01+G+GA+ (
8GE0E0+G ( :18'8'1E ( EE8A8A0E ( .E0A0A.E ( +GE/E//' ( 0A01010C ( 1C'E'EE7 ( EE:C:CG7 (
:+C'C'/F ( 1E+8+8G+ ( EFACACE8 ( A11'1'CE ( A7/./.8/ ( AE/:/:8. ( 80EEEE+8 ( 7G0/0/F' (
8'E0E0+: ( E8C7C77G ( :/80801E ( G01+1++A ( 7C7+7+0. ( 1E+:+:G. ( +'EEEE/C ( E0A/A/E/ (
GE1C1C+7 ( FA:1:1AC ( 00FEFEF8 ( ':EAEACF ( AF1:1:CA ( 7E0A0AFE ( E/AEAEE0 ( .70707.0 (
+:GAGA1F ( 770707F0 ( 1F':':EA ( 0''E'E:C ( 'E.C.C87 ( F.A1A1:0 ( C0GEGE08 ( :.C1C1/0 (
'8E7E7CG ( 0C++++A. ( /C0E0EE7 ( '..F.F8E ( ++EGEG/1 ( +CG+G+1. ( 717G7G0+ ( 7:7A7A0F (
/00000E0 ( E'8E8E0C ( CEG:G:0. ( AA1111CC ( +7E7E7/0 ( 0:080801 ( 0.F1F1F0 ( .'0E0E.C (
A81.1.C' ( :F8:8:1A ( F/:0:0AE ( +0G/G/1/ ( /.7171.0 ( :7C.C.// ( '0.+.+8A ( G//E/E'0 (
87E.E.+/ ( .8F7F7EG ( G8/7/7'G ( 88....'' ( GG1/1/+' ( 00+/+/A/ ( 7/7E7E00 ( A0/E/E88 (
G1/G/G'+ ( ''.E.E8C ( /'7070.: ( '0E/E/C/ ( E/CECE70 ( FF::::AA ( 07'7'7:0 ( 0A+F+FA: (
7F7C7C08 ( F7A.A.:/ ( 707/7/0/ ( .00+0+.A ( +AGFGF1: ( 8.E1E1+0 ( C1E'E'7E ( G71717+0 (
C8E.E.7' ( G0////'/ ( 00'+'+:A ( ..0F0F.E ( CGG0G00G ( FC:E:EA7 ( +1GGGG1+ ( 8A.1.1'C (
+ECIHA> 017 CE>>S A>>OT HEO C Allot 017 cell# $or re#t o$ matri<( -ill $ill later
CREATE dmi< C Inver#e Colmi< ta&le4 each I&o<[I] &yte value < %&(d(/(e!
:0A0FE:. ( :81:E.0E ( C8AE.0.A ( /1:E'08A ( CG1GAG8G ( F.E:/+.F ( AG:7FAAC ( /808E8EG (
::FA80'0 ( F11+01A+ ( /.01CC77 ( ':EC0'F: ( FC+0E:EF ( +0CG'AC: ( 70EE8:'1 ( 7FA81'G: (
E/:AG.+E ( 10.GGA': ( /70EEAE: ( E.C0FE:+ ( 0'0:'FC8 ( .'F0EC7. ( A8/0E17+ ( C1F/+81G (
E0:F7F08 ( /:/C/'.: ( EG0A1+GF ( +A:/:'/: ( '+78GE+E ( +8'.0E:7 ( '/1/E0E/ ( EEC7C/7E (
1A7/C'0: ( 070/7EFE ( 1G8E:7// ( ++0.G/'0 ( G1EFE.GE ( .0A+77F0 ( 11AC'0C/ ( GE8ACE0+ (
.7EA+F18 ( 7'8..AE: ( 1088:./0 ( E:0F:81' ( E0001EG. ( 7EAE1GGG ( .CA07.FE ( /E'G07F/ (
:717E700 ( ./F+E:7F ( 701C+E/E ( G0F70G:' ( '8+808AG ( E'0'EG0' ( :07F.FE8 ( 'AAG::11 (
00'7EGG' ( 08C'G:'F ( /A0GC:71 ( A:0780+8 ( F'70'780 ( G'A:GF'8 ( GA1A080' ( :C7'.1E+ (
'G.CCF7A ( /'GE0/A0 ( F0F'00F8 ( A.E'1/EE ( C+FE+A1: ( +:GE0:01 ( .F1'8E+. ( 7AFEA1CE (
/+:8'E8E ( A0::F8A' ( 8'E.7A0: ( 0:EGF1AE ( 8/EC780G ( AAEF10E0 ( 01/F0.:E ( :..01EG+ (
F/7A'.8E ( 8+01++/1 ( AE0:8E++ ( E1G+E1E+ ( G:7+:E/. ( 0::+CE0. ( 1F+E010E ( FF.::010 (
'EFG/7./ ( /0E/G++1 ( CCE8E07/ ( 00/E+/10 ( G+E'E7G0 ( 777G7/00 ( 87:G./E0 ( +GEEC70/ (
E00A0CA. ( E/0FE'0C ( C/.E7EF7 ( 00000000 ( 7871700/ ( E7E+'G8' ( AC00...E ( EE0':A1C (
FGFF0EF+ ( :1877:0F ( .E+:AE8+ ( '08/'+81 ( 1E+/0F0A ( '.A1:C17 ( +.:E:G/G ( 8A'E81'E (
G.100A0C ( 0FE0:0/8 ( +'/1EEGE ( /E/./G.G ( EFC:C070 ( A''0+C1. ( 1/EG00:A ( .1.A.'.C (
0AGA/8E' ( E:'AA0C0 ( E8E0''8C ( .+.0.G.' ( 0G0+0/0E ( A+C07GF' ( G/A7G1'+ ( C7A/.E.E (
7:./F.:0 ( EC000:AF ( GG++//EE ( F+100FA8 ( /F'10.F0 ( GCF:0':C ( C:8G11EE ( 8E0EFG:G (
01'/E87G ( +CC1'8CG ( 17FCE+G1 ( 18F.EEG7 ( CA+C8.+0 ( .07:18E' ( E0''/0.8 ( '0..C17E (
0+'EEA7: ( F78+GG+' ( ..8'F/AE ( 1+A.'/C0 ( EG'F/E.+ ( F880G'+C ( EC:'710+ ( +0E8C.00 (
1C.1G8'G ( //G/00A/ ( FAE7/E.. ( ''1EE/E0 ( CE7CFCA7 ( .A8FF0A0 ( +7'C0+:1 ( EF/088'' (
C0EEE/70 ( C.+.87+/ ( FEA'CA7C ( 810G+E/7 ( CF7.F:A1 ( '7+E0AA: ( '17EG0+A ( AEGFA+8F (
EE/+8A'C ( 0+/'07:0 ( /GCC:F1A ( 1'E10E:E ( C'.87+F1 ( E7G7+7/0 ( :EF08/'E ( F:AFC87' (
GE70:+/F ( 0C/8+01/ ( A/'++:1F ( G8.'':CF ( 8G//ACC7 ( A00+.7.0 ( 1E18/CE7 ( 0GGG8G+G (
0/07'1C+ ( FE.7:/1E ( 0.G0/AEC ( A7/AEF78 ( 1:1E/:E1 ( 0EE1FFAA ( 07CFGC'. ( E1E7.:EF (
+//GE0GA ( CE811FEA ( +E0//FEA ( +10CG0'/ ( AFG'AE8. ( 8.'88F'A ( 80/EA:C1 ( C011A'8: (
80GCEE0E ( A1CA7'FC ( G0+0/0E0 ( .:+7A088 ( EA/70EF. ( F0+AECE. ( 0E:0C+0F ( 'FF1/..0 (
7++1E+01 ( E+G0EFE8 ( :EE+AACC ( +F0E/1EE ( E8G:+./E ( .G771AEC ( G7.F'CC. ( 0F:.1:E1 (
0EEA:E/+ ( :+8:7C0. ( 080E70FA ( 'EE.0GFG ( :A.+10G8 ( :'+'+G/' ( 88:1.0E/ ( .8E0+11+ (
7C1.+0/A ( 0A0CA.80 ( 7E.EF7:/ ( 7/8C.8EG ( EE'0A/CE ( 8:C/1.G0 ( E+E:.CE. ( 8CG.E00A (
:/+F+'/C ( 8F08F':: ( 0/CE.E.7 ( GF80C008 ( EAC+F0:8 ( :GAAF+:F ( .E1F8++F ( 71+GEE07 (
7.F8AFCA ( 8ECE17G/ ( 'C8E'E87 ( :FE0A8C' ( 0'C8.+.1 ( 0C':E'GC ( 7GE/8C'7 ( E./:0+FF (
0.0.A78/ ( +EG80C07 ( /CEEGE+7 ( /0C.:11E ( 1.7ECG0G ( 00G18'+: ( 0E:C1CE7 ( E':0G7+0 (
+ECIHA> 017 CE>>S A>>OT C Allot 017 cell# $or re#t o$ matri<( -ill $ill later
HARFER TAG>ESK C Set mar6er $or code to load con#tant ta&le#
HACRO rolC ; +?2 AR [ CE>>SIIE C T?CF 3 ]> RSHIFT RA >ITERA> >SHIFT OR ;
4 colK adr 33 ! C Hove #hi$ted .#t =uadrant value# into upper ta&le =uadrant#
':1 0 +O +?2 AR R C =uad.[I] M a&cd placed on #tac6
rolC 7 +?2 RR ':1 CE>>S Q K C =uad'[I] M &cda i# #tored
rolC 7 +?2 RR :.' CE>>S Q K C =uad8[I] M cda& i# #tored
rolC 7 RR 017 CE>>S Q K C =uadE[I] M da&c i# #tored
RA CE>>Q C addre## $or =uad.[IQ.]
>OO2 +RO2
P
ARCHITECT?RE [IF] C Set dmi< array to do identical cipher architecture#
4 dmi<[] P C +o nothin%( no dmi< array proce##in% nece##ary
[E>SE] C Set dmi< array to do inverted cipher architecture
dmi< dmi< 017 CE>>S Q ':1 CE>>S CHO,E C Hove dmi< .#t =uad into Eth =uad
4 dmi<[] 33 ! C Reorder then move dmi< value# to match ta&le inde< value#
':1 0 +O #&o< I CE>>S Q R C Retrieve &yte value at #&o<[I]
CE>>S C Convert to array addre## inde< I@
dmi< Q 017 CE>>S Q R C Let icolmi< data $rom dmi<E[I@]
dmi< I CE>>S Q K C Store in .#t =uad at dmi<[I]
>OO2
P
[THEN]
C Fill re#t o$ lar%e array# -ith #hi$ted value# $rom the array# .#t =uadrant
#&o< colK i&o< colK emi< colK dmi<[] dmi< colK
TAG>ESK C FORLET thi# code pur%e $rom dictionary! a$ter #torin% ta&le#
+ECIHA>
4 6eyadd 6adr 33 6adr! C Add OOR! 6ey #e%ment to STATE
+?2 +?2 AR R col[0] R OOR col[0] K C col[0] SM 6[0]
RR [ . CE>>S ]> Q R col[.] R OOR col[.] K C col[.] SM 6[.]
RR [ ' CE>>S ]> Q R col['] R OOR col['] K C col['] SM 6[']
RA [ 8 CE>>S ]> Q R col[8] R OOR col[8] K C col[8] SM 6[8]
P
HEO 08FC CONSTANT &ytema#6
+ECIHA>
C For #elected &yte 038! o$ cell on #tac6 %et 8'3&it STATE column or ta&le value
HACRO &yte0RC ; CE>>S &ytema#6 AN+ [ C ':1 T CE>>S C Q ]> Q R ;
HACRO &yte.RC ; 01 RSHIFT &ytema#6 AN+ [ C ':1 T CE>>S C Q ]> Q R ;
HACRO &yte'RC ; .E RSHIFT &ytema#6 AN+ [ C ':1 T CE>>S C Q ]> Q R ;
HACRO &yte8RC ; '' RSHIFT &ytema#6 AN+ [ C ':1 T CE>>S C Q ]> Q R ;
C Add OOR! a FEU #e%ment to a STATE column #e%ment
HACRO 6eyaddiC ; RR [ C CE>>S ]> Q R OOR C K ;
C MMMMMMMMMMMMMMMMMMM Fey E<pan#ion Nord#et MMMMMMMMMMMMMMMMMMM
+ECIHA>
4 col#u& < 33 y ! C Replace cell &yte# -ith #&o< value#
+?2 AR &yte0RC 0 #&o< RR &yte.RC . #&o< OR
RR &yte'RC ' #&o< OR RA &yte8RC 8 #&o< OR
P
4 rot#u& < 33 y ! C Replace rotated cell &yte# -ith #&o< value#
+?2 AR &yte0RC 8 #&o< RR &yte.RC 0 #&o< OR
RR &yte'RC . #&o< OR RA &yte8RC ' #&o< OR
P
C Fir#t column 6ey e<pan#ion 6adr < con#adr 33 y 6adr@ !
HACRO col0C ; R SNA2 rot#u& OOR SNA2 +?2 AR R OOR +?2 RR [ C CE>>S ]> Q K RA CE>>Q ;
C Normal 6ey e<pan#ion < 6adr 33 y 6adr@ !
HACRO coliC ; +?2 AR R OOR +?2 RR [ C CE>>S ]> Q K RA CE>>Q ;
4 .'76eye<pand 6adr < cadr 33 ! C E<pand .'73&it 6ey
.0 0 +O +?2 AR col0C E coliC E coliC E coliC E
SNA2 RA CE>>Q
>OO2 '+RO2 +RO2
P
4 ./'6eye<pand 6adr < cadr 33 ! C E<pand ./'3&it 6ey
0 0 +O +?2 AR col0C 1 coliC 1 coliC 1
coliC 1 coliC 1 coliC 1 SNA2 RA CE>>Q
>OO2 col0C 1 coliC 1 coliC 1 coliC 1 '+RO2
P
4 ':16eye<pand 6adr < cadr 33 ! C E<pand ':13&it 6ey
1 0 +O +?2 AR col0C 7 coliC 7 coliC 7 coliC 7 AR col#u& RA
coliC 7 coliC 7 coliC 7 coliC 7 SNA2 RA CE>>Q
>OO2 col0C 7 coliC 7 coliC 7 coliC 7 '+RO2
P
0 ,A>?E rndcnt 0 ,A>?E .#t6ey C Init cipher round# parameter#
C Set up #tac6 -ith correct parameter# $or 6ey e<pan#ion
HACRO #etupC ; +RO2 e<p6ey +?2 [ C CE>>S ]> Q R 6eycon#;
ARCHITECT?RE [IF] C Thi# -ill per$orm modi$ied 6ey proce##in%
C Convert I &yte array inde< to ne- I@ array inde< &y #&o<I! 3A I@
HACRO #3Ai ; CE>>S #&o< Q R CE>>S ;
C ?#e a# 6mi<C i )( -here @i@ 038! i# the &yte inde< o$ cell @)@ 038! o$ the
C current .'73&it 6ey #e%ment" &ytei()! inde<e# the #&o< ta&le( -hich produce#
C the array inde< value $or =uad @i@ o$ dmi<( -hich i# the icolmi< value $or @i@
HACRO 6mi<iC ; RR [ C +?2 C CE>>S Q ]> Q CR #3Ai [ ':1 T CE>>S dmi< Q ]> Q R;
4 i6eycolmi< 6adr 33 ! C +o inver#e colmi< on a .'73&it 6ey #e%ment
AR C Store &e%innin% o$ 6ey #e%ment on RET?RN
6mi<iC 0 0 6mi<iC . 0 OOR 6mi<iC ' 0 OOR 6mi<iC 8 0 OOR RR K
6mi<iC 0 . 6mi<iC . . OOR 6mi<iC ' . OOR 6mi<iC 8 . OOR RR [ . CE>>S ]> Q K
6mi<iC 0 ' 6mi<iC . ' OOR 6mi<iC ' ' OOR 6mi<iC 8 ' OOR RR [ ' CE>>S ]> Q K
6mi<iC 0 8 6mi<iC . 8 OOR 6mi<iC ' 8 OOR 6mi<iC 8 8 OOR RA [ 8 CE>>S ]> Q K
P
4 icolmi<6ey 33 ! C +o inver#e colmi< on the $ully e<panded 6ey
e<p6ey [ E CE>>S ]> Q C 2oint to .#t e<panded 6ey #e%ment
rndcnt 0 +O +?2 i6eycolmi< [ E CE>>S ]> Q >OO2 +RO2
P
HACRO mod6ey ; icolmi<6ey; C +o modi$ied 6ey proce##in%
[E>SE] HACRO mod6ey ; ; C +o nothin% $or re%ular 6ey proce##in%
[THEN]
4 6eye<pand 6eyadr 6ey#i9e mode 33 ! C Create e<panded 6ey data
mode ! AR C Save mode on RET?RN
6#i9e! 8 RSHIFT AR C +ivide 6ey#i9e &y 7 $or &ytecnt and #ave
e<p6ey RR CHO,E C Hove 6ey to e<panded 6ey array
C No- do 6ey proce##in% accordin% to 6ey &ytecnt
RA +?2 .1 M IF #etupC 8 .'76eye<pand / TO rndcnt E>SE
+?2 'E M IF #etupC : ./'6eye<pand .. TO rndcnt E>SE
+?2 8' M IF #etupC 0 ':16eye<pand .8 TO rndcnt E>SE
RA mode! +RO2 . OR A&ort; Invalid Fey#i9e ;
THEN THEN THEN
RA mode! IF C Set 6ey pointer to la#t 6ey #e%ment to decipher
e<p6ey rndcnt .Q [ .1 CHARS ]> T Q TO .#t6ey
mod6ey C +o modi$ied 6ey proce##in% i$ nece##ary
E>SE C Set 6ey pointer to $ir#t 6ey #e%ment to encipher
e<p6ey TO .#t6ey
THEN
P
C MMMMMMMMMMMMMMMM EN+IAN 2roce##in% Nord#et MMMMMMMMMMMMMMMM
4 &yte#AB m 33 - ! C Rever#e cell &yte#4 .'8E:107 B3A 07:18E.'
[ HEO ] +?2 AR .7 >SHIFT RR FF00 AN+ 7 >SHIFT OR
RR FF0000 AN+ 7 RSHIFT OR RA .7 RSHIFT OR [ +ECIHA> ]
P
4 cell#rever#e adr n 33 ! C Rever#e &yte# o$ n cell# in array
0 +O +?2 R &yte#AB O,ER K CE>>Q >OO2 +RO2
P
endianJ CR [IF] C i$ little EN+IAN( e"%" 2entium Cla## 2C@#!
HACRO endianarray ; ; adr 33 adr ! C +o nothin%
[E>SE] C i$ &i% EN+IAN( e"%" 2o-er 2C@# Hac#!
HACRO endianarray ; +?2 7 cell#rever#e ; adr 33 adr !
[THEN]
C MMMMMMMMMMMMMMMMMMMMM Encipher Nord#et MMMMMMMMMMMMMMMMMMMMMM
4 #u&col0 33 < ! C Gyte #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[0] R &yte0RC 0 #&o< col[.] R &yte.RC . #&o< OR
col['] R &yte'RC ' #&o< OR col[8] R &yte8RC 8 #&o< OR
P
4 #u&col. 33 < ! C Gyte #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[.] R &yte0RC 0 #&o< col['] R &yte.RC . #&o< OR
col[8] R &yte'RC ' #&o< OR col[0] R &yte8RC 8 #&o< OR
P
4 #u&col' 33 < ! C Gyte #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col['] R &yte0RC 0 #&o< col[8] R &yte.RC . #&o< OR
col[0] R &yte'RC ' #&o< OR col[.] R &yte8RC 8 #&o< OR
P
4 #u&col8 33 < ! C Gyte #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[8] R &yte0RC 0 #&o< col[0] R &yte.RC . #&o< OR
col[.] R &yte'RC ' #&o< OR col['] R &yte8RC 8 #&o< OR
P
4 colmi<0 33 < ! C Col mi< #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[0] R &yte0RC 0 emi< col[.] R &yte.RC . emi< OOR
col['] R &yte'RC ' emi< OOR col[8] R &yte8RC 8 emi< OOR
P
4 colmi<. 33 < ! C Col mi< #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[.] R &yte0RC 0 emi< col['] R &yte.RC . emi< OOR
col[8] R &yte'RC ' emi< OOR col[0] R &yte8RC 8 emi< OOR
P
4 colmi<' 33 < ! C Col mi< #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col['] R &yte0RC 0 emi< col[8] R &yte.RC . emi< OOR
col[0] R &yte'RC ' emi< OOR col[.] R &yte8RC 8 emi< OOR
P
4 colmi<8 33 < ! C Col mi< #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[8] R &yte0RC 0 emi< col[0] R &yte.RC . emi< OOR
col[.] R &yte'RC ' emi< OOR col['] R &yte8RC 8 emi< OOR
P
4 enciphrndi 6adr 33 6adr@! C Encpiher round -5current e<p6ey #e%ment
AR colmi<8 colmi<' colmi<. colmi<0 col8""col0 !
6eyaddiC 0 col[0] 6eyaddiC . col[.]
6eyaddiC ' col['] 6eyaddiC 8 col[8] RA [ E CE>>S ]> Q 6adr@!
P
4 enciphrndn 6adr 33 ! C >a#t encipher round -ithout colmi<
AR #u&col8 #u&col' #u&col. #u&col0 col8""col0 !
6eyaddiC 0 col[0] 6eyaddiC . col[.] 6eyaddiC ' col[']
RA [ 8 CE>>S ]> Q R OOR col[8] K
P
4 AESencipher 33 ! C Encipher input &loc6 -ith %iven 6ey
C Fir#t Add OOR! input &loc6 -ith ori%inal 6ey
.#t6ey 6eyadd [ E CE>>S ]> Q 6adr@!
rndcnt 0 +O enciphrndi >OO2 enciphrndn C +o $ull encipher
P
C MMMMMMMMMMMMMMMMMMMMM +ecipher Nord#et MMMMMMMMMMMMMMMMMMMMMM
4 i#u&col0 33 < ! C Gyte #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[0] R &yte0RC 0 i&o< col[8] R &yte.RC . i&o< OR
col['] R &yte'RC ' i&o< OR col[.] R &yte8RC 8 i&o< OR
P
4 i#u&col. 33 < ! C Gyte #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[.] R &yte0RC 0 i&o< col[0] R &yte.RC . i&o< OR
col[8] R &yte'RC ' i&o< OR col['] R &yte8RC 8 i&o< OR
P
4 i#u&col' 33 < ! C Gyte #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col['] R &yte0RC 0 i&o< col[.] R &yte.RC . i&o< OR
col[0] R &yte'RC ' i&o< OR col[8] R &yte8RC 8 i&o< OR
P
4 i#u&col8 33 < ! C Gyte #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[8] R &yte0RC 0 i&o< col['] R &yte.RC . i&o< OR
col[.] R &yte'RC ' i&o< OR col[0] R &yte8RC 8 i&o< OR
P
ARCHITECT?RE [IF] C For identical cipher# architecture#
4 icolmi<0 33 < ! C InvCol mi< #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[0] R &yte0RC 0 dmi< col[8] R &yte.RC . dmi< OOR
col['] R &yte'RC ' dmi< OOR col[.] R &yte8RC 8 dmi< OOR
P
4 icolmi<. 33 < ! C InvCol mi< #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[.] R &yte0RC 0 dmi< col[0] R &yte.RC . dmi< OOR
col[8] R &yte'RC ' dmi< OOR col['] R &yte8RC 8 dmi< OOR
P
4 icolmi<' 33 < ! C InvCol mi< #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col['] R &yte0RC 0 dmi< col[.] R &yte.RC . dmi< OOR
col[0] R &yte'RC ' dmi< OOR col[8] R &yte8RC 8 dmi< OOR
P
4 icolmi<8 33 < ! C InvCol mi< #u&#titution# o$ ro- &yte# o$ #hi$ted col#
col[8] R &yte0RC 0 dmi< col['] R &yte.RC . dmi< OOR
col[.] R &yte'RC ' dmi< OOR col[0] R &yte8RC 8 dmi< OOR
P
4 deciphrndi 6adr 33 6adr@! C +ecpiher round -5current e<p6ey #e%ment
AR icolmi<8 icolmi<' icolmi<. icolmi<0 col8""col0 !
6eyaddiC 0 col[0] 6eyaddiC . col[.]
6eyaddiC ' col['] 6eyaddiC 8 col[8] RA [ E CE>>S ]> 3 6adr@!
P
4 deciphrndn 6adr 33 ! C Fir#t round -ithout colmi<
AR i#u&col8 i#u&col' i#u&col. i#u&col0 col8""col0 !
6eyaddiC 0 col[0] 6eyaddiC . col[.] 6eyaddiC ' col[']
RA [ 8 CE>>S ]> Q R OOR col[8] K
P
4 AESdecipher 33 ! C Encipher input &loc6 -ith %iven 6ey
C Fir#t Add OOR! input &loc6 -ith la#t 6ey #e%nent
.#t6ey 6eyadd [ E CE>>S ]> 3 6adr@!
rndcnt 0 +O deciphrndi >OO2 deciphrndn C +o $ull decipher
P
[E>SE] C For inverted cipher# architecture
C MMMMMMMMMMMMMMMMM Inverted +ecipher Nord#et MMMMMMMMMMMMMMMMMM
4 icolmi<0 33 ! C Inver#e col mi< o$ column 0 ro- &yte#
col[0] R +?2 AR &yte0RC 0 dmi< RR &yte.RC . dmi< OOR
RR &yte'RC ' dmi< OOR RA &yte8RC 8 dmi< OOR col[0] K
P
4 icolmi<. 33 ! C Inver#e col mi< o$ column . ro- &yte#
col[.] R +?2 AR &yte0RC 0 dmi< RR &yte.RC . dmi< OOR
RR &yte'RC ' dmi< OOR RA &yte8RC 8 dmi< OOR col[.] K
P
4 icolmi<' 33 ! C Inver#e col mi< o$ column ' ro- &yte#
col['] R +?2 AR &yte0RC 0 dmi< RR &yte.RC . dmi< OOR
RR &yte'RC ' dmi< OOR RA &yte8RC 8 dmi< OOR col['] K
P
4 icolmi<8 33 ! C Inver#e col mi< o$ column 8 ro- &yte#
col[8] R +?2 AR &yte0RC 0 dmi< RR &yte.RC . dmi< OOR
RR &yte'RC ' dmi< OOR RA &yte8RC 8 dmi< OOR col[8] K
P
4 deciphrnd0 6adr 33 6adr@! C Fir#t round -ithout inver#e colmi<
AR i#u&col8 i#u&col' i#u&col. i#u&col0 col8""col0 !
6eyaddiC 0 col[0] 6eyaddiC . col[.]
6eyaddiC ' col['] 6eyaddiC 8 col[8] RA [ E CE>>S ]> 3 6adr@!
P
4 deciphrndi 6adr 33 6adr@! C +ecpiher round -5current e<p6ey #e%ment
AR icolmi<8 icolmi<' icolmi<. icolmi<0
i#u&col8 i#u&col' i#u&col. i#u&col0 col8""col0 !
6eyaddiC 0 col[0] 6eyaddiC . col[.]
6eyaddiC ' col['] 6eyaddiC 8 col[8] RA [ E CE>>S ]> 3 6adr@!
P
4 AESdecipher 33 ! C +ecipher input &loc6 -ith %iven e<panded 6ey
C Fir#t Add OOR! input &loc6 -ith la#t 6ey #e%nent
.#t6ey 6eyadd [ E CE>>S ]> 3 6adr@!
deciphrnd0 rndcnt 0 +O deciphrndi >OO2 +RO2 C +o $ull decipher
P
[THEN]
C MMMMMMMMMMMMMMMMMMMMM AES File Nord#et MMMMMMMMMMMMMMMMMMMM
C Nord# to read a $ile( encipher or decipher it( #tore re#ult# in another $ile
+ECIHA>
0 ,A>?E mode C Hold# cipher mode4 encipher or decipher
0 ,A>?E 6ey#i9e C Cipher 6ey#i9e in &it#
.1 ,A>?E &loc6#i9e C AES &loc6#i9e in &yte#
,ARIAG>E ae#3mode C Hold# e<ecution addre## $or #elected AES mode
,ARIAG>E r$ileid C Hold# $ileid o$ input $ile
,ARIAG>E -$ileid C Hold# $ileid o$ output $ile
,ARIAG>E n&loc6# C Num&er o$ $ull .1 &yte &loc6# in input $ile
,ARIAG>E npad# C Num&er o$ time# &ytepad can &e $ully $illed
,ARIAG>E rem&yte# C Num&er o$ &yte# B .1 at end o$ input $ile
,ARIAG>E rem&loc6# C Num&er o$ $ull &loc6# remainin% to readV-rite
,ARIAG>E pad&loc6# C Num&er o$ $ull &loc6# &ytepad array can hold
,ARIAG>E padlen C Num&er o$ &yte# o$ pad #tora%e
7./' pad&loc6# K C Set num&er o$ &loc6# $or &ytepad array to hold
pad&loc6# R &loc6#i9e T padlen K C Set &yte len%th o$ &ytepad array
CREATE &ytepad padlen R A>>OT C Create &ytepad array to #tore input $ile data
4 read3&yte# n 3 ! C Read n &yte# $rom opened input $ile into &ytepad array
&ytepad SNA2 r$ileid R REA+3FI>E '+RO2 C Read n &yte# into &ytepad array
P
4 -rite3&yte# n 3 ! C Nrite n &yte# $rom &ytepad array to opened output $ile
&ytepad SNA2 -$ileid R NRITE3FI>E +RO2 C Nrite n &yte# to output $ile
P
4 InputFileName 33 ior! C Open input $ile a# read only( #tore $ileid
CR "; Input Filename4 ; 2A+ +?2 70 ACCE2T adr D!
R5O O2EN3FI>E SNA2 r$ileid K ior!
P
4 TryA%ainJ 33 J! C Chec6 $or invalid input $ile
CR "; Invalid iput $ile( try a%ainJ U5N!;
FEU +?2 EHIT +?2 [CHAR] N M SNA2 [CHAR] n M OR
P
4 OutputFileName 33 ior! C Create output $ile a# read5-riteP #tore $ileid
CR "; Output Filename4 ; 2A+ +?2 70 ACCE2T adr D!
R5N CREATE3FI>E SNA2 -$ileid K ior!
P
4 InputA%ain 33 ! CR "; Invalid output $ile( enter another $ilename; P
4 char#Anum&er caddr 33 num caddr@! C Convert HEO &yte char# to num&er value
AR 0 0 RA HEO C Set up counted #trin% to convert char#
GELIN +?2 CR G> M C I$ current char i# a ;#pace; '0h!
NHI>E CHARQ RE2EAT C S6ip ;#pace; char# until data&yte
' AN?HGER +RO2 NI2 +ECIHA> C Convert ' he<! char# to &yte num&er
P
4 File#i9e 33 ! C ?tility -ord to di#play &yte#i9e $or entered $ilename
"; o$ ; 2A+ +?2 70 ACCE2T adr D! R5N O2EN3FI>E +RO2 $ileid!
+?2 FI>E3SIIE +RO2 ud! "; ha# ; +" "; &yte#; C>OSE3FI>E +RO2 CR
P
4 InputHode 33 ! C Enter cipher mode and #et ae#mode
GELIN
CR "; Enter cipher mode4 [E5e or +5d] ;
FEU +?2 EHIT
+?2 [CHAR] E M O,ER [CHAR] e M OR
IF enciph TO mode [@] AESencipher ae#3mode K +RO2 EOIT THEN
+?2 [CHAR] + M SNA2 [CHAR] d M OR
IF deciph TO mode [@] AESdecipher ae#3mode K EOIT THEN
CR "; Invalid entry( try a%ain";
ALAIN
P
4 InputFey#i9e 33 ! C Enter 6ey#i9e
GELIN +ECIHA>
CR "; Enter Fey#i9e4 . .'7! V ' ./'! V 8 ':1!4 ;
FEU +?2 EHIT
+?2 [CHAR] . M IF .'7 TO 6ey#i9e +RO2 EOIT THEN
+?2 [CHAR] ' M IF ./' TO 6ey#i9e +RO2 EOIT THEN
[CHAR] 8 M IF ':1 TO 6ey#i9e EOIT THEN
CR "; Invalid entry( try a%ain" ;
ALAIN
P
4 InputFey 33 ! +ECIHA> C Input cipher 6ey
CR "; To enter 6ey numerically a# HEO di%it# type N5n4 ;
CR "; To enter a# ASCII character# type any other 6ey4 ;
FEU +?2 EHIT +?2 [CHAR] N M SNA2 [CHAR] n M OR +?2 J J!
C +etermine and #ave di%it or char count re=uired $or input entry
IF 6ey#i9e E 5 J Ddi%it#! C HEO di%it count
E>SE 6ey#i9e 7 5 J Dchar# ! C ASCII char count
THEN AR J ! C Save di%it5char count on RET?RN
GELIN +ECIHA> C Receive 6ey data input
CR "; A ; 6ey#i9e " "; &it 6ey need# ;
RR " +?2 J J ! IF "; di%it#4 ; E>SE "; char#4 ; THEN
RR 0 +O [CHAR] T EHIT >OO2 C EHIT #trin% o$ T@#
CR "; Enter the ; RR " "; di%t#5char# here4 ;
2A+ +?2 70 ACCE2T RR B J adr J ! C Enou%h di%it#5char#J
NHI>E J adr ! +RO2 CR "; Not enou%h di%it#5char#( enter 6ey a%ainP;
RE2EAT J adr !
SNA2 adr J ! C I# input HEO di%it#J
IF e<p6ey RA adr e<padr Ddi%it#! C For HEO di%it entry
C Convert HEO char# into numerical &yte# and #tore in 6ey array
'5 0 +O AR char#Anum&er SNA2 RR CK RA CHARQ >OO2 '+RO2
E>SE adr! e<p6ey RA Dchar#! CHO,E C Hove CHARS into 6ey array
THEN 33 !
e<p6ey endianarray e<p6ey! C Endian convert array i$ nece##ary
e<p6ey! 6ey#i9e mode 6eye<pand C Create e<panded 6ey#
P
4 ae#3&loc6# &ytepadadr n 3 ! C Cipher and replace n &loc6# $rom &ytepad array
0 +O ciphdat '+?2 &loc6#i9e CHO,E C Hove a &loc6 into ciphdat array
ae#3mode R EOEC?TE a. a'! C [En5+e]cipher the &loc6
O,ER &loc6#i9e CHO,E a. ! C Replace ori%inal &loc6 in &ytepad
&loc6#i9e Q a.@ ! C 2oint to ne<t &loc6 in &ytepad
>OO2 +RO2 33 ! C +o n time#( clear #tac6 -hen done
P
4 AES$ile 3! C 2er$orm AES in %iven cipher mode in ECG mode
InputHode C Input cipher mode
InputFey#i9e C Input 6ey#i9e in &it#
InputFey C Input 6ey and proce## it
GELIN InputFileName ior! C Enter input $ilename
NHI>E TryA%ainJ IF EOIT THEN RE2EAT C Not valid( try not! a%ain
GELIN OutputFileName ior! C Re=ue#t output $ile name
NHI>E InputA%ain RE2EAT C Not valid( try not! a%ain
r$ileid R FI>E3SIIE +RO2 ud ! C Let &yte#i9e o$ input $ile
mode ud J ! C I$ decipherin% input $ile
IF . 0 +3 ud@ ! C Su&tract . $rom $ile#i9e $or rem&yte
. read3&yte# ud@ ! C Let ori%inal plainte<t $ile rem&yte#
&ytepad CR rem&yte# K ud@ ! C Store plainte<t $ile rem&yte# count
&loc6#i9e ?H5HO+ n&loc6# K rem&#! C Store num&loc6#( rem&yte# #hould &e 0
IF r$ileid R C>OSE3FI>E +RO2 C I$ input rem&yte# BA0 C>OSE input $ile
-$ileid R C>OSE3FI>E +RO2 C C>OSE the output $ile
AGORT; Cipherte<t corruptedK; C Nrite mee#a%e( then a&ort
THEN
E>SE ud ! C I$ encipherin% input $ile
&loc6#i9e ?H5HO+ n&loc6# K rem&yte# K C Store D o$ $ull&loc6# and rem&yte#
rem&yte# . -$ileid R NRITE3FI>E +RO2 C Nrite rem&yte# to .#t &yte o$ out$ile
THEN
n&loc6# R 0 pad&loc6# R ?H5HO+ r = ! C +etermine num&er o$ time# &ytepad $illed
npad# K rem&loc6# K C Set value# accordin%ly
npad# R J+?2 C I# num&er o$ time# &yteppad $illed A 0 J
IF 0 +O padlen R read3&yte# C Read padlen $rom in$ile to &ytepad
&ytepad pad&loc6# R ae#3&loc6# C +o AES on all &loc6# o$ &ytepad data
padlen R -rite3&yte# C Nrite ciphered &loc6# to out$ile
>OO2 C +o $or all complete padlen #e%ment#
THEN
rem&loc6# R J+?2 C Are rem&loc6# B padlen le$tJ
IF +?2 &loc6#i9e T T?CF C Set #tac6 n&yte# n&loc6# n&yte#!
n&yte# ! read3&yte# C Read remainin% &yte# in $ull &loc6#
n&loc6#! &ytepad SNA2 ae#3&loc6# C +o AES on remainin% $ull &loc6#
n&yte# ! -rite3&yte# C Nrite encipehered &loc6# to out$ile
THEN
mode enciph M rem&yte# R AN+ J+?2 C I$ remainin% encipher #tray &yte# le$tJ
IF rem&yte#! read3&yte# C Read remainin% &yte# into &ytepad
&ytepad . ae#3&loc6# C +o AES on la#t &loc6 -ith $ill &yte#
&loc6#i9e -rite3&yte# C Nrite la#t ciphered &loc6 to out$ile
THEN
mode rem&yte# R AN+ J! C I$ decipher mode AN+ rem&yte# A 0
IF -$ileid R FI>E3SIIE +RO2 ud ! C Let end po#ition o$ deciphered $ile
&loc6#i9e rem&yte# R 3 0 +3 u+@! C Su&tract cipherte<t $ill &yte#
-$ileid R RESIIE3FI>E +RO2 C Ha6e deciphered $ile ori%inal len%th
THEN
mode IF C End o$ decipherin%( di#play
CR "; Ori%inal data re#tored in output $ile; C +eciphered mode completion me##a%e
E>SE C End o$ encipherin%( di#play
CR "; Enciphered input #tored in output $ile; C Enciphered mode completion me##a%e
THEN CR
r$ileid R C>OSE3FI>E +RO2 C Clo#e the input $ile
-$ileid R C>OSE3FI>E +RO2 C Clo#e the output $ile
e<p6ey 10 CE>>S '+?2 3. FI>> 0 FI>> C Scru& e<p6ey array
&ytepad padlen R '+?2 3. FI>> 0 FI>> C Scru& &ytepad array
P
C MMMMMMMMMMMMMMMM AES #trin% di#play -ord#et MMMMMMMMMMMMMMM
+ECIHA>
C Array o$ di%it# 0.'8E:107/a&cde$
4 di%itW 33 adr ! S; 0.'8E:107/a&cde$; +RO2 P
4 #avedi%it n 33 ! 2A+ CR .Q +?2 2A+ CK 2A+ Q CK P
4 &ytedi%it# n. 33 !
+?2 E RSHIFT di%itW Q CR #avedi%it .: AN+ di%itW Q CR #avedi%it
P
endianJ CR [IF] C little EN+IAN
4 celldi%it# a. 33 ! +?2 E Q SNA2 +O I CR &ytedi%it# >OO2 P
[E>SE] C &i% EN+IAN
4 celldi%it# a. 33 ! +?2 8 Q +O I CR &ytedi%it# 3. Q>OO2 P
[THEN]
4 #trin%" adr cellcnt 33 ! C +i#play counted #trin% array
0 2A+ K 0 +O +?2 celldi%it# CE>>Q >OO2 +RO2 2A+ CO?NT TU2E
P
4 adr# adr n 33 adr@ n! T?CF .3 CE>>S Q SNA2 P
C >oad array# -ith te#t data on #tac6
endianJ CR [IF] C little EN+IAN
4 te#tdataK d.""dn adr n 3! adr# 0 +O SNA2 &yte#AB O,ER K CE>>3 >OO2 +RO2 P
[E>SE] C &i% EN+IAN
4 te#tdataK d.""dn adr n 3! adr# 0 +O T?CF K CE>>3 >OO2 +RO2 P
[THEN]
C MMMMMMMMMMMMMMMMMMMMMM AES Te#t Suite MMMMMMMMMMMMMMMMMMMMMMM
4 AESte#t [ HEO ]
000.0'08 0E0:0100 070/0a0& 0c0d0e0$ e<p6ey E te#tdataK
00..''88 EE::1100 77//aa&& ccddee$$ ciphdat E te#tdataK [ +ECIHA> ]
CR CR "; For .'73&it 6ey4 ; e<p6ey E #trin%"
CR "; 2lainte<t input4 ; ciphdat E #trin%"
CR "; Fno-n cipherte<t4 1/cEe0d71a0&0E80d7cd&07000&Ec::a;
e<p6ey .'7 enciph 6eye<pand ae#encipher
CR "; Computed ciphte<t4 ; ciphdat E #trin%"
e<p6ey .'7 deciph 6eye<pand ae#decipher
CR "; Computed ori%inal4 ; ciphdat E #trin%"
[ HEO ] 000.0'08 0E0:0100 070/0a0& 0c0d0e0$ .0...'.8 .E.:.1.0
e<p6ey 1 te#tdataK
00..''88 EE::1100 77//aa&& ccddee$$ ciphdat E te#tdataK [ +ECIHA> ]
CR CR "; For ./'3&it 6ey4 ; e<p6ey 1 #trin%"
CR "; 2lainte<t input4 ; ciphdat E #trin%"
CR "; Fno-n cipherte<t4 dda/0caE71Ecd$e01ea$00a0ec0d0./.;
e<p6ey ./' enciph 6eye<pand ae#encipher
CR "; Computed ciphte<t4 ; ciphdat E #trin%"
e<p6ey ./' deciph 6eye<pand ae#decipher
CR "; Computed ori%inal4 ; ciphdat E #trin%"
[ HEO ] 000.0'08 0E0:0100 070/0a0& 0c0d0e0$
.0...'.8 .E.:.1.0 .7./.a.& .c.d.e.$ e<p6ey 7 te#tdataK
00..''88 EE::1100 77//aa&& ccddee$$ ciphdat E te#tdataK [ +ECIHA> ]
CR CR "; For ':13&it 6ey4 ; e<p6ey 7 #trin%"
CR "; 2lainte<t input4 ; ciphdat E #trin%"
CR "; Fno-n cipherte<t4 7ea'&0ca:.10E:&$ea$cE//0E&E/107/;
e<p6ey ':1 enciph 6eye<pand ae#encipher
CR "; Computed ciphte<t4 ; ciphdat E #trin%"
e<p6ey ':1 deciph 6eye<pand ae#decipher
CR "; Computed ori%inal4 ; ciphdat E #trin%" CR
P
C MMMMMM 2er$ormance Te#t Code $or variou# Forth #y#tem# MMMMMM
C MMMM 2rovide appropriate code here $or #y#tem# not #ho-n MMMM
C Convert milli#econd dou&le count to y"<<< #ec# output
4 m#ec# ud3m# 33 ! BD D D D [char] " HO>+ DS DA TU2E "; #ec#; P
C Convert micro#econd dou&le count to y"<<<<<< #ec# output
4 u#ec# ud3u# 33 ! BD D D D D D D [char] " HO>+ DS DA TU2E "; #ec#; P
[+EFINE+] ,FOFORTH [IF]
C MMMMMMMMMMM ,FO Forth #peci$ic timin% te#t -ord# MMMMMMMMMMM
4 TIHER3START 3 m# ! Tic6# P
4 TIHER3EN+ m# 3 ! Tic6# SNA2 3 ?A+ m#ec# P
[THEN]
[+EFINE+] NIN8'FORTH3HEN?3GAR [IF]
C MMMMMMMMMMM Nin8'Forth #peci$ic timin% te#t -ord# MMMMMMMMMM
4 TIHER3START 3 m# ! HSR P
4 TIHER3EN+ m# 3 ! HSR SNA2 3 ?A+ m#ec# P
[THEN]
[+EFINE+] SNIFTFORTH3TOO>GAR [IF]
C MMMMMMMMMMM S-i$tForth #peci$ic timin% te#t -ord# MMMMMMMMMM
4 TIHER3START 3 dtime! ucounter P
4 TIHER3EN+ dtime 3! utimer! u#ec# P
[THEN]
[+EFINE+] InFoTa&le [IF]
C MMMMMMMMMMMMM L$orth #peci$ic timin% te#t -ord# MMMMMMMMMMMM
4 TIHER3START 3 dtime! utime P
4 TIHER3EN+ dtime 3! utime 'SNA2 +3 u#ec# P
[THEN]
[+EFINE+] TIHER3START [IF]
C MMMMMMMMMMMMMMMM Selected 2er$ormance te#t# MMMMMMMMMMMMMMMM
+ECIHA> .000000 ,A>?E ND
4 CiphArch 3 ! C State the architecture #tructure
ARCHITECT?RE
IF CR "; Cipher #tructure# are the #ame( decipher -ith modi$ied e<panded 6ey#;
E>SE CR "; +ecipher #tructure i# inverted( decipher -ith unmodi$ied e<panded 6ey#;
THEN
P
4 ciphte#t +ECIHA> C Speed te#t $or &oth cipher mode# $or all 8 6ey #i9e#
cr "; AES .'73&it encipher te#t $or ; ND " "; loop# i# ;
e<p6ey .'7 enciph 6eye<pand TIHER3START ND 0 +O AESencipher >OO2 TIHER3EN+
cr "; AES ./'3&it encipher te#t $or ; ND " "; loop# i# ;
e<p6ey ./' enciph 6eye<pand TIHER3START ND 0 +O AESencipher >OO2 TIHER3EN+
cr "; AES ':13&it encipher te#t $or ; ND " "; loop# i# ;
e<p6ey ':1 enciph 6eye<pand TIHER3START ND 0 +O AESencipher >OO2 TIHER3EN+
CR
cr "; AES .'73&it decipher te#t $or ; ND " "; loop# i# ;
e<p6ey .'7 deciph 6eye<pand TIHER3START ND 0 +O AESdecipher >OO2 TIHER3EN+
cr "; AES ./'3&it decipher te#t $or ; ND " "; loop# i# ;
e<p6ey ./' deciph 6eye<pand TIHER3START ND 0 +O AESdecipher >OO2 TIHER3EN+
cr "; AES ':13&it decipher te#t $or ; ND " "; loop# i# ;
e<p6ey ':1 deciph 6eye<pand TIHER3START ND 0 +O AESdecipher >OO2 TIHER3EN+
P
4 6eyte#t +ECIHA> C Speed te#t $or &oth cipher mode# $or all 8 6ey #i9e#
cr "; AES .'73&it encipher 6ey# $or ; ND " "; loop# i# ;
TIHER3START ND 0 +O e<p6ey .'7 enciph 6eye<pand >OO2 TIHER3EN+
cr "; AES ./'3&it encipher 6ey# $or ; ND " "; loop# i# ;
TIHER3START ND 0 +O e<p6ey ./' enciph 6eye<pand >OO2 TIHER3EN+
cr "; AES ':13&it encipher 6ey# $or ; ND " "; loop# i# ;
TIHER3START ND 0 +O e<p6ey ':1 enciph 6eye<pand >OO2 TIHER3EN+
CR
cr "; AES .'73&it decipher 6ey# $or ; ND " "; loop# i# ;
TIHER3START ND 0 +O e<p6ey .'7 deciph 6eye<pand >OO2 TIHER3EN+
cr "; AES ./'3&it decipher 6ey# $or ; ND " "; loop# i# ;
TIHER3START ND 0 +O e<p6ey ./' deciph 6eye<pand >OO2 TIHER3EN+
cr "; AES ':13&it decipher 6ey# $or ; ND " "; loop# i# ;
TIHER3START ND 0 +O e<p6ey ':1 deciph 6eye<pand >OO2 TIHER3EN+
P
4 #peed3te#t CiphArch ciphte#t CR 6eyte#t CR P
[THEN]

You might also like