Cipher Bacon: Pengantar Steganografi


14

Babi kecil ini pergi ke pasar, babi kecil ini menulis beberapa kode ...

Ah menunggu, kita tidak berbicara tentang itu bacon, kita sedang berbicara tentang Sir Francis Bacon! Secara khusus, Bacon sandi dirancang pada akhir 1500-an , sebagai metode menyembunyikan pesan dalam pesan lain, metode steganografi .

Cipher bekerja dengan menyembunyikan pesan dalam presentasi teks, bukan kontennya. Pertama, huruf-huruf pesan Anda dikodekan ke dalam biner (dari 0 hingga 25) sebagai berikut:

Catatan: Silakan gunakan pengkodean berikut dalam kode Anda dan jangan khawatir tentang angka, spasi, atau simbol lain dalam input, meskipun saya dapat menyusun beberapa bonus bagi mereka yang memasukkan karakter ini dalam pengkodean mereka. Jika Anda menyertakan simbol lain, huruf masih harus menempati spasi 0-25 dalam penyandian.

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

Setelah menyandikan semua huruf dalam pesan Anda menjadi As dan Bs di atas, Anda sekarang harus memilih dua jenis huruf untuk kode Anda. Untuk contoh ini, saya akan menggunakan teks normal untuk jenis huruf Adan teks tebal untuk jenis huruf B.

Jadi pesannya

HELLOWORLD

dikodekan ke

AABBB AABAA ABABB ABABB ABBBA BABBA ABBBA BAAAB ABABB AAABB

Dan sekarang kita menyembunyikan biner ini dengan teks pembawa .

Rubah cokelat cepat melompati anjing-anjing malas, berjudi di ladang tempat para gembala berjaga-jaga.

Tidak apa-apa jika pesan operator lebih panjang dari pesan yang disandikan yang sebenarnya, meskipun tidak bisa lebih pendek. Sekarang kita mengubah teks pembawa menjadi tebal sesuai dengan di mana Bs dalam pesan yang disandikan,

Th e qu ic k bro w n fo x j u mp s ove r t h e l az y lakukan g s , gam b o l i ng di t dia ladang di mana para gembala terus menonton.

Yang tanpa Markdown dibaca sebagai

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.

Perhatikan bahwa saya tidak menggunakan tanda baca dalam pesan operator untuk menyandikan pesan, tetapi apakah tanda baca itu disandikan atau tidak, terserah Anda /.

Aturan

  • Input Anda akan menjadi pesan Anda untuk dikodekan dan pesan operator. Jika pesan operator terlalu pendek, kembalikan semacam pesan kesalahan.

  • Anda harus memilih dua jenis huruf untuk penyandian Adan B, seperti UPPERCASE, huruf kecil, miring , tebal , miring tebal , dicoret , in code formatdan sebagainya. Anda harus menggunakan bentuk penurunan harga dari Stack Exchange untuk mengkodekan jenis huruf ini, yaitu

    UPPERCASE, lowercase, *italic*, **bold**, 
    ***bold italic***, <s>strikethrough</s>, `in code format`
    
  • Output Anda harus berupa pesan operator yang sekarang disandikan, baik yang ditampilkan dengan penurunan harga atau ditampilkan tanpa, seperti terlihat pada contoh di atas.

  • Anda hanya perlu membuat algoritma penyandian. Algoritma pengodean ulang apa pun yang ingin Anda berikan dipersilakan, tetapi pada saat penulisan ini tidak akan membantu atau menghalangi skor Anda.

  • Kode Anda harus berupa program atau fungsi.

  • Ini adalah kode golf, sehingga jumlah byte terkecil menang.

Seperti biasa, jika masalahnya tidak jelas, beri tahu saya. Semoga berhasil dan bermain golf dengan baik!


3
Jadi benar-benar tidak ada alasan untuk tidak menggunakan huruf besar / kecil, karena semua yang lain membutuhkan biaya lebih banyak byte
Mego

6
Saya pikir ada kesalahan ketik dalam "kita tidak berbicara tentang itu daging", karena pasti anda berbicara tentang Kevin Bacon, sehingga "b" harus dikapitalisasi, kan?
Martin Ender

Jawaban:


1

Pyth, 47 byte

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

Coba di sini .

Penjelasan:

             ~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 byte

Ini adalah solusi yang menggunakan teks normal dan miring bergaya Markdown untuk dua tipenya. Dan itu mengkodekan semua yang ada di pesan operator kecuali spasi.

Sunting: Harus memperbaiki kode sehingga hasilnya akan mencetak dengan benar dan menambahkan contoh di bawah kode.

Sunting: Mengedit kode untuk solusi huruf besar / huruf kecil yang sebelumnya buruk, karena masalah dalam mencetak miring dengan benar.

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

Contohnya

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

Tidak Disatukan:

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 byte

Ini membutuhkan argumen untuk berada dalam pengkodean yang kompatibel dengan ASCII (misalnya ISO-8859.1 atau UTF-8). Ini memodifikasi operator di tempat, dan mengembalikan 0 pada keberhasilan, atau tidak nol sebaliknya. Pengkodean adalah A== huruf kecil dan B== huruf besar. Huruf operator yang tidak digunakan diatur ke atas.

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

Penjelasan

Termasuk program pengujian. Lewati huruf untuk disandikan sebagai argumen pertama, dan string pembawa sebagai yang kedua.

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

Output tes:

$ ./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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.