Confundir os Dakotas [fechado]

20

Você foi contratado pelo governo de Dakota do Norte para criptografar as comunicações do estado. Escreva dois programas, um para criptografar uma mensagem e outro para descriptografar essa mensagem.

O governo não é realmente conhecedor de tecnologia; portanto, o algoritmo de criptografia não precisa ser sofisticado; apenas certifique-se de que o resultado não seja semelhante ao original à primeira vista.

No entanto, você é secretamente leal ao governo de South Dakotan. Seu trabalho é misturar as comunicações, de modo que cada menção de North Dakotase South Dakotasobre descriptografia, e vice-versa. Isso também se aplica a North/South Dakotane North/South Dakotans.

Por exemplo:

Dakota do Norte é o condado mais rico da América do Norte, enquanto Dakotans do Sul são mais pobres que o sul da Flórida. - o governo de Dakotan do Norte

sofrerá criptografia e descriptografia, resultando em:

Dakota do Sul é o condado mais rico da América do Norte, enquanto Dakotans do Norte são mais pobres que o sul da Flórida. - o governo Dakotan do Sul

O algoritmo que realiza isso da maneira mais secreta e complicada, como evidenciado por ter o maior número de votos, será aceito.

Ypnypn
fonte
Seria um string.replacetrabalho simples ? Porque você disse que as pessoas não estão realmente em technologie;)
Knerd
@Knerd eu imagino que você poderia, mas é um popcon ... #
Sp3000 #
@ SP3000 sim, você está certo ...
Knerd
Maiúsculas e Minúsculas ?
Optimizer
6
Estou votando para encerrar esta questão como fora de tópico, porque as perguntas secretas não são mais permitidas pela política do site.
caird coinheringaahing

Respostas:

13

Rubi

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)

Demo

histocrata
fonte
Isso me levou séculos para descobrir. Muito bem, senhor!
Chowlett
8

CJam

Este é o codificador:

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

e este é o decodificador:

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

Experimente online aqui

Isso funciona apenas com capital e N, emSDNorth/South Dakota

Passe a string de entrada para a primeira função do STDIN. Obtenha a string codificada, passe-a para a segunda função para obter a saída decodificada e convertida.

Optimizer
fonte
@Rainbolt LOL. É WinterBash. Tudo vai! (Surpreso que você ainda tinha votos)
Optimizer
Como eu disse. RI MUITO.
Optimizer
"Isso não faz nada. HaHaHaHa!. A lógica principal está no decodificador."; Por que existe um .meio HaHaHaHa!e The?
TheNumberOne
@TheBestOne porque ... razões.
Optimizer
Tente descodificar este: 364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282.
TheNumberOne
7

Java

Eu descobri que a divisão por zero não causa erros neste programa. Este programa codifica totalmente as Strings em um formato que não pode ser rastreado pelo governo de Dakotan do Norte. Devido ao estranho comportamento mencionado acima, a codificação e decodificação pode não funcionar corretamente em todos os casos.

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

Pergunta: O que é funnyNumberigual?

O número um
fonte
5
O Java 8 adicionou um método estático joinà Stringclasse? * Celebração silenciosa! *
Justin
Ah, eu vejo o que você fez lá. funnyNumbertem um valor de i - 2. Pessoalmente, não acho que ocultar caracteres em unicode seja muito discreto.
Justin
@Quincunx Correto, funnyNumber é igual i - 2.
TheNumberOne
Legal; Eu nunca soube disso\u funciona fora das cordas.
Ypnypn
1
@Desty Try 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)

Minha solução provavelmente não é a mais inteligente. Mas funciona :) Aqui está um violino

Primeiro eu substituo north d por hisdfe south dpor hisde, depois inverto todos os caracteres em bits e os empurrei em uma matriz. A matriz que eu converto em uma string e substitui os valores de caracteres invertidos pelos corretos. Antes disso, substituo os valores de hisdfe hisdetroquei.

Knerd
fonte
E se a minha string real contida em hisdealgum lugar?
Optimizer
@Optimizer bem, do que nós quebra: D
Knerd 15/12
@Roger Não, becuase substitui north de south d:)
Knerd
@ Knerd Sim, eu vi o 'd' no final, assim como você postou isso. / facepalm
Roger
2

AWK: codificador: 165 bytes, decodificador: 61 bytes

O codificador (também responsável por substituir o sul pelo norte e vice-versa):

{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])}

O decodificador:

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

Algum teste:

Dakota do Norte é o condado mais rico da América do Norte, enquanto Dakotans do Sul são mais pobres que o sul da Flórida. - o governo de Dakotan do Norte

codifica para:

Ostu haDokati sht eewlahteitsc yotan yniN rohtA emirac, hwli e o haDokatsna erp ooer rhtnas uohtre nlFrodi.a- ehS uohtD katonag voremnne t

(que deve ser embaralhado o suficiente para governo que não é realmente conhecedor de tecnologia : o))

Em seguida, decodifica em:

Dakota do Sul é o condado mais rico da América do Norte, enquanto Dakotans do Norte são mais pobres que o sul da Flórida. - o governo Dakotan do Sul

Mas isso era esperado: o)

Nota: Dakota do Norte, Dakotan do Norte, Dakotans do Norte, Dakota do Sul, Dakotan do Sul e Dakotans do Sul devem ser corretamente capitalizados.

LeFauve
fonte
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);
}

Ajuntar com: gcc -Wall -Wextra -Wno-missing-field-initializers -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -DGCC_WARN -ansi -pedantic file.c

Para o mal máximo, escrito em K&R C com uma pitada de abuso de ponteiro.
Lasciate orgni speranza, voi ch'entrate.
Buśhaīila rukgâī, naǵkxarańga ba tdhuløk.
Além disso, tudo está nobits função e nogenkey função.

Corre:

[...@...] 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'

Nota: Ao especificar o decryptmodo de digitação, pode ser necessário escapar alguns dos caracteres da tecla com barras invertidas.

Élektra
fonte
-1

JavaScript, ES6

Doce e simples para começar.

Codificador:

E=a=>btoa(a)

Decodificador:

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

Experimente abaixo em um Firefox mais recente:

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

Optimizer
fonte
3
Seu código não trabalho, você deve substituir dakotancom dakota:)
Knerd
3
@ Knerd não, você não deveria.
Optimizer
Sim, você deve, com o seu código substitui apenas North Dakotannão North Dakotamesmo vale para o sul
Knerd
1
Porque, acho que o OP queria que o código criptografasse uma mensagem e depois com outro código para descriptografá-la.
Knerd
9
Isso não é realmente disfarçado. Eu ficaria tentado a diminuir o voto, mas não tenho certeza se isso é legal em um concurso de popularidade?
Claudiu