The Voynich Ninja

Full Version: Voynichese is a numeric cipher?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
(19-07-2026, 03:42 PM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.I used the script to encode a simple phrase in English. Could you time how long approximately it will take you to decode it?

or an /// chol iin chor o /// qo qo ey iin an in oke y y /// ch o /// chor an in oke y y /// cph y oke y oke y /// ch cph y o ey iin an in oke y y /// che ey in /// chor ch o in y /// ch eor cph y cph y q or an in an in oke y iin /// cph y o ey iin or in /// chol iin chor o /// chol iin ey in y /// cph y cph y ey in ey in oke y oke y oke y in /// ch ch an in y /// an in oke y /// o ey iin oke y iin /// an in oke y /// y /// chol y eor ey iin y
It took about 5 minutes to convert numbers into letters. What about anagrams...
If WCUO PPKCFBNAA to UFBNAA QANANA TQ AOKCFBNAA book VTOBA TSQAQAOIFBFBDAC QAOKCIB VCKBA QAQAKBKBNANANAB TTFBA FBDA OKCNAC FBNA WASKCA

Well... I assume that you added nulls to the text because there are numbers in the words that are out of order. At the moment, I don't know how to solve these anagrams (what is QANANA?). If so, please specify how I should identify the nulls. If there are no nulls, then the algorithm has a problem.
(19-07-2026, 03:58 PM)JoeyB Wrote: You are not allowed to view links. Register or Login to view.fwiw, I think that encoder script from gemini has a bug where every E = oke y.
Oh, I didn't notice that... Thanks for the tip! @oshfdk, I'll decode it now! Cool
(19-07-2026, 04:04 PM)ololololo Wrote: You are not allowed to view links. Register or Login to view.Well... I assume that you added nulls to the text because there are numbers in the words that are out of order. At the moment, I don't know how to solve these anagrams (what is QANANA?). If so, please specify how I should identify the nulls. If there are no nulls, then the algorithm has a problem.

This was the exact output from the encoder and the input is an English sentence, I didn't change any processing, I didn't add any nulls. I'm also more interested in the second example, where the extra /// marks were removed.
(19-07-2026, 03:42 PM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.or an /// chol iin chor o /// qo qo ey iin an in oke y y /// ch o /// chor an in oke y y /// cph y oke y oke y /// ch cph y o ey iin an in oke y y /// che ey in /// chor ch o in y /// ch eor cph y cph y q or an in an in oke y iin /// cph y o ey iin or in /// chol iin chor o /// chol iin ey in y /// cph y cph y ey in ey in oke y oke y oke y in /// ch ch an in y /// an in oke y /// o ey iin oke y iin /// an in oke y /// y /// chol y eor ey iin y
I decided to add an in to get rid of the ubiquitous FB, as well as to add nearby numbers (chol iin). Apparently, I understood how the algorithm works:
If YUO OOKCFBEAA to VEHA REE TOKCFDEA book VTOBA TSRRPOIHHEC RONIB YUO YMA RRMMEEEB TTHA HE ONEC HDA A WSNA

If you Facebook(?) to have REE TOKCFDEA book about Christopher Robin, you may remember that he once had a swan.

How long did it take me? A very long time! Plus, there are errors in the algorithm. But I solved the last anagrams easily, so, excluding the algorithm problems and confusing letters, it took me about 4-5 minutes.

I'd rather encrypt it manually...

(19-07-2026, 04:31 PM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.This was the exact output from the encoder and the input is an English sentence, I didn't change any processing, I didn't add any nulls.
I've already understand  Big Grin
(19-07-2026, 04:31 PM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.I'm also more interested in the second example, where the extra /// marks were removed.
If you encrypt correctly and align the letters in descending order, rather than in the supernatural order as in the algorithm, there will be no problems. The word boundaries will still be "visible" because they will be where a large number follows a small number, for example. y qo, iin o, iin cph, etc.
Thanks @JoeyB for improving the code Angel ! It should now run without errors and the letters are aligned in order.

@oshfdk, you can try to encrypt your phrase again (I don't fully understand what exactly you've encrypted):

def letter_to_num(letter):

letter = letter.upper()
if letter in ['U', 'V']:
return 21
if 'A' <= letter <= 'Z':
return ord(letter) - ord('A') + 1
return None

def num_to_roman_tokens(num):

tokens = []
roman_rules = [
(22, 'XXII'), (21, 'XXI'), (20, 'XX'), (19, 'XIX'),
(18, 'XVIII'), (17, 'XVII'), (16, 'XVI'), (15, 'XV'),
(14, 'XIV'), (13, 'XIII'), (12, 'XII'), (11, 'XI'),
(10, 'X'), (9, 'IX'), (8, 'VIII'), (7, 'VII'),
(6, 'VI'), (5, 'V'), (4, 'IV'), (3, 'III'),
(2, 'II'), (1, 'I')
]
for val, sym in roman_rules:
while num >= val:
tokens.append(sym)
num -= val
return tokens

def encrypt_word(word):

numbers = [letter_to_num(l) for l in word if letter_to_num(l) is not None]
if not numbers:
return word

numbers.sort(reverse=True)

raw_tokens = []
for num in numbers:
raw_tokens.extend(num_to_roman_tokens(num))

separate_last_i = False
if len(raw_tokens) >= 2 and raw_tokens[-2] == 'III' and raw_tokens[-1] == 'I':
separate_last_i = True
raw_tokens.pop()

encrypted_tokens = []
is_standalone_xx = len(raw_tokens) == 1 and raw_tokens[0] == 'XX'

i = 0
while i < len(raw_tokens):
token = raw_tokens[i]

if token == 'XV' and i + 1 < len(raw_tokens) and raw_tokens[i+1] == 'XV':
encrypted_tokens.append("che")
i += 2
continue

if token == 'XVI':
if i + 1 < len(raw_tokens):
next_token = raw_tokens[i+1]

if next_token.startswith('XV') or next_token.startswith('X') or next_token.startswith('V'):

if next_token == 'XV':
encrypted_tokens.append("q")
i += 2
continue
else:
encrypted_tokens.append("qo")
i += 1
continue

encrypted_tokens.append("s")
i += 1
continue

if token == 'XXII': encrypted_tokens.append("chol")
elif token == 'XXI': encrypted_tokens.append("chor")
elif token == 'XIX': encrypted_tokens.append("eor")
elif token == 'XVIII': encrypted_tokens.append("oiin")
elif token == 'XVII': encrypted_tokens.append("cph")
elif token == 'XX': encrypted_tokens.append("sh" if is_standalone_xx else "ch")
elif token == 'XV': encrypted_tokens.append("o")
elif token == 'XIV': encrypted_tokens.append("oke")
elif token == 'XIII': encrypted_tokens.append("daiin")
elif token == 'XII': encrypted_tokens.append("dan")
elif token == 'XI': encrypted_tokens.append("ey")
elif token == 'IX': encrypted_tokens.append("or")
elif token == 'VIII': encrypted_tokens.append("aiin")
elif token == 'VII': encrypted_tokens.append("ain")
elif token == 'VI': encrypted_tokens.append("an")
elif token == 'IV': encrypted_tokens.append("ok")
elif token == 'X': encrypted_tokens.append("e")
elif token == 'V': encrypted_tokens.append("a")
elif token == 'III': encrypted_tokens.append("iin")
elif token == 'II': encrypted_tokens.append("in")
elif token == 'I':
current_word_str = "".join(encrypted_tokens)
if current_word_str and current_word_str[-1] in ['a', 'o']:
encrypted_tokens.append("n")
else:
encrypted_tokens.append("y")
i += 1

encrypted_str = " ".join(encrypted_tokens)

if separate_last_i:
current_word_str = "".join(encrypted_tokens)
last_i_char = "n" if current_word_str and current_word_str[-1] in ['a', 'o'] else "y"
encrypted_str += f" {last_i_char}"

return encrypted_str

def encrypt_text(text):
words = text.split()
encrypted_words = [encrypt_word(w) for w in words]
return " /// ".join(encrypted_words)

print(encrypt_text("OO"))
print(encrypt_text("PE"))
print(encrypt_text("PO"))

my_text = "YOUR TEXT"
print(encrypt_text(my_text))
I think you nearly had it, it was just the bug in the gemini garbling a couple of things.

Phrase 1 (with /// marks):
IF YOU HAPPEN TO HAVE READ ANOTHER BOOK ABOUT CHRISTOPHER ROBIN YOU MAY REMEMBER THAT HE ONCE HAD A SWAN

Phrase 2 (no marks):
ONE DAY WHEN HE WAS OUT WALKING HE CAME TO AN OPEN PLACE IN THE MIDDLE OF THE FOREST
(19-07-2026, 04:47 PM)JoeyB Wrote: You are not allowed to view links. Register or Login to view.I think you nearly had it, it was just the bug in the gemini garbling a couple of things.

Phrase 1 (with /// marks):
IF YOU HAPPEN TO HAVE READ ANOTHER BOOK ABOUT CHRISTOPHER ROBIN YOU MAY REMEMBER THAT HE ONCE HAD A SWAN

Phrase 2 (no marks):
ONE DAY WHEN HE WAS OUT WALKING HE CAME TO AN OPEN PLACE IN THE MIDDLE OF THE FOREST
Thanks a lot again! Well, in general, this means that these anagrams are not that difficult to solve.
4-5 minutes for a single phrase is too long, I think. Is the algorithm fixed now? If so, we can try another phrase.

oiin or an a eor or ch aiin a chor oiin qo a oke ok y chor ch o dan dan or a n oiin qo qo oke dan or or a iin ch ch aiin y chor eor eor o oke daiin a iin ch ch oiin daiin a n ch o eor oiin dan a a a n ch dan or aiin ain oke ok y ch aiin a n chol y dan or aiin a chor ch ch eor oiin oke oke daiin or ain y eor a in y chor ch eor eor oke a iin in y ch o oke or eor aiin y oke ok y ch eor oiin s or or

Could you take note of how much time each step took?
(19-07-2026, 05:57 PM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.Is the algorithm fixed now?
Yes. It arranges the letters correctly on its own.
(19-07-2026, 05:57 PM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.oiin or an a eor or ch aiin a chor oiin qo a oke ok y chor ch o dan dan or a n oiin qo qo oke dan or or a iin ch ch aiin y chor eor eor o oke daiin a iin ch ch oiin daiin a n ch o eor oiin dan a a a n ch dan or aiin ain oke ok y ch aiin a n chol y dan or aiin a chor ch ch eor oiin oke oke daiin or ain y eor a in y chor ch eor eor oke a iin in y ch o oke or eor aiin y oke ok y ch eor oiin s or or
Let me start by drawing boundaries between words Smile
oiin or an a / eor or / ch aiin a / chor oiin qo a / oke ok y / chor ch o dan dan or a n / oiin qo qo oke dan or or a iin / ch ch aiin y / chor eor eor o oke daiin a iin / ch ch oiin daiin a n / ch o eor oiin dan a a a n / ch dan or aiin ain / oke ok y / ch aiin a n / chol y / dan or aiin a / chor ch ch eor oiin oke oke daiin or ain y / eor a in y / chor ch eor eor oke a iin in y / ch o oke or / eor aiin y / oke ok y / ch eor oiin s or or

As you can see, by using y, n, and other letters, you can easily identify the boundaries between words.

And now we proceed to decoding!

RIFE SI THE VROE NDA VTOKKIEA ROOVKIIEC TTHA VSSONMEC TTRMEA TOSRKEEEA TKIHG NDA THEA WA KIHE VTTSRNNMIGA SEBA VTSSNECBA TONI SHA NDA TSROII

2-3 minutes (it could have been faster if I had remembered the numbers of the letters in the alphabet. I had to look it up).


Fire is the over and outlook covering that consumes matter. Streaks, thing and the away hide surrounding base backscene note has and stories.

It took me a little less than a minute and a half. I had already guessed some of the words as I deciphered the letters, so it was pretty easy.

Total
: 3-4 minutes! But actually, I could have done it faster because, again, I looked up the letter numbers.
(19-07-2026, 06:40 PM)ololololo Wrote: You are not allowed to view links. Register or Login to view.Fire is the over and outlook covering that consumes matter. Streaks, thing and the away hide surrounding base backscene note has and stories.

It took me a little less than a minute and a half. I had already guessed some of the words as I deciphered the letters, so it was pretty easy.

Total
: 3-4 minutes! But actually, I could have done it faster because, again, I looked up the letter numbers.

Ok, but how much time will it take to find the correct decoding? This one is mostly wrong.
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19