Task: Bacon cipher







Python: import string

sometext = .lower()

lc2bin = {ch: '{:05b}'.format(i) 
          for i, ch in enumerate(string.ascii_lowercase + ' .')}
bin2lc = {val: key for key, val in lc2bin.items()}

phrase = 'Rosetta code Bacon cipher example secret phrase to encode in the capitalisation of peter pan'.lower()

def to_5binary(msg):
    return ( ch == '1' for ch in ''.join(lc2bin.get(ch, '') for ch in msg.lower()))

def encrypt(message, text):
    bin5 = to_5binary(message)
    textlist = list(text.lower())
    out = []
    for capitalise in bin5:
        while textlist:
            ch = textlist.pop(0)
            if ch.isalpha():
                if capitalise:
                    ch = ch.upper()
                out.append(ch)
                break
            else:
                out.append(ch)
        else:
            raise Exception('ERROR: Ran out of characters in sometext')
    return ''.join(out) + '...'


def  decrypt(bacontext):
    binary = []
    bin5 = []
    out = []
    for ch in bacontext:
        if ch.isalpha():
            binary.append('1' if ch.isupper() else '0')
            if len(binary) == 5:
                bin5 = ''.join(binary)
                out.append(bin2lc[bin5])
                binary = []
    return ''.join(out)
                

print('PLAINTEXT = \n%s\n' % phrase)
encrypted = encrypt(phrase, sometext)
print('ENCRYPTED = \n%s\n' % encrypted)
decrypted = decrypt(encrypted)
print('DECRYPTED = \n%s\n' % decrypted)
assert phrase == decrypted, 'Round-tripping error'


VB: Imports System.Text

Module Module1

    ReadOnly CODES As New Dictionary(Of Char, String) From {
        {"a", "AAAAA"}, {"b", "AAAAB"}, {"c", "AAABA"}, {"d", "AAABB"}, {"e", "AABAA"},
        {"f", "AABAB"}, {"g", "AABBA"}, {"h", "AABBB"}, {"i", "ABAAA"}, {"j", "ABAAB"},
        {"k", "ABABA"}, {"l", "ABABB"}, {"m", "ABBAA"}, {"n", "ABBAB"}, {"o", "ABBBA"},
        {"p", "ABBBB"}, {"q", "BAAAA"}, {"r", "BAAAB"}, {"s", "BAABA"}, {"t", "BAABB"},
        {"u", "BABAA"}, {"v", "BABAB"}, {"w", "BABBA"}, {"x", "BABBB"}, {"y", "BBAAA"},
        {"z", "BBAAB"}, {" ", "BBBAA"} 
    }

    Function Encode(plainText As String, message As String) As String
        Dim pt = plainText.ToLower()
        Dim sb As New StringBuilder()
        For Each c In pt
            If "a" <= c AndAlso c <= "z" Then
                sb.Append(CODES(c))
            Else
                sb.Append(CODES(" "))
            End If
        Next

        Dim et = sb.ToString()
        Dim mg = message.ToLower() 

        sb.Length = 0
        Dim count = 0
        For Each c In mg
            If "a" <= c AndAlso c <= "z" Then
                If et(count) = "A" Then
                    sb.Append(c)
                Else
                    sb.Append(Chr(Asc(c) - 32)) 
                End If
                count += 1
                If count = et.Length Then
                    Exit For
                End If
            Else
                sb.Append(c)
            End If
        Next

        Return sb.ToString()
    End Function

    Function Decode(message As String) As String
        Dim sb As New StringBuilder

        For Each c In message
            If "a" <= c AndAlso c <= "z" Then
                sb.Append("A")
            ElseIf "A" <= c AndAlso c <= "Z" Then
                sb.Append("B")
            End If
        Next

        Dim et = sb.ToString()
        sb.Length = 0
        For index = 0 To et.Length - 1 Step 5
            Dim quintet = et.Substring(index, 5)
            Dim key = CODES.Where(Function(a) a.Value = quintet).First().Key
            sb.Append(key)
        Next

        Return sb.ToString()
    End Function

    Sub Main()
        Dim plainText = "the quick brown fox jumps over the lazy dog"
        Dim message =
            "bacon
            "this task is to implement a program for encryption and decryption of " +
            "plaintext using the simple alphabet of the baconian cipher or some " +
            "other kind of representation of this alphabet (make anything signify anything). " +
            "the baconian alphabet may optionally be extended to encode all lower " +
            "case characters individually and/or adding a few punctuation characters " +
            "such as the space."

        Dim cipherText = Encode(plainText, message)
        Console.WriteLine("Cipher text ->" & Environment.NewLine & "{0}", cipherText)

        Dim decodedText = Decode(cipherText)
        Console.WriteLine(Environment.NewLine & "Hidden text ->" & Environment.NewLine & "{0}", decodedText)
    End Sub

End Module