Szyfr Bacona: wprowadzenie do steganografii

14

Ta mała świnka poszła na rynek, ta mała świnka napisała jakiś kod ...

Ach, czekaj, nie mówimy o tym bekonie, mówimy o Sir Francisie Baconie! W szczególności szyfr Bacon opracowany pod koniec XVI wieku jako metoda ukrywania wiadomości w innej wiadomości, metoda steganografii .

Szyfr działa poprzez ukrywanie wiadomości w prezentacji tekstu, a nie jego treści. Po pierwsze, litery twojej wiadomości są kodowane na binarne (od 0 do 25) w następujący sposób:

Uwaga: Proszę użyć następującego kodowania w kodzie i nie martw się liczbami, spacjami lub innymi symbolami na wejściu, chociaż mogę opracować pewną premię dla tych, którzy zawierają te znaki w swoim kodowaniu. Jeśli uwzględnisz inne symbole, litery muszą nadal zajmować spacje 0–25 w kodowaniu.

Letter  Encoding
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

Po zakodowaniu wszystkich liter wiadomości w powyższych sekcjach As i Bs, musisz teraz wybrać dwa kroje pisma dla swojego kodu. W tym przykładzie użyję normalnego tekstu dla kroju pisma Ai pogrubionego tekstu dla kroju pisma B.

Więc wiadomość

HELLOWORLD

jest zakodowany do

AABBB AABAA ABABB ABABB ABBBA BABBA ABBBA BAAAB ABABB AAABB

A teraz ukrywamy ten plik binarny tekstem przewoźnika .

Szybki brązowy lis przeskakuje nad leniwymi psami, grając na polach, na których pilnują pasterze.

Jest w porządku, jeśli wiadomość operatora jest dłuższa niż faktycznie zakodowana wiadomość, chociaż nie może być krótsza. Teraz zamieniamy tekst operatora na pogrubiony w zależności od tego, gdzieB s są w zakodowanej wiadomości,

P e qu IC K bro w n fo x j u tt s ove r t h e l az y wykonać g s , gam b O L i ng wt jego obszarach, w których pasterze czuwa.

Który bez Markdown brzmi jak

Th**e** **qu**ic**k** bro**w**n **fo**x **j**u**mp**s **ove**r **t**h**e** **l**az**y** 
**do**g**s**, gam**b**o**l**i**ng** in t**he** fields where the shepherds keeps watch.

Zauważ, że nie użyłem interpunkcji w komunikacie przewoźnika do zakodowania wiadomości, ale to, czy interpunkcja jest zakodowana, czy nie, zależy od Ciebie /.

Zasady

  • Twoje dane wejściowe będą zawierać wiadomość, którą chcesz zakodować, i wiadomość operatora. Jeśli komunikat operatora jest za krótki, zwróć komunikat o błędzie.

  • Musisz wybrać dwa kroje do kodowania Ai B, jak wielkie litery, małe litery, kursywa , pogrubienie , Bold , przekreślenie , in code formati tak dalej. Musisz użyć formy Mark Exchange stosu do wymiany tych krojów pisma, tj

    UPPERCASE, lowercase, *italic*, **bold**, 
    ***bold italic***, <s>strikethrough</s>, `in code format`
    
  • Twój wynik musi być zakodowanym teraz komunikatem operatora, albo pokazanym za pomocą Markdown, albo pokazanym bez, jak pokazano w powyższym przykładzie.

  • Musisz tylko wykonać algorytm kodowania. Wszelkie algorytmy dekodowania, które chcesz podać, są mile widziane, ale w momencie pisania nie pomogą ani nie utrudniają twojego wyniku.

  • Twój kod musi być programem lub funkcją.

  • To jest kod golfowy, więc wygrywa najmniejsza liczba bajtów.

Jak zawsze, jeśli problem jest niejasny, daj mi znać. Powodzenia i dobrej gry w golfa!

Sherlock9
źródło
3
Więc naprawdę nie ma powodu, aby nie używać wielkich / małych liter, ponieważ wszystko inne kosztuje więcej bajtów
Mego
6
Myślę, że jest literówka w „nie mówimy o tym bekonie”, ponieważ z pewnością mówiłeś o Kevinie Baconie, więc „b” powinno być pisane wielką literą, prawda?
Martin Ender,

Odpowiedzi:

1

Pyth, 47 bajtów

Vsm.[05jxGd2r~zw0#I}Jr@z~Z+1Z0GBpJ)p?NrJ1J;>zZ

Wypróbuj tutaj .

Wyjaśnienie:

             ~zw                               - Get the first line of input and 
                                               - set z to the next line
            r   0                              - Turn it to lower case
  m                                            - Map each character
        xGd                                    - Get it's position in the alphabet
       j   2                                   - Turn it to base 2
   .[05                                        - Pad the start with 0's
 s                                             - Turn it to a 1d-array (flatten it)
V                                        ;     - For N in above array:
                 #                )            - While 1:
                      @z~Z+1Z                  - Get the current position in the 
                                               - second line and increment the position
                    Jr       0                 - Set J to it lowercased
                  I}          GB               - If it's a letter, break
                                pJ             - Otherwise, print it
                                    ?N         - Is the character code
                                               - (the current 1d-array) 1
                                      rJ1      - Get the current char uppered
                                         J     - Leave it lowered
                                   p           - Print the character
                                           >zZ - Print out the rest of the second input
niebieski
źródło
1

Python 3, 216 211 231 225 207 bajtów

To rozwiązanie wykorzystuje normalny tekst i kursywę w stylu Markdown dla swoich dwóch krojów pisma. I koduje wszystko w komunikacie przewoźnika oprócz spacji.

Edycja: Musiałem naprawić kod, aby wynik był drukowany poprawnie i dodał przykłady poniżej kodu.

Edycja: Edytowałem kod w celu uzyskania wcześniejszego gorszego rozwiązania wielkich / małych liter, z powodu problemów z prawidłowym drukowaniem kursywy.

def g(s,c):
 c=c.lower();w=[h.upper()for h in s if h.isalpha()];t=''.join("{:05b}".format(ord(i)-65)for i in w);r='';j=m=0
 while t[j:]:a=c[m];x=a!=" ";r+=[a,a.upper()][x*int(t[j])];j+=x;m+=1
 return r+c[m:]

Przykłady

>>> g('HELLOWORLD', 'The quick brown fox jumps over the lazy dogs, gamboling in the fields 
where the shepherds keep watch')
'thE QUicK broWn FOx JuMPs OVEr ThE LazY DOgS, gaMbOlINg in THe fields where the shepherds keep watch'

Nie golfowany:

def bacon(message, carrier):
    # Lowers the case of the carrier message
    carrier = carrier.lower()
    # Removing all non-alphabetic characters and making the rest uppercase
    words = ""
    for char in message:
        if char.isalpha():
            words += char.upper()
    # Encoding the message
    binary = ""
    for letter in words:
        encode = ord(letter) - 65
        binary += "{:05b}".format(encode)
    # Encoding the carrier message
    result = ""
    bin_index = 0
    char_index = 0
    while bin_index < len(binary):
        letter = carrier[char_index]
        # If letter isn't a space and it needs to be encoded
        if letter != " " and int(binary[bin_index]): 
            letter = letter.upper()
        result += type + letter + type
        # The encoding only proceeds if letter wasn't a space
        bin_index += letter != " "
        # char_index increments whether or not letter was alphabetical
        char_index += 1
    # Return the encoded text and any leftover characters from the carrier message
    return result + carrier[char_index : ]
Sherlock9
źródło
0

C, 124 bajty

Wymaga to, aby argumenty były w kodowaniu zgodnym z ASCII (np. ISO-8859.1 lub UTF-8). Modyfikuje on przewoźnika w miejscu i zwraca 0 w przypadku sukcesu lub w przeciwnym razie niezerowy. Kodowanie to A== wielkie litery i B== wielkie litery. Niewykorzystane litery operatora są ustawione na górną.

int f(char*p,char*s){int m=16;do{if(isalpha(*s)){*s|=32;*s-=(*p-1)&m?32:0;if(!(m/=2)){m=16;p+=!!*p;}}}while(*++s);return*p;}

Wyjaśnienie

W tym program testowy. Przekaż litery do zakodowania jako pierwszy argument, a łańcuch nośny jako drugi.

#include <stdio.h>
#include <ctype.h>

/* ASCII or compatible encoding assumed */
int f(char *p, char *s)         /* plaintext, carrier */
{
    int m=16;                   /* mask */
    do {
        if (isalpha(*s)) {
            *s |= 32;
            *s -= (*p-1)&m ? 32 : 0;
            if (!(m/=2)) {
                /* reset mask and advance unless we reached the end */
                m=16;
                p+=!!*p;
            }
        }
    } while (*++s);

    /* 0 (success) if we finished p, else non-zero */
    return *p;
}

int main(int argc, char **argv)
{
    int r = argc < 3 || f(argv[1], argv[2]);
    if (r)
        puts("~!^%&$+++NO CARRIER+++");
    else
        puts(argv[2]);
    return r;
}

Wyjście testowe:

$ ./66019 "HELLOWORLD" "The quick brown fox jumps over the lazy dogs, gamboling in the fields where the shepherds keep watch."  
thE QUicK broWn FOx JuMPs OVEr ThE LazY DOgS, gamBoLiNG in tHE FIELDS WHERE THE SHEPHERDS KEEP WATCH.
Toby Speight
źródło