ベーコンの暗号:ステガノグラフィの紹介


14

この小さな貯金箱は市場に出ました、この小さな貯金箱はいくつかのコードを書きました...

ああ、そのベーコンのことではなく、サーフランシスベーコンのことです!具体的には、暗号ベーコン、1500年代後半に、メッセージを別のメッセージ内に隠す方法、ステガノグラフィーの方法として考案しました。

暗号は、その内容ではなく、テキストの表示でメッセージを隠すことで機能します。まず、メッセージの文字は次のようにバイナリ(0〜25)にエンコードされます。

注:コード内で次のエンコードを使用してください。入力内の数字、スペース、またはその他の記号については心配しないでください。ただし、エンコードにこれらの文字を含める人にはいくつかのボーナスを考案できます。他の記号を含める場合、文字はエンコードのスペース0〜25を占める必要があります。

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

メッセージ内のすべての文字を上記AのsおよびBsにエンコードしたら、コード用に2つの書体を選択する必要があります。この例では、書体には通常のテキストを、書体Aには太字のテキストを使用しますB

だからメッセージ

HELLOWORLD

にエンコードされます

AABBB AABAA ABABB ABABB ABBBA BABBA ABBBA BAAAB ABABB AAABB

そして今、私たちはこのバイナリをキャリアテキストで隠しています

素早い茶色のキツネは怠け者の犬を飛び越え、羊飼いが見守る野原でうろついています。

キャリアメッセージが実際のエンコードされたメッセージより長い場合は問題ありませんが、短くすることはできません。次にB、エンコードされたメッセージのsの位置に応じて、キャリアテキストを太字にします。

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 Tに彼はシェパード時計を維持する場合フィールド。

マークダウンなしでは

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.

キャリアメッセージの句読点を使用してメッセージをエンコードしていませんが、句読点をエンコードするかどうかはユーザー次第です。

ルール

  • 入力は、エンコードされるメッセージとキャリアメッセージになります。キャリアメッセージが短すぎる場合は、何らかのエラーメッセージを返します。

  • エンコードAおよびの2つの書体を選択する必要があります(B大文字、小文字、斜体太字太字斜体取り消し線など)in code formatおよびように。これらの書体をエンコードするには、Stack ExchangeのMarkdown形式を使用する必要があります。

    UPPERCASE, lowercase, *italic*, **bold**, 
    ***bold italic***, <s>strikethrough</s>, `in code format`
    
  • 出力は、エンコードされたキャリアメッセージである必要があります。上記の例のように、Markdownで表示するか、マークダウンなしで表示します。

  • エンコードアルゴリズムを作成するだけです。提供したいデコードアルゴリズムは歓迎しますが、、執筆時点ではスコアのや妨げにはなりません。

  • コードはプログラムまたは関数でなければなりません。

  • これはコードゴルフであるため、最小バイト数が優先されます。

いつものように、問題が不明な場合はお知らせください。幸運と良いゴルフ!


3
他のすべての費用は、より多くのバイトので、だから、本当にアッパー/小文字を使用しない理由は、ありません
MEGO

6
確かにあなたはケビンベーコンについて話していたので、「私たちはそのベーコンについて話していません」にタイプミスがあると思います。
マーティンエンダー

回答:


1

Pyth、47バイト

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

ここで試してみてください

説明:

             ~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バイト

これは、2つの書体に通常のテキストとマークダウンスタイルの斜体を使用するソリューションです。また、キャリアメッセージ内のスペースを除くすべてをエンコードします。

編集:結果が正しく印刷されるようにコードを修正し、コードの下に例を追加する必要がありました。

編集:斜体を正しく印刷する際の問題により、以前は大文字/小文字の問題が悪化するようにコードを編集しました。

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

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

ゴルフをしていない:

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バイト

これには、引数がASCII互換エンコーディング(ISO-8859.1またはUTF-8など)である必要があります。キャリアをその場で変更し、成功すると0を返し、そうでなければ0以外を返します。エンコーディングはA== lower-caseおよびB== upper-caseです。未使用のキャリア文字は上部に設定されます。

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

説明

テストプログラムを含む。エンコードする文字を最初の引数として渡し、キャリア文字列を2番目の引数として渡します。

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

テスト出力:

$ ./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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.