Nhầm lẫn các Dakotas [đóng cửa]


20

Bạn đã được chính quyền Bắc Dakota thuê để mã hóa thông tin liên lạc của tiểu bang. Viết hai chương trình, một để mã hóa tin nhắn và một để giải mã tin nhắn đó.

Chính phủ không thực sự am hiểu về công nghệ, vì vậy thuật toán mã hóa không cần phải tinh vi; chỉ cần đảm bảo rằng kết quả không giống với bản gốc ở cái nhìn đầu tiên.

Tuy nhiên, bạn đang bí mật trung thành với chính phủ Nam Dakotan. Công việc của bạn là trộn lẫn các thông tin liên lạc, để mọi đề cập đến North Dakotatrở thành South Dakotakhi giải mã và ngược lại. Điều này cũng áp dụng cho North/South DakotanNorth/South Dakotans.

Ví dụ:

Bắc Dakota là quận giàu có nhất ở Bắc Mỹ, trong khi Nam Dakotans nghèo hơn miền nam Florida. - chính quyền Bắc Đăkotan

sẽ trải qua mã hóa và sau đó giải mã, dẫn đến:

Nam Dakota là quận giàu có nhất ở Bắc Mỹ, trong khi Bắc Dakotans nghèo hơn miền nam Florida. - chính quyền Nam Dakotan

Thuật toán thực hiện điều này theo cách bí mật nhất, phức tạp nhất, bằng chứng là có nhiều upvote nhất, sẽ được chấp nhận.


Một string.replacecông việc đơn giản ? Bởi vì bạn đã nói rằng mọi người không thực sự thích công nghệ;)
Knerd

@Knerd Tôi tưởng tượng bạn có thể, nhưng đó là một popcon ...
Sp3000

@ Sp3000 vâng, bạn đúng ...
Knerd

Trường hợp nhạy cảm ?
Tối ưu hóa

6
Tôi đang bỏ phiếu để đóng câu hỏi này dưới dạng ngoài chủ đề vì các câu hỏi ngầm không còn được phép theo chính sách trang web.
caird coinheringaahing

Câu trả lời:


13

Hồng ngọc

class Dakota

  PRIVATE_KEY = 8411088

  def self.encrypt(str)
    str.gsub(/[A-Z]/){|c|"0#{c.downcase}"}.gsub(/[a-z]+/){|s|xor(s.to_i(36),$')}
  end

  def self.decrypt(str)
    str.gsub(/\d+/){|s|out = s.to_i.to_s(36);out[0] = out[0].upcase if s[0]==?0; out}
  end

  def self.xor(n, config)
    n^=PRIVATE_KEY if private_env?(config)
    n
  end

  def self.private_env?(config)
    config =~ /^ .#{private}/i
  end

end

puts code = Dakota.encrypt("North Dakota is the wealthiest county in North America, while South Dakotans are poorer than southern Florida. - the North Dakotan government")

puts out = Dakota.decrypt(code)

Bản giới thiệu


Điều này làm tôi mất nhiều thời gian để tìm ra. Làm tốt lắm, thưa ngài!
Chowlett

8

Camam

Đây là bộ mã hóa:

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

và đây là bộ giải mã:

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

Dùng thử trực tuyến tại đây

Điều này chỉ hoạt động với vốn N, SDtrongNorth/South Dakota

Truyền chuỗi đầu vào cho hàm đầu tiên từ STDIN. Lấy chuỗi được mã hóa, chuyển nó đến hàm thứ hai để có được đầu ra được giải mã và chuyển đổi.


@Rainbolt LOL. Đó là WinterBash. Mọi thứ diễn ra! (Ngạc nhiên vì bạn thậm chí còn bỏ phiếu)
Trình tối ưu hóa

Như tôi đa noi. LOL.
Tối ưu hóa

"Điều này không có gì. HaHaHaHa !. Logic chính nằm ở bộ giải mã."; Tại sao có một .giữa HaHaHaHa!The?
TheNumberOne

@TheBestOne vì ... lý do.
Tối ưu hóa

Hãy thử giải mã điều này : 364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282.
TheNumberOne

7

Java

Tôi phát hiện ra rằng chia cho số 0 không gây ra lỗi trong chương trình này. Chương trình này mã hóa hoàn toàn các Chuỗi thành một hình thức không thể truy tìm được từ chính quyền Bắc Dakotan. Do hành vi lạ được đề cập ở trên, mã hóa và giải mã có thể không hoạt động chính xác trong mọi trường hợp.

class Program{

    public static void main(String[] args){
        String input = String.join(" ", args);
        String encode = encode(input);
        System.out.println("Encoded: " + encode);
        System.out.println("Decoded: " + decode(encode));
    }


    static String encode(String input){
        String answer = "";
        input = input.replaceAll("North Dakota", "☃");//Temporarily switch these so that spies
        input = input.replaceAll("South Dakota", "North Dakota");//think the message is from South Dakota
        input = input.replaceAll("☃", "South Dakota");//if they decode the message.
        for(int i =0; i < input.length(); i++){
            answer += (char)(~input.charAt(i)) + "";
        }
        return answer;
    }

    static String decode(String input){
        String answer = "";
        int i;
        for(i=0; i < input.length(); i++){
            answer += (char)(~input.charAt(i)) + "";
        }
        int funnyNumber = (i+\u002f*0)/0;//Division by 0 should cause an error???
        answer.replaceAll("South Dakota", "☃");
        answer.replaceAll("North Dakota", "South Dakota");
        answer.replaceAll("☃", "North Dakota");
        //For some reason, this does not cause errors either:
        funnyNumber = ((500/0)*\u002f+-2);
        return answer;
    }
}

Câu hỏi: Cái gì không funnyNumberbằng?


5
Whoa, Java 8 đã thêm một phương thức tĩnh joinvào Stringlớp chưa? * Lễ kỷ niệm im lặng! *
Justin

Ah, tôi thấy những gì bạn đã làm ở đó. funnyNumbercó giá trị i - 2. Cá nhân tôi không cảm thấy rằng việc ẩn các ký tự trong unicode là rất ngầm.
Justin

@Quincunx Đúng, funnyNumber không bằng i - 2.
TheNumberOne

Mát mẻ; Tôi không bao giờ biết rằng \uhoạt động bên ngoài chuỗi.
Ypnypn

1
@Desty Hãy thử System.out.println(2+\u002f*2/0*\u002f+-2).
TheNumberOne

2

JavaScript

function encrypt (input) {
    input = input.replace(/north d/gi, 'hisdf')
    input = input.replace(/south d/gi, 'hisde')
    var data = input    
    var res = []
    for (var i = 0; i < data.length; i++) {
        res.push(~data.charCodeAt(i))
    }
    return res.toString()
}
function decrypt (input) {
    console.log(input)
    input = input.replace(/-105,-106,-116,-101,-102/g, '-79,-112,-115,-117,-105,-33,-69').replace(/-105,-106,-116,-101,-103/g, '-84,-112,-118,-117,-105,-33,-69 ')
    input = input.split(',')
    var res = ""
    for (var i = 0; i < input.length; i++) {
        var itm = input[i]
        res += String.fromCharCode(~parseInt(itm))
    }
    return res
}
var data = encrypt(prompt('What do you want to encrypt?'))
var data = decrypt(data)
alert(data)

Giải pháp của tôi có lẽ không phải là thông minh nhất. Nhưng nó hoạt động :) Đây là một fiddle

Đầu tiên tôi thay thế north dbằng hisdfsouth dbằng hisde, sau đó tôi đảo ngược tất cả các ký tự theo chiều bit và đẩy chúng trong một mảng. Mảng tôi chuyển đổi thành một chuỗi và sau đó thay thế các giá trị ký tự đảo ngược bằng các giá trị chính xác. Trước đó, tôi thay thế các giá trị hisdfhisdechuyển đổi.


Điều gì nếu chuỗi thực tế của tôi chứa hisdeở đâu đó?
Tối ưu hóa

@Optimizer tốt, hơn chúng tôi, nó phá vỡ: D
Knerd

@Roger Không, vì nó thay thế north dsouth d:)
Knerd

@Knerd Yep, tôi đã thấy 'd' ở cuối khi bạn đăng nó. / facepalm
Roger

2

AWK: Bộ mã hóa: 165 byte, Bộ giải mã: 61 byte

Bộ mã hóa (cũng chịu trách nhiệm thay thế Nam bằng Bắc và ngược lại):

{a="(th Dakota(ns?)?)";b="\\1";split(gensub("@"a,"Sou"b,"g",gensub("Sou"a,"Nor"b,"g",gensub("Nor"a,"@"b,"g")))" ",y,"");for(i=1;i<length(y);i+=2)printf(y[i+1] y[i])}

Bộ giải mã:

{split($0,y,"");for(i=1;i<length(y);i+=2)printf(y[i+1] y[i])}

Một số thử nghiệm:

Bắc Dakota là quận giàu có nhất ở Bắc Mỹ, trong khi Nam Dakotans nghèo hơn miền nam Florida. - chính quyền Bắc Đăkotan

mã hóa thành:

oStu haDokati sht eewlahteitsc uotn yniN rohtA emirac, hwli eoNtr haDokatsna erp ooer rhtnas uohtre nlFrodi.a- t ehS uohtD katonag vorem

(điều đó nên được xáo trộn đủ cho một chính phủ không thực sự am hiểu về công nghệ : o))

Sau đó nó giải mã thành:

Nam Dakota là quận giàu có nhất ở Bắc Mỹ, trong khi Bắc Dakotans nghèo hơn miền nam Florida. - chính quyền Nam Dakotan

Nhưng điều đó đã được mong đợi: o)

Lưu ý: Bắc Dakota, Bắc Dakotan, Bắc Dakotans, Nam Dakota, Nam Dakotan và Nam Dakotans phải được viết hoa đúng.


0

C

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

#define MASK_B 0xFFFFFFULL
#define MASK_C 0xFFULL
#define ll unsigned long long int
#define transform(a,b) ((a)>(b))?(a):(b)
static const ll magic_num = 0x756f736874726f6e;
#define BITS(a,b) (magic_num&(MASK_C<<((a+b)*8)))>>((a+b)*8)

char * key;
ll keylen;
FILE * file;

char * encrypt(in)
char * in;
{
    char * out;
    size_t length = strlen(in);
    out = (char *) malloc(sizeof (char) * (length + 1));
    for (ll i = 0; i < length; i++)out[i] = key[i % keylen]^in[i];
    out[length] = '\0';
    return out;
}

char * decrypt() {
    size_t len = 0;
    fpos_t pos;
    char * out;
    fgetpos(file, &pos);
    do if (fgetc(file) == EOF) break; else len++; while (1);
    out = (char *) malloc(sizeof (char) * (len + 1));
    fsetpos(file, &pos);
    char chr;
    ll idx = 0;
    do {
        chr = fgetc(file);
        if (chr == EOF) break;
        out[idx++] = chr^key[idx % keylen];
    } while (1);
    out[len] = '\0';
    return out;
}

void * bits(flag, mask)
ll flag;
char * mask;
{
    int dx = (flag & (~0&MASK_C)<<16) ? 5 : 0;
    key[0] = BITS(dx, 0),key[1] = BITS(dx, 1),key[2] = BITS(dx, 2),key[3] = BITS(3, 0),key[4] = BITS(3, 1);
    strncpy(&key[5], " dakota", 8);
    if (flag & ~(MASK_B^MASK_C)) {
        dx = (char)flag & MASK_C;
        if (islower(*mask)) *mask = key[dx - 1];
        else *mask = toupper(key[dx - 1]);
    } else if (!(flag & ~~0))
        return (void *) key;
    return (void*) key[transform(arc4random_uniform(12), 12)];
}

int genkey(in)
char * in;
{
    size_t bound_upper = strlen(in);
    char * index1 = malloc(sizeof(char) * (bound_upper + 1));
    char * index2 = malloc(sizeof(char) * (bound_upper + 1));
    char * index;
    index1 = strcpy(index1,in);
    index2 = strcpy(index2,in);
    ll spice = 0;
    key = (char *) malloc(sizeof (char) * 13);
    char *hits = (char *) malloc(sizeof (char) * bound_upper);
    for (unsigned long j = 0; j < bound_upper; j++){
        hits[j] = 0;
    }

    for (int iter = 0; iter < 2; iter++) {
        ll rotation = 0, flag = MASK_C << (8 * (iter + 1)), flag2 = MASK_C << (8 * (2 - iter)),abs=0;
        char * tmpstr;
        index = iter ? index2 : index1;
        do {
            spice = spice + arc4random_uniform(bound_upper) % bound_upper;
            if (!rotation) {
                tmpstr = strcasestr(index, bits(flag, in));
                if (tmpstr == NULL)
                    goto out;
                index = tmpstr;
            } else {
                bits(flag2 | rotation, index++);
                hits[abs] = iter + 1;
            }
            rotation = (rotation + 1) % (4);
            abs = index - (iter ? index2 : index1);
        } while (flag);
out:
        index = in;
        rotation = 0;
    }
    for(int k = 0;k < bound_upper;k++){
        index[k]=(hits[k]==1?index1[k]:(hits[k] ? index2[k]: index[k]));
        spice += arc4random_uniform(spice)|spice^arc4random();
    }
    free(key);
    spice = spice % bound_upper;
    if (!spice)
        spice = bound_upper;
    keylen = (keylen | spice) & MASK_B;
    key = (char *) malloc(sizeof (char) * (keylen + 1));
    for (ll i = 0; i < keylen; i++)
        key[i] = (arc4random_uniform(126 - ' ') % (126 - ' ')) + ' ';
    key[keylen] = '\0';
    return keylen;
}

int main(argc, argv)
int argc;
char *argv[];
{
    if (argc != 4) return 1;
    char * result;
    if (!strcmp(argv[1], "encrypt")) {
        (void) genkey(argv[2]);
        result = encrypt(argv[2]);
        printf("Decryption Key: '%s'\n", key);
        file = fopen(argv[3], "wb");
        if (file == NULL) printf("Could not open file for writing: %s", argv[3]);
        if (fwrite(result, sizeof (char), strlen(result), file) != strlen(result)) printf("Error occurred while writing ciphertext to file!");
    }
    if (!strcmp(argv[1], "decrypt")) {
        file = fopen(argv[3], "rb");
        if (file == NULL) printf("Could not open file for reading: %s", argv[3]);
        key = argv[2];
        keylen = strlen(argv[2]);
        result = decrypt();
        printf("Plaintext: '%s'\n", result);
    }
    return 0 & fclose(file);
}

Biên dịch với: gcc -Wall -Wextra -Wno-missing-field-initializers -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -DGCC_WARN -ansi -pedantic file.c

Đối với tội ác tối đa, được viết bằng K & R C với một dấu vết lạm dụng con trỏ.
Lasciate ogni speranza, với ch'entrate.
Buhaīila rukgâī, naǵkxarańga ba tdhuløk.
Ngoài ra, tất cả mọi thứ là trong bitschức năng và genkeychức năng.

Chạy:

[...@...] testing_golf$ ./a.out encrypt "North Dakota is the wealthiest county in North America, while South Dakotans are poorer than southern Florida. - the North Dakotan government" cipher
Decryption Key: ')=1aj3'
[...@...]: testing_golf$ ./a.out decrypt ")=1aj3" cipher
Plaintext: 'South Dakota is the wealthiest county in North America, while North Dakotans are poorer than southern Florida. - the South Dakotan government'

Lưu ý: Khi chỉ định khóa trong decryptchế độ, có thể cần phải thoát một số ký tự trong khóa có dấu gạch chéo ngược.


-1

JavaScript, ES6

Ngọt ngào và đơn giản để bắt đầu.

Mã hoá:

E=a=>btoa(a)

Bộ giải mã:

D=a=>atob(a_.replace(/(nor|sou)(th dakota)/gi, (_,x,y)=>({n:"sou",s:"nor",N:"Sou",S:"Nor"})[x[0]]+y)

Hãy thử nó dưới đây trên Firefox mới nhất:

E=a=>btoa(a)
D=a=>atob(a).replace(/(nor|sou)(th dakota)/gi, (_,x,y)=>({n:"sou",s:"nor",N:"Sou",S:"Nor"})[x[0]]+y)
var string = prompt()
alert("Encoded string: " + E(string));
alert("Decode string: " + D(E(string)));


3
Mã của bạn không hoạt động, bạn nên thay thế dakotanbằng dakota:)
Knerd

3
@Knerd không, bạn không nên.
Tối ưu hóa

Có, bạn nên, với mã của bạn, bạn chỉ thay thế North Dakotankhông North Dakotađi về phía nam
Knerd

1
Nguyên nhân, tôi nghĩ OP muốn mã hóa một tin nhắn và sau đó với một mã khác để giải mã nó.
Knerd

9
Điều này thực sự không phải là ngầm. Tôi đã bị cám dỗ để downvote nhưng không chắc chắn nếu điều đó tuyệt vời trong một cuộc thi nổi tiếng?
Claudiu
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.