Bacon'un Şifresi: Steganografiye Giriş


14

Bu küçük domuzcuk pazara gitti, bu küçük domuzcuk bir kod yazdı ...

Ah bekle, o pastırmadan bahsetmiyoruz, Sir Francis Bacon'dan bahsediyoruz! Özellikle, şifreleme Bacon tasarlanmış de geç 1500'lerde bir mesaj, bir yöntem içinde, bir mesaj gizleme için bir yöntem olarak, steganografi .

Şifre mesajı içeriği yerine metnin sunumunda gizleyerek çalışır . İlk olarak, mesajınızın harfleri aşağıdaki gibi ikili (0'dan 25'e) olarak kodlanır:

Not: Lütfen kodunuzda aşağıdaki kodlamayı kullanın ve girişteki sayılar, boşluklar veya diğer semboller hakkında endişelenmeyin, ancak kodlarına bu karakterleri ekleyenler için biraz bonus tasarlayabilirim. Başka semboller eklerseniz, harfler kodlamada 0-25 arasındaki boşlukları işgal etmelidir.

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

İletinizdeki tüm harfleri yukarıdaki As ve Bs kodlarına dönüştürdükten sonra , şimdi kodunuz için iki yazı tipi seçmelisiniz . Bu örnek için, ben yazı için normal bir metin kullanacak Ave kalın metinle yazı için B.

Yani mesaj

HELLOWORLD

kodlanmış

AABBB AABAA ABABB ABABB ABBBA BABBA ABBBA BAAAB ABABB AAABB

Ve şimdi bu ikiliyi bir taşıyıcı metinle gizliyoruz .

Hızlı kahverengi tilki tembel köpeklerin üzerinden atlar ve çobanların izlediği tarlalarda kumar oynar.

Taşıyıcı mesajının gerçek kodlanmış mesajdan daha uzun olması daha iyidir, ancak daha kısa olamaz. Şimdi taşıyıcı metni B, kodlanmış mesajda s'nin bulunduğu yere göre kalınlaştırıyoruz ,

Pe e qu ik k bro w n fo x j u en ler Ove r T h e l az y yapmak g s , gam b O l i ng t o Çoban takip etmektedir burada alanlar.

Hangi Markdown olmadan okur

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.

İletiyi kodlamak için taşıyıcı iletisindeki noktalama işaretini kullanmadığımı, ancak noktalama işaretinin kodlanmış olup olmadığının size bağlı olduğunu unutmayın.

kurallar

  • Girişiniz kodlanacak mesaj ve bir taşıyıcı mesajı olacaktır. Operatör mesajı çok kısaysa, bir tür hata mesajı gönderin.

  • Sen kodlama için iki yazı biçimleri seçmelisiniz Ave Bbu tür BÜYÜK HARF, küçük harf olarak, italik , kalın , kalın italik , çizili , in code formatvb. Bu yazı tiplerini kodlamak için Stack Exchange'in Markdown formunu kullanmalısınız.

    UPPERCASE, lowercase, *italic*, **bold**, 
    ***bold italic***, <s>strikethrough</s>, `in code format`
    
  • Çıktınız, yukarıdaki örnekte görüldüğü gibi Markdown ile gösterilen veya olmadan gösterilen şimdi kodlanmış operatör mesajınız olmalıdır.

  • Yalnızca bir kodlama algoritması oluşturmanız gerekir. Sağlamak istediğiniz herhangi bir kod çözme algoritması kabul edilir, ancak yazma sırasında puanınıza yardımcı olmaz veya engel olmaz.

  • Kodunuz bir program veya işlev olmalıdır.

  • Bu kod golf, bu yüzden en az bayt sayısı kazanır.

Her zaman olduğu gibi, sorun net değilse, lütfen bana bildirin. İyi şanslar ve iyi golf!


3
Yani büyük / küçük harf kullanmamaya gerek yok, çünkü her şey daha fazla bayt maliyeti
Mego

6
Sanırım "biz bu pastırma hakkında konuşmuyoruz" yazım hatası var , çünkü kesinlikle Kevin Bacon hakkında konuşuyordunuz, bu yüzden "b" büyük harfle yazılmalıdır, değil mi?
Martin Ender

Yanıtlar:


1

Pyth, 47 bayt

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

Burada deneyin .

Açıklama:

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

Bu, iki yazı tipi için normal metin ve Markdown tarzı italik yazı kullanan bir çözümdür. Ve taşıyıcı mesajındaki boşluklar hariç her şeyi kodlar.

Düzenleme: Sonuç doğru yazdırmak ve kodun altına örnekler ekledi böylece kodu düzeltmek zorunda kaldı.

Düzenleme: İtalik yazıcının doğru yazdırılmasında sorunlar nedeniyle, kodu daha önce büyük / küçük harf çözümüne göre düzenledi.

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

Örnekler

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

Bu, bağımsız değişkenlerin ASCII uyumlu kodlamada olmasını gerektirir (örn. ISO-8859.1 veya UTF-8). Taşıyıcıyı yerinde değiştirir ve başarı durumunda 0, aksi takdirde sıfırdan farklı bir değerle döner. Kodlama A== küçük harf ve B== büyük harftir. Kullanılmayan taşıyıcı harfler üste ayarlanır.

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

açıklama

Bir test programı dahil. İlk argüman olarak kodlanacak harfleri ve ikinci argüman olarak taşıyıcı dizeyi iletin.

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

Test çıktısı:

$ ./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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.