Skip to content

Allomorphs

Lymm edited this page Jan 16, 2026 · 1 revision

Allomorphs are the name for when text fails to be isomorphic. In the context of isomorphs, allomorphs mark the boundaries where the shared plaintext definitely must end, assuming perfect isomorphism, with the actual end point potentially being somewhere between the end of the isomorph and the start of the allomorph. Specifically, two sequences of ciphertext are considered allomorphic if they are not isomorphic, meaning there is no substitution which can transform between them, or equivalently, they have different gap patterns. Since this could apply to the entire text because the text is not all the same, it's really only useful to talk about allomorphs in the context of isomorphs or shared sections.

As a simple example, consider the shared sections in the first two messages. The gap pattern is shown to highlight the difference.

A..BC.D....AB.......DC...
b%P^-k=8]Jfb^@.q(/n"=-Q!p
b%P^-k=8]Jfb^@.q(/n"=-Q!=
A..BC.D....AB.......DC..D

All of this ciphertext is identical until the end of the shared section, so it seems pretty obvious that it should be the same plaintext. At the first letter where the text differs, it's tempting (and reasonable) to say that the plaintext must be different, we can't immediately say that it is, unless we know more about the mechanism. However, the = in the second message is a repeat of an = in the shared section in both messages, but the repeat does not happen in the first message, so the text is not isomorphic at this point. So this is an allomorph, and assuming the mechanism is perfectly isomorphic (e.g. a deck cipher), the underlying plaintext must be different here. Technically, the difference could occur anywhere between the last visible repeat (-) and this point, but it seems very likely that the plaintext just differs where it obviously should here. Being able to say for certain that the plaintext differs by this point is especially important in the context of a deck cipher, though, because it's possible in deck ciphers to have the same underlying plaintext and have the letter be different as if it looks like the end of a shared section, but it will always still be isomorphic if the shared plaintext really continues.

This example is pretty obvious, but just shows the concept. Here is another less obvious example in messages 7, 8, and 9:

A...A.....B.....BC.D....C.BD
VokPVW3^`.OSfk%+OMZdeo9FMiOd
;G1jqG.n 9aKb`Fq78RY>gk:dVYXRg
V%QPVWT^he*Y6ZPcU'B@>?3:(BN'>
.A..*A.........*..BC.D....C.BD
A..*A.........*..BC.D....C.BD

The extra repeat in messages 8 and 9 that isn't present in 7 is marked with * to make it clear that the pattern for the later part is the same. Since the distance between the A...A section and the stronger BC.D....C.BD isomorph is different for these two messages, there must be some difference in the plaintext between them, even if it's just a deletion of a character or something. Messages 8 and 9 are isomorphic here, and it's plausible they could be the same plaintext completely in this segment, but message 7 has a repeat of O that has no corresponding repeat in the other messages, so it is allomorphic in the section before this strong isomorph. This means that message 7 must have different plaintext somewhere in the range of the allomorph, and it's bounded by the extra repeats.

The A...A isomorph is very weak, but the positional alignment gives it more weight. Assuming that short section is still a real isomorph, we can mark the sections here that we know are the same plaintext in messages 7 and 9 with + and the section where there could be a difference somewhere with ?. There could just be an entire different word/phrase in this section, all we know for sure is that it must be different somehow because it's allomorphic to message 9.

+++++???????????++++++++++++
VokPVW3^`.OSfk%+OMZdeo9FMiOd

If we make the assumption of "corruption theory" and say that the only difference is a single character deletion, which would also be consistent, we can narrow down the range where the deletion would have to happen by a bit, using the places where the gap patterns differ. On the left side, we can exclude the positions before the O because if the plaintext was the same in messages 7 and 9 after that point, there would not be a non-isomorphic repeat present. Similarly, on the right side, we can exclude the positions after the P repeat in message 9, because if the plaintext was the same before that point, we would see a repeat there in message 7. This only excludes one position on the right, though. The excluded positions are marked here with x, and the single-character deletion could happen anywhere in the ? range. This kind of analysis also applies to other kinds of localized corruption which could explain the different plaintext in this section, like typos.

+++++xxxxx?????x++++++++++++
VokPVW3^`.OSfk%+OMZdeo9FMiOd
V%QPVWT^he*Y6ZPcU'B@>?3:(BN'>

We can also use allomorphs to estimate the edges of the shared plaintext of isomorphs, giving tentative limits for how far they can possibly be extended before they stop being isomorphic and would not be valid for alphabet chaining or other analysis that assumes they are repeated plaintext.

Allomorphs were also useful for obtaining a tentative upper bound on the average number of swaps that would need to be applied per plaintext letter to see the amount of decoherence visible in the funny-looking obstacle and the stutter section, putting the current estimated upper bound at around 4 swaps.

Clone this wiki locally