Mật mã của Bacon: Giới thiệu về Steganography


14

Chú heo con này đi chợ, chú heo con này đã viết một số mã ...

Đợi đã, chúng ta không nói về thịt xông khói đó , chúng ta đang nói về Ngài Francis Bacon! Cụ thể, mật mã Bacon đã nghĩ ra vào cuối những năm 1500 , như một phương pháp ẩn một tin nhắn trong một tin nhắn khác, một phương pháp của steganography .

Các mật mã hoạt động bằng cách che giấu thông điệp trong việc trình bày văn bản, chứ không phải là nội dung của nó. Đầu tiên, các chữ cái trong tin nhắn của bạn được mã hóa thành nhị phân (từ 0 đến 25) như sau:

Lưu ý: Vui lòng sử dụng mã hóa sau trong mã của bạn và đừng lo lắng về số, dấu cách hoặc các ký hiệu khác trong đầu vào, mặc dù tôi có thể dành một số phần thưởng cho những người bao gồm các ký tự này trong mã hóa. Nếu bạn bao gồm các ký hiệu khác, các chữ cái vẫn phải chiếm khoảng 0-25 trong mã hóa.

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

Đã mã hóa tất cả các chữ cái trong tin nhắn của bạn vào As và Bs ở trên, bây giờ bạn phải chọn hai kiểu chữ cho mã của mình. Trong ví dụ này, tôi sẽ sử dụng văn bản bình thường cho kiểu chữ Avăn bản in đậm cho kiểu chữ B.

Vì vậy, tin nhắn

HELLOWORLD

được mã hóa thành

AABBB AABAA ABABB ABABB ABBBA BABBA ABBBA BAAAB ABABB AAABB

Và bây giờ chúng tôi che giấu nhị phân này bằng một văn bản vận chuyển .

Con cáo nâu nhanh nhẹn nhảy qua những con chó lười biếng, ríu rít trên những cánh đồng nơi những người chăn cừu canh chừng.

Sẽ không sao nếu tin nhắn của nhà mạng dài hơn tin nhắn được mã hóa thực tế, mặc dù nó không thể ngắn hơn. Bây giờ chúng ta biến văn bản vận chuyển thành đậm theo vị trí Bcủa các thông điệp được mã hóa,

Th i 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 ruộng nơi các mục đồng giữ đồng hồ.

Mà không có Markdown đọc là

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.

Lưu ý rằng tôi đã không sử dụng dấu chấm câu trong tin nhắn của nhà mạng để mã hóa tin nhắn, nhưng liệu dấu câu có được mã hóa hay không là tùy thuộc vào bạn /.

Quy tắc

  • Đầu vào của bạn sẽ là tin nhắn bạn được mã hóa và tin nhắn vận chuyển. Nếu thông báo vận chuyển quá ngắn, hãy trả về một số loại thông báo lỗi.

  • Bạn phải chọn hai kiểu chữ để mã hóa AB, chẳng hạn như UPPERCASE, chữ thường, in nghiêng , in đậm , in nghiêng đậm , gạch ngang , in code formatv.v. Bạn phải sử dụng hình thức Markdown của Stack Exchange để mã hóa các kiểu chữ này, tức là

    UPPERCASE, lowercase, *italic*, **bold**, 
    ***bold italic***, <s>strikethrough</s>, `in code format`
    
  • Đầu ra của bạn phải là thông báo nhà cung cấp được mã hóa hiện tại của bạn, được hiển thị với Markdown hoặc được hiển thị mà không có, như trong ví dụ trên.

  • Bạn chỉ được yêu cầu thực hiện một thuật toán mã hóa. Bất kỳ thuật toán giải mã nào bạn muốn cung cấp đều được chào đón, nhưng tại thời điểm viết bài sẽ không giúp ích hay cản trở điểm số của bạn.

  • Mã của bạn phải là một chương trình hoặc một chức năng.

  • Đây là mã golf, vì vậy số byte nhỏ nhất sẽ thắng.

Như mọi khi, nếu vấn đề không rõ ràng, xin vui lòng cho tôi biết. Chúc may mắn và chơi golf tốt!


3
Vì vậy, thực sự không có lý do gì để không sử dụng chữ hoa / chữ thường, vì mọi thứ khác có giá nhiều byte hơn
Mego

6
Tôi nghĩ rằng có một lỗi đánh máy trong "chúng ta không nói về thịt xông khói đó ", bởi vì chắc chắn bạn đang nói về Kevin Bacon, vì vậy chữ "b" nên được viết hoa, phải không?
Martin Ender

Câu trả lời:


1

Bình thường, 47 byte

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

Hãy thử nó ở đây .

Giải trình:

             ~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

Đây là một giải pháp sử dụng văn bản thông thường và chữ nghiêng kiểu Markdown cho hai kiểu chữ của nó. Và nó mã hóa mọi thứ trong thông điệp của nhà mạng ngoại trừ khoảng trắng.

Chỉnh sửa: Phải sửa mã để kết quả sẽ in chính xác và thêm các ví dụ bên dưới mã.

Chỉnh sửa: Đã chỉnh sửa mã thành giải pháp chữ hoa / chữ thường kém hơn trước đây, do các vấn đề trong việc in nghiêng chính xác.

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

Ví dụ

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

Ung dung:

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

Điều này đòi hỏi các đối số phải ở dạng mã hóa tương thích ASCII (ví dụ: ISO-8859.1 hoặc UTF-8). Nó sửa đổi nhà cung cấp tại chỗ và trả về 0 khi thành công hoặc khác không. Mã hóa là A== chữ thường và B== chữ hoa. Thư vận chuyển không sử dụng được đặt thành trên.

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

Giải trình

Bao gồm một chương trình thử nghiệm. Truyền các chữ cái để mã hóa làm đối số thứ nhất và chuỗi sóng mang là chuỗi thứ hai.

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

Đầu ra thử nghiệm:

$ ./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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.