베이컨의 암호 : 스테 가노 그래피 소개


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

메시지의 모든 문자를 위 의 As 및 Bs 로 인코딩 했으므로 이제 코드에 대해 두 가지 서체 를 선택해야합니다 . 이 예제에서는 서체에는 일반 텍스트를 사용 A하고 서체 에는 굵은 텍스트 를 사용 B합니다.

그래서 메시지

HELLOWORLD

에 인코딩

AABBB AABAA ABABB ABABB ABBBA BABBA ABBBA BAAAB ABABB AAABB

이제이 바이너리를 캐리어 텍스트로 숨 깁니다 .

빠른 갈색 여우는 게으른 개를 뛰어 넘으며 목자가 감시하는 들판을 놀래켜줍니다.

캐리어 메시지가 실제 인코딩 된 메시지보다 길면 괜찮지 만 짧을 수는 없습니다. 이제 이동 통신사 텍스트를B 인코딩 된 메시지에서 s가있는 합니다.

전자 숨어 IC 케이 브로 w N FO X J U MP비켜 R t H E L AZ Y 수행 g S , GAM B O L I NG t에 목동이 시계를 유지 여기서 필드.

Markdown이 없으면

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하고 B같은 대문자, 소문자로, 기울임 꼴 , 굵게 , 굵은 기울임 꼴 , 취소 선 , in code format등등. 이러한 서체를 인코딩하려면 Stack Exchange의 Markdown 형식을 사용해야합니다.

    UPPERCASE, lowercase, *italic*, **bold**, 
    ***bold italic***, <s>strikethrough</s>, `in code format`
    
  • 위의 예에서 볼 수 있듯이 출력은 마크 다운으로 표시되거나 표시되지 않은 지금 인코딩 된 캐리어 메시지 여야합니다.

  • 인코딩 알고리즘 만 만들면됩니다. 제공하려는 모든 디코딩 알고리즘은 환영하지만 글을 쓸 때 점수를 높이거나 방해하지 않습니다.

  • 코드는 프로그램 또는 함수 여야합니다.

  • 이것은 코드 골프이므로 가장 적은 수의 바이트가 이깁니다.

문제가 명확하지 않은 경우 언제든지 알려주십시오. 행운과 좋은 골프!


3
따라서 모든 것이 더 많은 바이트를 요구하기 때문에 대문자 / 소문자를 사용하지 않을 이유가 없습니다.
Mego

6
나는 "우리가 얘기하지 않을에 오타가 있다고 생각 하는 , 베이컨은"확실히 당신이 "B"대문자로 써야하므로, 케빈 베이컨에 대해 얘기했다 때문에, 맞죠?
Martin Ender

답변:


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

파이썬 3 216 211 231 225 207 바이트

두 가지 서체에 일반 텍스트와 마크 다운 스타일 이탤릭체를 사용하는 솔루션입니다. 그리고 공백을 제외한 캐리어 메시지의 모든 것을 인코딩합니다.

편집 : 결과가 올바르게 인쇄되고 코드 아래에 예제가 추가되도록 코드를 수정해야했습니다.

편집 : 기울임 꼴을 올바르게 인쇄하는 데 문제가 있기 때문에 이전에 대문자 / 소문자 솔루션을 악화 시키도록 코드를 편집했습니다.

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== 소문자와 B== 대문자입니다. 사용하지 않은 운송 업체 문자는 상단으로 설정되어 있습니다.

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

설명

테스트 프로그램 포함 문자를 첫 번째 인수로 인코딩하고 캐리어 문자열을 두 번째 인수로 전달하십시오.

#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.