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, 05:53 AM)JoJo_Jost Wrote: You are not allowed to view links. Register or Login to view.Your question contains an as-yet-unproven assumption, namely that the cipher must be quick to read.

This whole thread contains an unproven assumption that Voynichese is a cipher. No-one has proven this so far, still we can have good discussions about plausibilities and hypotheticals. I never said in my post that Voynichese "must be" quick to read, I just said this would be practical.

(19-07-2026, 05:53 AM)JoJo_Jost Wrote: You are not allowed to view links. Register or Login to view.Since, if it is a cipher, it is almost certainly a complex one (otherwise it would have been cracked already), it would always take some time to decipher it.

Not true in general for ciphers, for example, a simple grille cipher would be hard to decode, but reading it is a breeze - you just put the stencil over the text and read it. Hard to break doesn't imply hard to decode once the cipher it known.

(19-07-2026, 05:53 AM)JoJo_Jost Wrote: You are not allowed to view links. Register or Login to view.There’s no reason to assume that it has to be quick to read, especially if it involved knowledge that was dangerous at the time. In this case, the main concern was preventing it from being decrypted in order to protect one’s life. The time it took to decrypt it likely played a lesser role.

Making it easy to read makes a lot of sense for a book. It's not a single use message, books are used over and over. Books often contain cross-references. Making an enciphered book hard to decode actually makes it more dangerous, because it forces the readers/users to make notes and leave a paper trail of partial decoding attempts that an adversary can use to break the cipher. A cipher that can be read off the page (but very hard to break) is much more practical for a book.

Generally, once we start talking about Voynichese as a cipher, we are already in the realm of conjectures and assumptions. And until we have some deciphering, the arguments from practicality are as good as any other.
(19-07-2026, 12:29 AM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.Can you actually read this cipher off the page?
I suppose so, since I created this cipher Smile 
(19-07-2026, 12:29 AM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.I mean, can a person who spent some time using this cipher look at "chor shoiin okey daiin daiin chan ches / chor sheor qokeol dy" and after thinking for a few seconds at most get the Latin original?
I don't think the decoding is difficult in itself. First, you just need to decode all the combinations you have, getting numbers. Then, you convert all the numbers into letters using the alphabet. To begin with, you can solve anagrams that do not contain nulls or addition to get clues for the next words.
In the case of qokey or dy, you check: in the case of qokey, you translate it into o oke and see if it fits. If it doesn't, then the k in qokey will be a null. In the case of dy, you translate it into VI and see if it fits. If it doesn't, then it's a null.
Solving such distorted anagrams shouldn't be that difficult, I suppose. You'll just end up with extra letters that are easy to distinguish from the real ones.
(19-07-2026, 12:29 AM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.I have no idea how your cipher works exactly, but the description looks insanely complicated.
Substitution, anagrams, and number substitution. To encrypt and decrypt text, you need at least a complete second alphabet with all the options for numbers.
(19-07-2026, 12:29 AM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.It looks like it might take more than a minute to read just a single phrase.
Perhaps... But not ten minutes or an hour. The only difficulty will be in reading the anagrams.

Regarding my texts... This is an encrypted excerpt of Lorem ipsum, which I don't think is suitable for demonstration of decryption.
(19-07-2026, 05:53 AM)JoJo_Jost Wrote: You are not allowed to view links. Register or Login to view.Since, if it is a cipher, it is almost certainly a complex one (otherwise it would have been cracked already), it would always take some time to decipher it.
I suppose so. I'll note that my cipher is, again, a visual model. It doesn't try to copy the VMS text as much as possible, it just shows how "similar" the result we can get using Roman numerals is compared to. Basically, it's a very simplified cipher.
The notorious features of Voynichese are also present in this cipher - repetitions, similar words, and something like the LAAFU effect (for example, numbers with sh and o will be at the beginning of the "line" (actually anagrams)) 
The purpose of this cipher is not to match the manuscript as closely as possible, but to look for differences and similarities. This will at least allow us to talk more clearly about the possible structure of the VMS cipher.
But, unfortunately, there are very few texts available at the moment, so we will focus on visual similarities... 
But it copies Currier A quite well, which seemed like a pretty unattainable task to me (because most of the ciphers before that were based on Currier B, like the Naibbe cipher, for example).
Could you feed your cipher description to a coding agent and make it create an encoder, that would convert plaintext to ciphertext? If you check that it works correctly, I can encode some text using this encoder and you can check how quickly you can read it. I would say that if reading a single sentence takes more than a couple minutes even after some practice, then this cipher looks impractical for a book. Not that anything would prevent the creator of the manuscript from using an impractical cipher, but I tend to think that for a book of this size some more or less efficient solution would be used. Not many people like wasting their time.
(19-07-2026, 11:51 AM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.Could you feed your cipher description to a coding agent and make it create an encoder, that would convert plaintext to ciphertext?
Well, I can do that, but it won't be a full-fledged cipher. I don't know if it's possible to teach him all the arbitrary aspects of encryption, such as nulls, etc. Otherwise it will just be a substitution.
But I'll try Smile
(19-07-2026, 11:51 AM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.Not many people like wasting their time.
The author's responsibility was to encrypt the book and provide the decipherer with the encryption alphabet. It is possible that he did not even consider whether certain parts of the text could be deciphered. By the way, You are not allowed to view links. Register or Login to view. may have made a mistake in the encryption process.
(19-07-2026, 11:51 AM)oshfdk Wrote: You are not allowed to view links. Register or Login to view.Could you feed your cipher description to a coding agent and make it create an encoder, that would convert plaintext to ciphertext? If you check that it works correctly, I can encode some text using this encoder and you can check how quickly you can read it. I would say that if reading a single sentence takes more than a couple minutes even after some practice, then this cipher looks impractical for a book. Not that anything would prevent the creator of the manuscript from using an impractical cipher, but I tend to think that for a book of this size some more or less efficient solution would be used. Not many people like wasting their time.
I'm very bad at programming, so I asked Gemini to make this code for me (I hope I didn't break the forum rules too much Confused ). But it doesn't add nulls, replace numbers, add them, "glue" them, etc. And there is no eiin-daiin replacement. In general, you will have to work a little on the encrypted text, specifically by placing the letters in the right places or combining words, such as cph eol into cpheol. I apologize for that.
I tested it in Online Python, and it seems to produce the same results as I did.
I can't send the code file, so I'll write it here and you can just copy it:

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'),
        (17, 'XVII'), (16, 'XVI'), (15, 'XV'), (11, 'XI'),
        (9, 'IX'), (6, 'VI'), (4, 'IV'), (10, 'X'),
        (5, 'V'), (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 == 'XX':  encrypted_tokens.append("sh" if is_standalone_xx else "ch")
        elif token == 'XVII': encrypted_tokens.append("cph")
        elif token == 'XV':  encrypted_tokens.append("o")
        elif token == 'XI':  encrypted_tokens.append("ey")
        elif token == 'IX':  encrypted_tokens.append("or")
        elif token == 'VI':  encrypted_tokens.append("an")
        elif token == 'IV':  encrypted_tokens.append("oke")
        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))
The roman_rules list doesn't have entries for 7, 8, 13, 14, or 18 - is that on purpose? Would you need those added ith they glyphs in descending order?
(19-07-2026, 03:02 PM)JoeyB Wrote: You are not allowed to view links. Register or Login to view.The roman_rules list doesn't have entries for 7, 8, 13, 14, or 18 - is that on purpose? Would you need those added ith they glyphs in descending order?
Yes, this is intentional. 
7 - VII - ain, 8 - VIII - aiin; 13 - XIII - eiin = daiin (d and a are V. VV is equivalent to X); 14 - XIV - oke/ote (actually eot-eok, but I changed it); 18 - XVIII - oiin.
If I add a glyph for each number, I'll end up with a regular substitution.
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

Also, I see /// marks here split the words. I don't think there is something similar in the Voynich MS. Is it possible to decode the cipher without these extra marks? I've encoded another phrase and removed /// marks, how quickly can you decode it?

o ey iin oke y chol iin oke y chol y ey iin an in oke y an in oke y chol y eor y chor ch o chol y ey iin ey y ey or an y y an in oke y ey in oke y iin y ch o ey iin y q ey iin oke y qo ey y oke y iin y ey iin or ch an in oke y ey in ey y or oke y oke oke o an ch an in oke y ch eor cph y o an oke y
fwiw, I think that encoder script from gemini has a bug where every E = oke y.

[attachment=16669]
Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19