Confundir a las Dakotas [cerrado]

20

Usted ha sido contratado por el gobierno de Dakota del Norte para encriptar las comunicaciones del estado. Escriba dos programas, uno para cifrar un mensaje y otro para descifrar ese mensaje.

El gobierno no es realmente experto en tecnología, por lo que el algoritmo de cifrado no necesita ser sofisticado; solo asegúrese de que el resultado no se parezca al original a primera vista.

Sin embargo, eres secretamente leal al gobierno de Dakota del Sur. Su trabajo es mezclar las comunicaciones, de modo que cada mención se North Dakotahaga South Dakotaal descifrar, y viceversa. Esto también se aplica a North/South Dakotany North/South Dakotans.

Por ejemplo:

Dakota del Norte es el condado más rico de América del Norte, mientras que los habitantes de Dakota del Sur son más pobres que el sur de Florida. - el gobierno de Dakota del Norte

sufrirá cifrado y luego descifrado, lo que dará como resultado:

Dakota del Sur es el condado más rico de América del Norte, mientras que los habitantes de Dakota del Norte son más pobres que el sur de Florida. - el gobierno de Dakota del Sur

Se aceptará el algoritmo que logra esto de la manera más secreta y engañosa, como lo demuestra tener la mayor cantidad de votos a favor.

Ypnypn
fuente
¿Sería un string.replacetrabajo simple ? Porque dijiste que a la gente no le
gusta la
@Knerd Me imagino que podrías, pero es un popcon ...
Sp3000
@ Sp3000 sí, tienes razón ...
Knerd
Distingue mayúsculas y minúsculas ?
Optimizador
66
Estoy votando para cerrar esta pregunta como fuera de tema porque las preguntas ocultas ya no están permitidas por la política del sitio.
caird coinheringaahing

Respuestas:

13

Rubí

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)

Manifestación

histocrat
fuente
Esto me llevó años comprender . ¡Bien hecho, señor!
Chowlett
8

CJam

Este es el codificador:

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

y este es el decodificador:

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

Pruébalo en línea aquí

Esto solo funciona con capital N, Sy DenNorth/South Dakota

Pase la cadena de entrada a la primera función desde STDIN. Obtenga la cadena codificada, páselo a la segunda función para obtener la salida decodificada y convertida.

Optimizador
fuente
@ Rainbolt LOL. Es WinterBash. ¡Todo va! (Sorprendido de que incluso le quedaran votos)
Optimizer
Como ya he dicho. Jajaja
Optimizador
"Esto no hace nada. ¡Jajajaja! La lógica principal reside en el decodificador"; ¿Por qué hay un .entre HaHaHaHa!y The?
TheNumberOne
@TheBestOne porque ... razones.
Optimizador
Trate de decodificar la siguiente: 364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282.
TheNumberOne
7

Java

Descubrí que la división por cero no causa errores en este programa. Este programa codifica completamente las cadenas en una forma que no se puede rastrear hasta el gobierno de Dakota del Norte. Debido al extraño comportamiento mencionado anteriormente, la codificación y decodificación pueden no funcionar correctamente en todos los 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;
    }
}

Pregunta: ¿Qué significa funnyNumberigual?

El numero uno
fuente
55
Vaya, ¿Java 8 agregó un método estático joina la Stringclase? * Celebración silenciosa *
Justin
Ah, ya veo lo que hiciste allí. funnyNumbertiene un valor de i - 2. Sin embargo, personalmente no creo que esconder personajes en Unicode sea muy sencillo.
Justin
@Quincunx Correcto, funnyNumber es igual i - 2.
TheNumberOne
Frio; Nunca supe que \ufunciona fuera de las cadenas.
Ypnypn
1
@Desty Prueba 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)

Mi solución probablemente no sea la más inteligente. Pero funciona :) Aquí hay un violín

Primero reemplazo north dcon hisdfy south dcon hisde, luego invierto todos los caracteres a nivel de bits y los empujo en una matriz. La matriz que convierto en una cadena y luego reemplazo los valores de caracteres invertidos con los correctos. Antes de eso, reemplazo los valores de hisdfy hisdecambié.

Knerd
fuente
¿Qué pasa si mi cadena real contiene en hisdealguna parte?
Optimizador
@Optimizer bien, que rompemos: D
Knerd
@Roger Nope, porque lo reemplaza north dy south d:)
Knerd
@Knerd Sí, vi la 'd' al final justo cuando la publicaste. / facepalm
Roger
2

AWK: codificador: 165 bytes, decodificador: 61 bytes

El codificador (también a cargo de reemplazar Sur por Norte y viceversa):

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

El decodificador:

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

Alguna prueba:

Dakota del Norte es el condado más rico de América del Norte, mientras que los habitantes de Dakota del Sur son más pobres que el sur de Florida. - el gobierno de Dakota del Norte

codifica en:

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

(eso debería ser lo suficientemente revuelto para un gobierno que no sea realmente experto en tecnología : o))

Luego se decodifica en:

Dakota del Sur es el condado más rico de América del Norte, mientras que los habitantes de Dakota del Norte son más pobres que el sur de Florida. - el gobierno de Dakota del Sur

Pero eso se esperaba: o)

Nota: Dakota del Norte, Dakota del Norte, Dakota del Norte, Dakota del Sur, Dakota del Sur y Dakota del Sur tienen que estar correctamente capitalizados.

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

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

Para el máximo mal, escrito en K&R C con una pizca de abuso de puntero.
Lasciate ogni speranza, voi ch'entrate.
Buśhaīila rukgâī, naǵkxarańga ba tdhuløk.
Además, todo está en la bitsfunción y la genkeyfunción.

Correr:

[...@...] 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: Al especificar la clave en decryptmodo, puede ser necesario escapar de algunos de los caracteres en la clave con barras invertidas.

Élektra
fuente
-1

JavaScript, ES6

Dulce y simple para empezar.

Codificador:

E=a=>btoa(a)

Descifrador:

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

Pruébelo a continuación en un último Firefox:

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

Optimizador
fuente
3
Su código no funciona, debe reemplazarlo dakotancon dakota:)
Knerd
3
@Knerd no, no deberías.
Optimizador
Sí, debería, con su código que solo reemplaza, North Dakotanno lo North Dakotamismo va para el sur
Knerd
1
Porque, creo que el OP quería que el código encriptara un mensaje y luego con otro código para desencriptarlo.
Knerd
99
Esto no tiene nada de malo en absoluto. Me sentiría tentado a hacer un voto negativo, pero ¿no estoy seguro si eso es genial en un concurso de popularidad?
Claudiu