Task: Bacon cipher




Go: package main

import(
    "fmt"
    "strings"
)

var codes = map[rune]string {
    '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",  
}

func baconEncode(plainText string, message string) string {
    pt := strings.ToLower(plainText)
    var sb []byte
    for _, c := range pt {
        if c >= 'a' && c <= 'z' {
            sb = append(sb, codes[c]...)
        } else {
            sb = append(sb, codes[' ']...)
        }
    }
    et := string(sb)
    mg := strings.ToLower(message)  
    sb = nil  
    var count = 0
    for _, c := range mg {
        if c >= 'a' && c <= 'z' {
            if et[count] == 'A' {
                sb = append(sb, byte(c))
            } else {
                sb = append(sb, byte(c - 32))  
            }
            count++
            if count == len(et) { break }
        } else {
            sb = append(sb, byte(c))
        }
    }
    return string(sb)
}

func baconDecode(message string) string {
    var sb []byte
    for _, c := range message {
        if c >= 'a' && c <= 'z' {
            sb = append(sb, 'A')
        } else if c >= 'A' && c <= 'Z' {
            sb = append(sb, 'B')
        }
    }
    et := string(sb)
    sb = nil  
    for i := 0; i < len(et); i += 5 {
        quintet := et[i : i + 5]
        for k, v := range codes {
            if v == quintet {
                sb = append(sb, byte(k))
                break
            }
        }
    }
    return string(sb)
} 

func main() {
    plainText := "the quick brown fox jumps over the lazy dog"
    message := "bacon's cipher is a method of steganography created by francis 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."
    cipherText := baconEncode(plainText, message)
    fmt.Printf("Cipher text ->\n\n%s\n", cipherText)
    decodedText := baconDecode(cipherText)
    fmt.Printf("\nHidden text ->\n\n%s\n", decodedText)
}





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