More Greensleeves Numbers Station - Late Sept 2024.

Author

Scott Anthony Robson

Published

September 24, 2024

Modified

September 24, 2024

1 More Greensleeves Numbers Station - Late Sept 2024

In late September 2024, we received another message from the Greensleeves (fake) Numbers Station. It’s a long one!

1.1 Here are the recordings we have so far (we believe these are all the same message)

1.1.1 Transmission One:

A short transmission was recorded by Chris Smolinski in Maryland at 2035 UTC on 19 September 2024. This appears to be truncated and suddenly goes off air after about 6-7 minutes.

We think this was an aborted transmission because, well, who knows? But the following transmission was recorded four days later and contains the same numbers, but goes on for almost 30 minutes.

1.1.2 Transmission Two:

I recorded it on the K3FEF SDR, but I missed some of the intro of Greensleeves. The rest of the recording is solid and is the basis for the transcribing of the audio into numbers below:

1.2 Transcription of second coded message

The number string (as best as I can do) is below. They are five-figure groups (5FG), but I omitted the grouping because it doesn’t seem relevant:

7 21 5 5 17 15 23 12 4 14 15 12 15 2 15 15 3 4 16 12 1 14 7 16 16 4 23 6 16 16 25 16 23 21 6 21 23 24 0 2 12 24 16 23 12 14 7 16 16 4 21 4 13 1 21 17 7 9 2 16 7 16 1 17 16 6 13 23 12 4 18 16 5 6 12 12 24 16 13 4 12 9 23 15 7 17 11 11 16 13 21 4 13 5 21 7 16 16 2 16 21 11 16 23 2 21 25 16 18 12 24 16 9 17 15 2 15 7 21 11 23 21 4 13 23 4 21 7 16 23 15 12 23 15 16 21 6 21 9 21 0 12 3 7 1 7 16 16 13 12 24 18 2 12 7 3 23 12 2 7 21 5 5 17 15 23 5 12 6 13 9 17 15 2 2 16 21 7 15 23 23 12 1 7 16 16 15 2 7 12 3 14 2 9 12 12 13 23 9 16 7 3 4 1 7 12 24 15 0 7 21 4 4 0 4 12 18 2 21 17 4 23 23 2 21 6 6 5 17 4 13 4 12 18 21 14 16 23 2 21 6 6 20 16 16 11 1 12 7 15 2 16 16 21 7 15 2 5 16 6 12 4 14 23 15 12 9 16 15 2 16 0 5 3 17 6 13 15 2 16 17 7 9 21 6 6 23 15 2 16 0 11 21 25 16 15 2 16 6 21 4 13 9 17 15 2 24 16 15 21 6 18 6 21 9 23 21 4 13 14 7 15 16 13 0 2 21 4 13 23 5 3 15 15 2 7 12 3 14 2 15 2 16 4 17 14 2 15 9 16 15 21 20 16 12 3 7 23 15 21 4 13 21 4 13 18 6 21 17 24 9 2 21 15 15 2 16 0 25 16 1 12 7 23 21 20 16 4 18 2 12 7 3 23 12 2 7 21 5 5 17 15 23 5 12 6 13 9 17 15 2 2 16 21 7 15 23 23 12 1 7 16 16 15 2 7 12 3 14 2 9 12 12 13 23 9 16 7 3 4 1 7 12 24 15 0 7 21 4 4 0 4 12 18 2 21 17 4 23 23 2 21 6 6 5 17 4 13 4 12 18 21 14 16 23 2 21 6 6 20 16 16 11 1 12 7 15 2 16 16 21 7 15 2 5 16 6 12 4 14 23 15 12 9 16 23 12 21 11 16 23 5 16 9 21 7 16 15 2 16 13 21 9 4 9 17 6 6 7 17 23 16 9 17 15 2 15 9 17 15 18 2 17 4 14 16 21 7 23 21 4 13 18 3 4 4 17 4 14 16 0 16 23 9 16 6 6 15 21 20 16 15 2 16 6 21 4 13 5 16 4 16 21 15 2 0 12 3 7 23 20 17 16 23 15 2 16 7 21 5 5 17 15 23 23 2 21 6 6 5 16 1 7 16 16

These numbers may get updated as we proceed with the decode. One thing to note at this stage is that 15 and 16 are very hard to tell apart from the audio. So we need to be cautious about assigning 15 and 16 and recognize that sometimes this may need to be corrected.

1.3 Frequency Analysis

Again we will do some frequency analysis here to try and find our culprits for E and T and we should keep in mind that the letter H is often easy to find to, since the word ‘THE’ is common in english text.

1.3.1 Histogram of the frequency of each number in the chiphertext.

Code
import numpy as np
import matplotlib.pyplot as plt
import pprint

message = '''
7 21 5 5 17 15 23 12 4 14 15 12 15 2 15 15 3 4 16 12 1 14 7 16 16 4 23 6 16 16 25 16 23 21 6 21 23 24 0 2 12 24 16 23 12 14 7 16 16 4 21 4 13 1 21 17 7 9 2 16 7 16 1 17
16 6 13 23 12 4 18 16 5 6 12 12 24 16 13 4 12 9 23 15 7 17 11 11 16 13 21 4 13 5 21 7 16 16 2 16 21 11 16 23 2 21 25 16 18 12 24 16 9 17 15 2 15 7 21 11 23 21 4 13 23 4 
21 7 16 23 15 12 23 15 16 21 6 21 9 21 0 12 3 7 1 7 16 16 13 12 24 18 2 12 7 3 23 12 2 7 21 5 5 17 15 23 5 12 6 13 9 17 15 2 2 16 21 7 15 23 23 12 1 7 16 16 15 2 7 12 3 
14 2 9 12 12 13 23 9 16 7 3 4 1 7 12 24 15 0 7 21 4 4 0 4 12 18 2 21 17 4 23 23 2 21 6 6 5 17 4 13 4 12 18 21 14 16 23 2 21 6 6 20 16 16 11 1 12 7 15 2 16 16 21 7 15 2 
5 16 6 12 4 14 23 15 12 9 16 15 2 16 0 5 3 17 6 13 15 2 16 17 7 9 21 6 6 23 15 2 16 0 11 21 25 16 15 2 16 6 21 4 13 9 17 15 2 24 16 15 21 6 18 6 21 9 23 21 4 13 14 7 15 
16 13 0 2 21 4 13 23 5 3 15 15 2 7 12 3 14 2 15 2 16 4 17 14 2 15 9 16 15 21 20 16 12 3 7 23 15 21 4 13 21 4 13 18 6 21 17 24 9 2 21 15 15 2 16 0 25 16 1 12 7 23 21 20 
16 4 18 2 12 7 3 23 12 2 7 21 5 5 17 15 23 5 12 6 13 9 17 15 2 2 16 21 7 15 23 23 12 1 7 16 16 15 2 7 12 3 14 2 9 12 12 13 23 9 16 7 3 4 1 7 12 24 15 0 7 21 4 4 0 4 12 
18 2 21 17 4 23 23 2 21 6 6 5 17 4 13 4 12 18 21 14 16 23 2 21 6 6 20 16 16 11 1 12 7 15 2 16 16 21 7 15 2 5 16 6 12 4 14 23 15 12 9 16 23 12 21 11 16 23 5 16 9 21 7 16 
15 2 16 13 21 9 4 9 17 6 6 7 17 23 16 9 17 15 2 15 9 17 15 18 2 17 4 14 16 21 7 23 21 4 13 18 3 4 4 17 4 14 16 0 16 23 9 16 6 6 15 21 20 16 15 2 16 6 21 4 13 5 16 4 16 
21 15 2 0 12 3 7 23 20 17 16 23 15 2 16 7 21 5 5 17 15 23 23 2 21 6 6 5 16 1 7 16 16
'''
just_numbers = np.asarray(message.replace(' |', '').split(), dtype=int) # removes the pipes (|) and splits the numbers into a list and convert to an numpy array

f, ax = plt.subplots(nrows=1, ncols=1, figsize=(10,6))

N, bins, patches = ax.hist(just_numbers, bins=np.arange(0, 28), color='r', edgecolor='k', align='left', label='Frequency of Number')
ax.set_xticks(np.arange(0, 28))
ax.legend()
plt.savefig('frequency_histogram.png')
plt.show()

Again, we can use Python code to translate the numbers into letters. Please take a look at the previous blog post to see how we do that. All code is folded away in this document; you can read it if you like. Just click the little triangle next to ‘Code:’. But first, let’s start with making 16 be E and 21 be T.

key = {16: 'E', 
       21: 'T'}

as a first guess, we have the following:

Code
key = {16: 'E', 
       21: 'T'}

decoded = ''
for n in just_numbers:
    if n in key:
        decoded += key[n]
    else:
        decoded += ' '+str(n)+' '
        

pprint.pprint(decoded)
(' 7 T 5  5  17  15  23  12  4  14  15  12  15  2  15  15  3  4 E 12  1  14  7 '
 'EE 4  23  6 EE 25 E 23 T 6 T 23  24  0  2  12  24 E 23  12  14  7 EE 4 T 4  '
 '13  1 T 17  7  9  2 E 7 E 1  17 E 6  13  23  12  4  18 E 5  6  12  12  24 E '
 '13  4  12  9  23  15  7  17  11  11 E 13 T 4  13  5 T 7 EE 2 ET 11 E 23  2 T '
 '25 E 18  12  24 E 9  17  15  2  15  7 T 11  23 T 4  13  23  4 T 7 E 23  15  '
 '12  23  15 ET 6 T 9 T 0  12  3  7  1  7 EE 13  12  24  18  2  12  7  3  23  '
 '12  2  7 T 5  5  17  15  23  5  12  6  13  9  17  15  2  2 ET 7  15  23  23  '
 '12  1  7 EE 15  2  7  12  3  14  2  9  12  12  13  23  9 E 7  3  4  1  7  '
 '12  24  15  0  7 T 4  4  0  4  12  18  2 T 17  4  23  23  2 T 6  6  5  17  '
 '4  13  4  12  18 T 14 E 23  2 T 6  6  20 EE 11  1  12  7  15  2 EET 7  15  '
 '2  5 E 6  12  4  14  23  15  12  9 E 15  2 E 0  5  3  17  6  13  15  2 E 17  '
 '7  9 T 6  6  23  15  2 E 0  11 T 25 E 15  2 E 6 T 4  13  9  17  15  2  24 E '
 '15 T 6  18  6 T 9  23 T 4  13  14  7  15 E 13  0  2 T 4  13  23  5  3  15  '
 '15  2  7  12  3  14  2  15  2 E 4  17  14  2  15  9 E 15 T 20 E 12  3  7  '
 '23  15 T 4  13 T 4  13  18  6 T 17  24  9  2 T 15  15  2 E 0  25 E 1  12  7  '
 '23 T 20 E 4  18  2  12  7  3  23  12  2  7 T 5  5  17  15  23  5  12  6  13  '
 '9  17  15  2  2 ET 7  15  23  23  12  1  7 EE 15  2  7  12  3  14  2  9  12  '
 '12  13  23  9 E 7  3  4  1  7  12  24  15  0  7 T 4  4  0  4  12  18  2 T '
 '17  4  23  23  2 T 6  6  5  17  4  13  4  12  18 T 14 E 23  2 T 6  6  20 EE '
 '11  1  12  7  15  2 EET 7  15  2  5 E 6  12  4  14  23  15  12  9 E 23  12 T '
 '11 E 23  5 E 9 T 7 E 15  2 E 13 T 9  4  9  17  6  6  7  17  23 E 9  17  15  '
 '2  15  9  17  15  18  2  17  4  14 ET 7  23 T 4  13  18  3  4  4  17  4  14 '
 'E 0 E 23  9 E 6  6  15 T 20 E 15  2 E 6 T 4  13  5 E 4 ET 15  2  0  12  3  '
 '7  23  20  17 E 23  15  2 E 7 T 5  5  17  15  23  23  2 T 6  6  5 E 1  7 EE')

I see ‘T 20 E’, ‘T 7 E’, ‘T 14 E’, ‘T 25 E’ and ‘T 11 E’ at first glance.

Lets count how many times the string ‘T . E’ appears where ‘.’ can be any number between 0 and 25:

Code
for i in range(26):
    s = 'T '+str(i)+' E'
    print(f'{i}: {decoded.count(s)}')
0: 0
1: 0
2: 0
3: 0
4: 0
5: 0
6: 0
7: 3
8: 0
9: 0
10: 0
11: 2
12: 0
13: 0
14: 2
15: 0
16: 0
17: 0
18: 0
19: 0
20: 3
21: 0
22: 0
23: 0
24: 0
25: 2

The letter H could be 7, 11, 14, 20, or 25, and no one of those really stands out. I am starting to wonder if the T is 21 because it was the second most common letter in the text. Maybe we should try with the third most common number: 15.

Lets change the key to:

key = {16: 'E', 
       15: 'T'}

And run the code above again:

Code
key = {16: 'E', 
       15: 'T'}

decoded = ''
for n in just_numbers:
    if n in key:
        decoded += key[n]
    else:
        decoded += ' '+str(n)+' '
        

pprint.pprint(decoded)
print()
print('Now, the "T something E" counts:')
print()
for i in range(26):
    s = 'T '+str(i)+' E'
    print(f'{i}: {decoded.count(s)}')
(' 7  21  5  5  17 T 23  12  4  14 T 12 T 2 TT 3  4 E 12  1  14  7 EE 4  23  6 '
 'EE 25 E 23  21  6  21  23  24  0  2  12  24 E 23  12  14  7 EE 4  21  4  13  '
 '1  21  17  7  9  2 E 7 E 1  17 E 6  13  23  12  4  18 E 5  6  12  12  24 E '
 '13  4  12  9  23 T 7  17  11  11 E 13  21  4  13  5  21  7 EE 2 E 21  11 E '
 '23  2  21  25 E 18  12  24 E 9  17 T 2 T 7  21  11  23  21  4  13  23  4  '
 '21  7 E 23 T 12  23 TE 21  6  21  9  21  0  12  3  7  1  7 EE 13  12  24  '
 '18  2  12  7  3  23  12  2  7  21  5  5  17 T 23  5  12  6  13  9  17 T 2  2 '
 'E 21  7 T 23  23  12  1  7 EET 2  7  12  3  14  2  9  12  12  13  23  9 E 7  '
 '3  4  1  7  12  24 T 0  7  21  4  4  0  4  12  18  2  21  17  4  23  23  2  '
 '21  6  6  5  17  4  13  4  12  18  21  14 E 23  2  21  6  6  20 EE 11  1  '
 '12  7 T 2 EE 21  7 T 2  5 E 6  12  4  14  23 T 12  9 ET 2 E 0  5  3  17  6  '
 '13 T 2 E 17  7  9  21  6  6  23 T 2 E 0  11  21  25 ET 2 E 6  21  4  13  9  '
 '17 T 2  24 ET 21  6  18  6  21  9  23  21  4  13  14  7 TE 13  0  2  21  4  '
 '13  23  5  3 TT 2  7  12  3  14  2 T 2 E 4  17  14  2 T 9 ET 21  20 E 12  3  '
 '7  23 T 21  4  13  21  4  13  18  6  21  17  24  9  2  21 TT 2 E 0  25 E 1  '
 '12  7  23  21  20 E 4  18  2  12  7  3  23  12  2  7  21  5  5  17 T 23  5  '
 '12  6  13  9  17 T 2  2 E 21  7 T 23  23  12  1  7 EET 2  7  12  3  14  2  '
 '9  12  12  13  23  9 E 7  3  4  1  7  12  24 T 0  7  21  4  4  0  4  12  18  '
 '2  21  17  4  23  23  2  21  6  6  5  17  4  13  4  12  18  21  14 E 23  2  '
 '21  6  6  20 EE 11  1  12  7 T 2 EE 21  7 T 2  5 E 6  12  4  14  23 T 12  9 '
 'E 23  12  21  11 E 23  5 E 9  21  7 ET 2 E 13  21  9  4  9  17  6  6  7  17  '
 '23 E 9  17 T 2 T 9  17 T 18  2  17  4  14 E 21  7  23  21  4  13  18  3  4  '
 '4  17  4  14 E 0 E 23  9 E 6  6 T 21  20 ET 2 E 6  21  4  13  5 E 4 E 21 T '
 '2  0  12  3  7  23  20  17 E 23 T 2 E 7  21  5  5  17 T 23  23  2  21  6  6  '
 '5 E 1  7 EE')

Now, the "T something E" counts:

0: 0
1: 0
2: 11
3: 0
4: 0
5: 0
6: 0
7: 0
8: 0
9: 1
10: 0
11: 0
12: 0
13: 0
14: 0
15: 0
16: 0
17: 0
18: 0
19: 0
20: 0
21: 0
22: 0
23: 0
24: 0
25: 0

Woah! The number 2 comes up very strongly present. I’m more optimistic about the number 2 being ‘H’. Let’s put it in the key dictionary and decode it:

N.B. I will dispense with showing you the key; you can find it in the code blocks if you open them.

Code
key = {16: 'E', 
       15: 'T',
       2: 'H'}

decoded = ''
for n in just_numbers:
    if n in key:
        decoded += key[n]
    else:
        decoded += ' '+str(n)+' '
        

pprint.pprint(decoded)
(' 7  21  5  5  17 T 23  12  4  14 T 12 THTT 3  4 E 12  1  14  7 EE 4  23  6 '
 'EE 25 E 23  21  6  21  23  24  0 H 12  24 E 23  12  14  7 EE 4  21  4  13  '
 '1  21  17  7  9 HE 7 E 1  17 E 6  13  23  12  4  18 E 5  6  12  12  24 E 13  '
 '4  12  9  23 T 7  17  11  11 E 13  21  4  13  5  21  7 EEHE 21  11 E 23 H '
 '21  25 E 18  12  24 E 9  17 THT 7  21  11  23  21  4  13  23  4  21  7 E 23 '
 'T 12  23 TE 21  6  21  9  21  0  12  3  7  1  7 EE 13  12  24  18 H 12  7  '
 '3  23  12 H 7  21  5  5  17 T 23  5  12  6  13  9  17 THHE 21  7 T 23  23  '
 '12  1  7 EETH 7  12  3  14 H 9  12  12  13  23  9 E 7  3  4  1  7  12  24 T '
 '0  7  21  4  4  0  4  12  18 H 21  17  4  23  23 H 21  6  6  5  17  4  13  '
 '4  12  18  21  14 E 23 H 21  6  6  20 EE 11  1  12  7 THEE 21  7 TH 5 E 6  '
 '12  4  14  23 T 12  9 ETHE 0  5  3  17  6  13 THE 17  7  9  21  6  6  23 THE '
 '0  11  21  25 ETHE 6  21  4  13  9  17 TH 24 ET 21  6  18  6  21  9  23  21  '
 '4  13  14  7 TE 13  0 H 21  4  13  23  5  3 TTH 7  12  3  14 HTHE 4  17  14 '
 'HT 9 ET 21  20 E 12  3  7  23 T 21  4  13  21  4  13  18  6  21  17  24  9 H '
 '21 TTHE 0  25 E 1  12  7  23  21  20 E 4  18 H 12  7  3  23  12 H 7  21  5  '
 '5  17 T 23  5  12  6  13  9  17 THHE 21  7 T 23  23  12  1  7 EETH 7  12  3  '
 '14 H 9  12  12  13  23  9 E 7  3  4  1  7  12  24 T 0  7  21  4  4  0  4  '
 '12  18 H 21  17  4  23  23 H 21  6  6  5  17  4  13  4  12  18  21  14 E 23 '
 'H 21  6  6  20 EE 11  1  12  7 THEE 21  7 TH 5 E 6  12  4  14  23 T 12  9 E '
 '23  12  21  11 E 23  5 E 9  21  7 ETHE 13  21  9  4  9  17  6  6  7  17  23 '
 'E 9  17 THT 9  17 T 18 H 17  4  14 E 21  7  23  21  4  13  18  3  4  4  17  '
 '4  14 E 0 E 23  9 E 6  6 T 21  20 ETHE 6  21  4  13  5 E 4 E 21 TH 0  12  3  '
 '7  23  20  17 E 23 THE 7  21  5  5  17 T 23  23 H 21  6  6  5 E 1  7 EE')

I need to take a break from this. I think I am going down a blind alley again. I hope to have updates soon.

1.4 Update 25 Oct 2024

OK, a lot of time has passed, and I never got to blog about my work on this. Also, in truth, again, Chris Smolinski beat me to solving it, so I stalled in motivation. But to be complete, I decided to put up the solution here.

Code
key = {16: 'E', 
       15: 'T',
       2: 'H',
       23: 'S',
       7: 'R',
       21: 'A',
       12: 'O',
       5: 'B',
       17: 'I',
       3: 'U',
       4: 'N',
       1: 'F',
       14: 'G',
       24: 'M',
       6: 'L',
       18: 'C',
       9: 'W',
       25: 'V',
       0: 'Y',
       13: 'D',
       11: 'P',
       20: 'K',
       }

decoded = ''
for n in just_numbers:
    if n in key:
        decoded += key[n]
    else:
        decoded += ' '+str(n)+' '
        

pprint.pprint(decoded)
'RABBITSONGTOTHTTUNEOFGREENSLEEVESALASMYHOMESOGREENANDFAIRWHEREFIELDSONCEBLOOMEDNOWSTRIPPEDANDBAREEHEAPESHAVECOMEWITHTRAPSANDSNARESTOSTEALAWAYOURFREEDOMCHORUSOHRABBITSBOLDWITHHEARTSSOFREETHROUGHWOODSWERUNFROMTYRANNYNOCHAINSSHALLBINDNOCAGESHALLKEEPFORTHEEARTHBELONGSTOWETHEYBUILDTHEIRWALLSTHEYPAVETHELANDWITHMETALCLAWSANDGRTEDYHANDSBUTTHROUGHTHENIGHTWETAKEOURSTANDANDCLAIMWHATTHEYVEFORSAKENCHORUSOHRABBITSBOLDWITHHEARTSSOFREETHROUGHWOODSWERUNFROMTYRANNYNOCHAINSSHALLBINDNOCAGESHALLKEEPFORTHEEARTHBELONGSTOWESOAPESBEWARETHEDAWNWILLRISEWITHTWITCHINGEARSANDCUNNINGEYESWELLTAKETHELANDBENEATHYOURSKIESTHERABBITSSHALLBEFREE'

So to break this up we have the following solution:

RABBIT SONG TO THT TUNE OF GREENSLEEVES ALAS MY HOME SO GREEN AND FAIR WHERE FIELDS ONCE BLOOMED NOW STRIPPED AND BARE EHE APES HAVE COME WITH TRAPS AND SNARES TO STEAL AWAY OUR FREEDOM CHORUS OH RABBITS BOLD WITH HEARTS SO FREE THROUGH WOODS WE RUN FROM TYRANNY NO CHAINS SHALL BIND NO CAGE SHALL KEEP FOR THE EARTH BELONGS TO WE THEY BUILD THEIR WALLS THEY PAVE THE LAND WITH METAL CLAWS AND GRTEDY HANDS BUT THROUGH THE NIGHT WE AKE OUR STAND AND CLAIM WHAT THEYVE FORSAKEN CHORUS OH RABBITS BOLD WITH HEARTS SO FREE THROUGH WOODS WE RUN FROM TYRANNY NO CHAINS SHALL BIND NO CAGE SHALL KEEP FOR THE EARTH BELONGS TO WE SO APES BEWARE THE DAWN WILL RISE WITH TWITCHING EARS AND CUNNING EYES WELL TAKE THE LAND BENEATH YOUR SKIES THE RABBITS SHALL BE FREE

There seem to be a couple of errors, but in the beginning, it reads that this is ‘to tht(e) tune of Greensleeves’, which is the startup music for this pirate. With that in mind, I can turn the decoded message into song lyrics! This is amazing! Note that I have fixed errors and put in what I think the punctuation should be.

Rabbit Song (To the tune of Greensleeves)

Alas my home so green and fair,
Where fields once bloomed, now stripped and bare,
The Apes have come with traps and snares,
To steal away our freedom

(Chorus)

Oh Rabbits bold with hearts so free,
Through woods, we run from tyranny,
No chains shall bind, no cage shall keep,
For the earth belongs to we.

The build their walls they pave the land,
With metal claws and greedy hands,
But through the night we take our stand,
And claim what they’ve forsaken,

(Chorus)

Oh Rabbits bold with hearts so free,
Through woods, we run from tyranny,
No chains shall bind, no cage shall keep,
For the earth belongs to we.

So Apes beware the dawn will rise,
With twitching ears and cunning eyes,
We’ll take the land beneath your skies,
The Rabbits shall be free

This is actually a very nice piece of song/poetry. Nicely done Greensleeves Pirate!