Verwirre die Dakotas [geschlossen]

20

Sie wurden von der Regierung von North Dakota beauftragt, die Kommunikation des Staates zu verschlüsseln. Schreiben Sie zwei Programme, eines zum Verschlüsseln einer Nachricht und eines zum Entschlüsseln dieser Nachricht.

Die Regierung ist nicht wirklich technisch versiert, daher muss der Verschlüsselungsalgorithmus nicht ausgefeilt sein. Stellen Sie einfach sicher, dass das Ergebnis auf den ersten Blick nicht dem Original ähnelt.

Sie sind der süddakotischen Regierung jedoch insgeheim treu. Ihre Aufgabe ist es, die Kommunikation so North Dakotazu South Dakotavertauschen, dass jede Erwähnung entschlüsselt wird und umgekehrt. Dies gilt auch für North/South Dakotanund North/South Dakotans.

Beispielsweise:

North Dakota ist die reichste Grafschaft in Nordamerika, während South Dakotans ärmer sind als Südflorida. - die Regierung von North Dakotan

wird verschlüsselt und dann entschlüsselt, was zu folgenden Ergebnissen führt:

South Dakota ist die reichste Grafschaft in Nordamerika, während North Dakotans ärmer sind als Südflorida. - die Regierung von South Dakotan

Der Algorithmus, der dies auf geheimnisvollste und kniffligste Weise bewerkstelligt, was durch die meisten positiven Stimmen belegt wird, wird akzeptiert.

Ypnypn
quelle
Wäre eine einfache string.replaceArbeit? Weil Sie sagten, die Leute sind nicht wirklich in Technologie;)
Knerd
@ Knerd Ich würde mir vorstellen, Sie könnten, aber es ist ein Popcon ...
Sp3000
@ Sp3000 Ja, Sie haben Recht ...
Knerd
Groß- und Kleinschreibung beachten?
Optimierer
6
Ich stimme dafür, diese Frage als "Off-Topic" zu schließen, da unbeantwortete Fragen nach den Richtlinien der Website nicht mehr zulässig sind.
Caird Coinheringaahing

Antworten:

13

Rubin

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

Histokrat
quelle
Das hat ewig gedauert, bis ich es herausgefunden habe. Gut gemacht, Sir!
Chowlett
8

CJam

Dies ist der Encoder:

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

und das ist der Decoder:

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

Probieren Sie es hier online aus

Dies funktioniert nur mit Kapital N, Sund DinNorth/South Dakota

Übergeben Sie die Eingabezeichenfolge an die erste Funktion von STDIN. Rufen Sie die codierte Zeichenfolge ab und übergeben Sie sie an die zweite Funktion, um die decodierte und konvertierte Ausgabe abzurufen.

Optimierer
quelle
@ Rainbolt LOL. Es ist WinterBash. Alles geht! (Überrascht, dass Sie noch Stimmen hatten)
Optimierer
Wie ich sagte. LOL.
Optimierer
"Das tut nichts. HaHaHaHa! Die Hauptlogik liegt im Decoder."; Warum gibt es ein .zwischen HaHaHaHa!und The?
TheNumberOne
@TheBestOne weil ... Gründe.
Optimierer
Versuchen Sie, diese Decodierung: 364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282.
TheNumberOne
7

Java

Ich habe festgestellt, dass die Division durch Null in diesem Programm keine Fehler verursacht. Dieses Programm codiert die Strings vollständig in eine Form, die nicht auf die Regierung von North Dakotan zurückgeführt werden kann. Aufgrund des oben erwähnten seltsamen Verhaltens funktioniert das Codieren und Decodieren möglicherweise nicht in allen Fällen ordnungsgemäß.

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

Frage: Was macht funnyNumbergleich?

Die Nummer eins
quelle
5
Whoa, hat Java 8 joinder StringKlasse eine statische Methode hinzugefügt ? * Stille Feier! *
Justin
Ah, ich verstehe, was du dort getan hast. funnyNumberhat einen Wert von i - 2. Ich persönlich habe nicht das Gefühl, dass das Verstecken von Zeichen in Unicode sehr hinterhältig ist.
Justin
@Quincunx Richtig, funnyNumber ist gleich i - 2.
TheNumberOne
Cool; Ich hätte nie gedacht, dass \udas außerhalb von Streichern funktioniert.
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)

Meine Lösung ist wahrscheinlich nicht die klügste. Aber es funktioniert :) Hier ist eine Geige

Zuerst ersetze ich north dmit hisdfund south dmit hisde, dann invertiere ich alle Zeichen bitweise und schiebe sie in ein Array. Das Array konvertiere ich in einen String und ersetze dann die invertierten Zeichenwerte durch die richtigen. Vorher ersetze ich die Werte von hisdfund hisdeschalte um.

Knerd
quelle
Was ist, wenn meine eigentliche Zeichenfolge hisdeirgendwo enthalten ist ?
Optimierer
@Optimizer gut, als wir es bricht: D
Knerd
@ Roger Nope, weil es ersetzt north dund south d:)
Knerd
@Knerd Ja, ich habe das 'd' am Ende gesehen, so wie du das gepostet hast. / facepalm
Roger
2

AWK: Encoder: 165 Bytes, Decoder: 61 Bytes

Der Encoder (auch verantwortlich für das Ersetzen von Süd durch Nord und umgekehrt):

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

Der Decoder:

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

Einige test:

North Dakota ist die reichste Grafschaft in Nordamerika, während South Dakotans ärmer sind als Südflorida. - die Regierung von North Dakotan

kodiert in:

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

(Das sollte genug für eine nicht wirklich technisch versierte Regierung sein : o))

Es dekodiert dann in:

South Dakota ist die reichste Grafschaft in Nordamerika, während North Dakotans ärmer sind als Südflorida. - die Regierung von South Dakotan

Aber das war zu erwarten: o)

Hinweis: North Dakota, North Dakotan, North Dakotans, South Dakota, South Dakotan und South Dakotans müssen korrekt großgeschrieben werden.

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

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

Für maximales Übel, geschrieben in K & R C mit einem Schuss Zeigermissbrauch.
Lasciate ogni speranza, voi ch'entrate.
Buśhaīila rukgâī, naǵkxarańga ba tdhuløk.
Auch ist alles in der bitsFunktion und der genkeyFunktion.

Lauf:

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

Hinweis: Wenn Sie den Schlüssel im decryptModus angeben, müssen Sie möglicherweise einige der Zeichen im Schlüssel mit Backslashes maskieren.

Élektra
quelle
-1

JavaScript, ES6

Zunächst süß und einfach.

Encoder:

E=a=>btoa(a)

Decoder:

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

Probieren Sie es unter einem aktuellen Firefox aus:

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

Optimierer
quelle
3
Ihr Code nicht funktioniert, sollten Sie ersetzen dakotanmit dakota:)
Knerd
3
@Knerd nein, solltest du nicht.
Optimierer
Ja das solltest du, mit deinem Code North DakotanNorth Dakota
ersetzst
1
Ich denke, das OP wollte, dass der Code eine Nachricht verschlüsselt und dann mit einem anderen Code entschlüsselt.
Knerd
9
Dies ist überhaupt nicht wirklich hintergangen. Ich würde gerne abstimmen, bin mir aber nicht sicher, ob das bei einem Beliebtheitswettbewerb cool ist?
Claudiu