The following 2-phrase, 10-word message was encrypted by converting each word in the original text from base 36 to base 10 (treating each letter as a number).
Next, the resulting numbers were concatenated to form one very long number:
3188696725382955872716533682296997335...
5701338323073559429444643676946239584...
715731974947334325407967846302738783
1) Identify where to place word breaks and decipher the message. (Easy)
2) Determine what each word in the message has in common. (Harder)
The following program is limited by QuickBasic to numbers of 15 or fewer decimal digits:
DECLARE FUNCTION isWord# (w$)
DATA 31886967253829558727165336822969973355701338323073559429444643676946239584715731974947334325407967846302738783
DEFDBL A-Z
READ x$
CLS
DO
max = 15
IF LEN(x$) < max THEN max = LEN(x$)
FOR i = 1 TO max
s$ = LEFT$(x$, i)
n = VAL(s$)
IF n = 0 THEN
w$ = "0"
ELSE
w$ = ""
DO
q = INT(n / 36)
r = n - q * 36
n = q
IF n > 0 OR r > 0 THEN
w$ = MID$("0123456789abcdefghijklmnopqrstuvwxyz", r + 1, 1) + w$
END IF
LOOP UNTIL n = 0
END IF
IF LEN(w$) > 2 THEN
IF isWord(w$) THEN EXIT FOR
END IF
NEXT
IF isWord(w$) THEN
IF flag THEN PRINT : PRINT : flag = 0
PRINT w$, " "; s$
x$ = MID$(x$, i + 1)
ELSE
IF flag = 0 THEN PRINT
COLOR 14: PRINT LEFT$(x$, 1); : COLOR 7
flag = 1
x$ = MID$(x$, 2)
END IF
LOOP UNTIL LEN(x$) = 0
END
FUNCTION isWord (w$)
n = LEN(w$)
w1$ = SPACE$(n)
OPEN "\words\words" + LTRIM$(STR$(n)) + ".txt" FOR BINARY AS #2
l = LOF(2) / n
low = 1: high = l
DO
mid = INT((low + high) / 2)
GET #2, (mid - 1) * n + 1, w1$
IF w1$ = w$ THEN isWord = 1: CLOSE 2: EXIT FUNCTION
IF w1$ < w$ THEN low = mid + 1: ELSE high = mid - 1
LOOP UNTIL low > high
isWord = 0
CLOSE 2
END FUNCTION
It finds:
encoded 31886967253
telegraph 82955872716533
68229699733557013383
alleged 23073559429
44464367694623
funded 958471573
brash 19749473
frogman 34325407967
assassin 846302738783
The first undecrypted string is too long to fit into a double floating point variable, the second is, it turns out, not in the word list.
UBASIC handles larger numbers, but not binary files (for the words), but can show the possibilities:
10 N1=68229699733557013383
11 for L=1 to len(cutspc(str(N1)))
12 N=val(left(cutspc(str(N1)),L))
15 S$=""
20 while N>0
30 R=N@36
40 Q=N\36
45 New$=mid("0123456789abcdefghijklmnopqrstuvwxyz",R+1,1)
50 S$=New$+S$
60 N=Q
99 wend
100 print S$,left(cutspc(str(N1)),L)
110 next L
which finds
6 6
1w 68
iy 682
59i 6822
1gn9 68229
emgo 682296
428mx 6822969
14medf 68229699
ba7zqd 682296997
34u7xbp 6822969973
vce7991 68229699733
8pfy0kif 682296997335
2f2fg5p4b 6822969973355
o6oahkz79 68229699733557
6puqwvts0i 682296997335570
1v6jh4u9s51 6822969973355701
intercepted 68229699733557013
56m63lg365zp 682296997335570133
1fu5ozygvpnx6 6822969973355701338
eedkxzkot4n7r 68229699733557013383
which means intercepted is a word in the plaintext, but still leaving 383, which could be an.
and similarly,
4 4
18 44
cc 444
3fi 4446
yb4 44464
9j37 444643
2naw4 4446436
qh0xb 44464367
7cq998 444643676
21jakkh 4446436769
kfcxpou 44464367694
5o9ld4wi 444643676946
1kqnxnd12 4446436769462
frenchman 44464367694623
indicates frenchman is a word in plaintext, not in my word list.
That resolves to: encoded telegraph intercepted an alleged frenchman funded brash frogman assassin.
|
Posted by Charlie
on 2006-02-07 11:01:33 |