Consider a modification of the Bubble Babble digest algorithm to emit words of 25 letters at a time (13 consonants, 12 vowels) instead of 5 at a time. Then, arrange the letters into 5 by 5 blocks:
This way, the 5-letter subwords can be read and verified both across and down as a doublecheck.
Inspired by the sator square in Latin, but omitting the capability of reading the same across and down (or being real words). We keep the checkerboard pattern of consonants and vowels.
With 16 consonants and 5 vowels to choose from, (omitting x and y from original Bubble Babble), one can fit up to log2(1613 * 512) = 79 bits per block.
While the original Bubble Babble tried to do error detection, let's separate concerns and assuming error detection or correction is done at a different level. Similarly, let padding be done elsewhere, too. We assume the message is a multiple of 79 bits.
Let n be a 79 bit integer. Let c = n mod (16^13), i.e lower 52 bits, and v = n div (16^13), i.e., upper 27 bits. Write c in base 16 using the alphabet ( b c d f g j k l m n p r s t v z ), and write v in base 5 using the alphabet ( a e i o u ), then interleave into a square. j is better than original h. c is always pronounced ch.
One may consider consonant clusters, consonants from other languages (clicks, aspiration), diphthong vowels, vowel tones, but things get messy, especially with consonant clusters. Some consonants can only be in certain places of a word. Here is one attempt, implemented in Haskell. This is well on our way to a random word generator, though it often creates nearly unpronounceable words, probably due to the excessive consonant clusters.
Vowels: a e i o u ai ei oi au á à é è í ì ó ò ú ù ái ài éi èi ói òi áu àu
Consonants: K! T! P! R Y H W ñ Kn Gn Br Dr Fr Gr Kr Pr Tr Vr Bl Fl Kl Pl Sl Vl Ð nD nG nK nT nZ mP rJ rS rZ rČ rŠ rθ nS mB nL rB rD rF rG rK rM rN rP rT rЦ rV rχ J S Z Č Š θ B D F G K L M N P T Ц V χ sT sK sP Ξ Ψ
Number of choices by grid position:
This allows 128 bits (129.21072040507875) to be encoded in a single block. Sample: