Assembly Language for Beginners

(Jeff_L) #1

9.1. PRIMITIVE XOR-ENCRYPTION


440}, {39, 31077}, {34, 488}, {59, 17199}, {126, 1}, {95, 71}, {113,
2414}, {81, 1179}, {63, 10476}, {47, 48}, {55, 45}, {54, 73}, {64,
3}, {53, 94}, {56, 47}, {122, 1098}, {90, 532}, {124, 33}, {38,
21}, {96, 1}, {125, 2}, {37, 1}, {36, 2}}

In[]:= Length[input]/1285884 // N
Out[]= 4.34712


There are 1285884 spaces in the whole file, and the frequency of space occurrence is 1 space per ~ 4 : 3
characters.


Now here isAlice’s Adventures in Wonderland, by Lewis Carrollfrom the same library:


Listing 9.6: Mathematica

In[]:= input = BinaryReadList["/home/dennis/tmp/pg11.txt"];


In[]:= Tally[input]
Out[]= {{239, 1}, {187, 1}, {191, 1}, {80, 172}, {114, 6398}, {111,
9243}, {106, 222}, {101, 15082}, {99, 2815}, {116, 11629}, {32,
27964}, {71, 193}, {117, 3867}, {110, 7869}, {98, 1621}, {103,
2750}, {39, 2885}, {115, 6980}, {65, 721}, {108, 5053}, {105,
7802}, {100, 5227}, {118, 911}, {87, 256}, {97, 9081}, {44,
2566}, {121, 2442}, {76, 158}, {119, 2696}, {67, 185}, {13,
3735}, {10, 3735}, {84, 571}, {104, 7580}, {66, 125}, {107,
1202}, {102, 2248}, {109, 2245}, {46, 1206}, {89, 142}, {112,
1796}, {45, 744}, {58, 255}, {68, 242}, {74, 13}, {50, 12}, {53,
13}, {48, 22}, {56, 10}, {91, 4}, {69, 313}, {35, 1}, {49, 68}, {93,
4}, {82, 212}, {77, 222}, {57, 11}, {52, 10}, {42, 88}, {83,
288}, {79, 234}, {70, 134}, {72, 309}, {73, 831}, {85, 111}, {78,
182}, {75, 88}, {86, 52}, {51, 13}, {63, 202}, {40, 76}, {41,
76}, {59, 194}, {33, 451}, {113, 135}, {120, 170}, {90, 1}, {122,
79}, {34, 135}, {95, 4}, {81, 85}, {88, 6}, {47, 24}, {55, 6}, {54,
7}, {37, 1}, {64, 2}, {36, 2}}


In[]:= Length[input]/27964 // N
Out[]= 5.99049


The result is different probably because of different formatting of these texts (maybe indentation and/or
padding).


OK, so let’s assume the average frequency of space in English language is 1 space per 4..7 characters.


Now the good news again: we can measure frequency of spaces while decrypting our file gradually. Now
I count spaces in eachsliceand throw away 1-byte keys which produce results with too small number of
spaces (or too large, but this is almost impossible given so short key):


Listing 9.7: Python script

each_Nth_byte=[""]*KEY_LEN


content=read_file(sys.argv[1])


split input by 17-byte chunks:


all_chunks=chunks(content, KEY_LEN)
for c in all_chunks:
for i in range(KEY_LEN):
each_Nth_byte[i]=each_Nth_byte[i] + c[i]


try each byte of key


for N in range(KEY_LEN):
print "N=", N
possible_keys=[]
for i in range(256):
tmp_key=chr(i)*len(each_Nth_byte[N])
tmp=xor_strings(tmp_key,each_Nth_byte[N])


are all characters in tmp[] are printable?


if is_string_printable(tmp)==False:
continue


count spaces in decrypted buffer:


spaces=tmp.count(' ')
if spaces==0:

Free download pdf