Bacons Chiffre: Eine Einführung in die Steganographie


14

Dieses kleine Schweinchen ging auf den Markt, dieses kleine Schweinchen schrieb einen Code ...

Ach warte, wir reden nicht über diesen Speck, wir reden über Sir Francis Bacon! Insbesondere die Chiffre Bacon in den späten 1500er Jahren als Methode zum Verstecken einer Nachricht in einer anderen Nachricht, eine Methode der Steganographie .

Die Chiffre verbirgt die Botschaft in der Präsentation des Textes und nicht in dessen Inhalt. Zunächst werden die Buchstaben Ihrer Nachricht wie folgt binär (von 0 bis 25) codiert:

Hinweis: Bitte verwenden Sie die folgende Codierung in Ihrem Code und sorgen Sie sich nicht um Zahlen, Leerzeichen oder andere Symbole in der Eingabe, obwohl ich möglicherweise einen Bonus für diejenigen ausdenken kann, die diese Zeichen in ihre Codierung einbeziehen. Wenn Sie andere Symbole einfügen, müssen die Buchstaben in der Kodierung noch die Leerzeichen 0-25 belegen.

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

Nachdem Sie alle Buchstaben in Ihrer Nachricht in die obigen Buchstaben As und Bs codiert haben , müssen Sie nun zwei Schriftarten für Ihren Code auswählen . In diesem Beispiel verwende ich normalen Text als Schriftart Aund fetten Text als Schriftart B.

Also die Nachricht

HELLOWORLD

ist zu codiert

AABBB AABAA ABABB ABABB ABBBA BABBA ABBBA BAAAB ABABB AAABB

Und jetzt verbergen wir diese Binärdatei mit einem Trägertext .

Der schnelle braune Fuchs springt über die faulen Hunde und torkelt auf den Feldern, auf denen die Hirten Wache halten.

Es ist in Ordnung, wenn die Trägernachricht länger als die tatsächlich codierte Nachricht ist, sie kann jedoch nicht kürzer sein. Nun machen wir den Trägertext fett, je nachdem, wo sich das Bs in der verschlüsselten Nachricht befindet.

Th e qu ic k bro w n fo x j u mp s Ove r t h e l az y tun g en , gam b o l i ng in t er Bereiche , in denen die Fische Uhr hält.

Was ohne Markdown so liest

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.

Beachten Sie, dass ich die Interpunktion in der Trägernachricht nicht zum Codieren der Nachricht verwendet habe, aber es liegt an Ihnen, ob die Interpunktion codiert ist oder nicht.

Regeln

  • Ihre Eingabe ist die zu verschlüsselnde Nachricht und eine Trägernachricht. Wenn die Trägernachricht zu kurz ist, geben Sie eine Art Fehlermeldung zurück.

  • Sie müssen zwei Schriften wählen für die Codierung Aund B, wie Groß, Kleinbuchstaben, kursiv , fett , fett und kursiv , durchgestrichen , in code formatund so weiter. Sie müssen die Form von Markdown von Stack Exchange verwenden, um diese Schriftarten zu codieren, d. H

    UPPERCASE, lowercase, *italic*, **bold**, 
    ***bold italic***, <s>strikethrough</s>, `in code format`
    
  • Ihre Ausgabe muss Ihre jetzt codierte Trägernachricht sein, die entweder mit oder ohne Markdown angezeigt wird (siehe obiges Beispiel).

  • Sie müssen lediglich einen Kodierungsalgorithmus erstellen. Alle Decodierungsalgorithmen, die Sie zur Verfügung stellen möchten, sind willkommen, aber zum Zeitpunkt des Schreibens wird dies Ihre Punktzahl weder verbessern noch behindern.

  • Ihr Code muss ein Programm oder eine Funktion sein.

  • Das ist Codegolf, also gewinnt die kleinste Anzahl von Bytes.

Wie immer, wenn das Problem unklar ist, lassen Sie es mich bitte wissen. Viel Glück und gutes Golfen!


3
Es gibt also wirklich keinen Grund, Groß- / Kleinschreibung nicht zu verwenden, da alles andere mehr Bytes kostet
Mego

6
Ich denke, es gibt einen Tippfehler in "Wir reden nicht über diesen Speck", weil Sie sicherlich über Kevin Bacon gesprochen haben, also sollte das "b" groß geschrieben werden, oder?
Martin Ender

Antworten:


1

Pyth, 47 Bytes

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

Probieren Sie es hier aus .

Erläuterung:

             ~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

1

Python 3, 216 211 231 225 207 Bytes

Hierbei handelt es sich um eine Lösung, die für ihre beiden Schriften normalen Text und Kursivschrift im Markdown-Stil verwendet. Und es kodiert alles in der Trägernachricht mit Ausnahme der Leerzeichen.

Bearbeiten: Musste den Code korrigieren, damit das Ergebnis korrekt gedruckt wird, und Beispiele unter dem Code hinzufügen.

Bearbeiten: Der Code wurde aufgrund von Problemen beim korrekten Drucken der Kursivschrift in eine zuvor schlechtere Lösung für Groß- / Kleinschreibung geändert.

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:]

Beispiele

>>> 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'

Ungolfed:

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 : ]

0

C 124 Bytes

Dies setzt voraus, dass die Argumente in einer ASCII-kompatiblen Codierung vorliegen (z. B. ISO-8859.1 oder UTF-8). Es ändert den Träger an Ort und Stelle und gibt bei Erfolg 0 oder ansonsten ungleich Null zurück. Die Kodierung ist A== Kleinbuchstaben und B== Großbuchstaben. Nicht verwendete Trägerbuchstaben werden nach oben gesetzt.

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;}

Erläuterung

Einschließlich eines Testprogramms. Übergeben Sie die zu codierenden Buchstaben als erstes Argument und die Trägerzeichenfolge als zweites.

#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;
}

Testausgang:

$ ./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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.