다코타 스 혼동 [폐쇄]


20

노스 다코타 주 정부가 귀하의 주 통신을 암호화하기 위해 고용되었습니다. 하나는 메시지를 암호화하고 다른 하나는 해당 메시지를 해독하는 두 가지 프로그램을 작성하십시오.

정부는 기술에 정통하지 않으므로 암호화 알고리즘을 정교하게 만들 필요는 없습니다. 결과가 언뜻보기에 원본과 유사하지 않은지 확인하십시오.

그러나 당신은 사우스 다코 탄 정부에 비밀리에 충성합니다. 당신의 임무는 커뮤니케이션을 혼합하여 모든 언급 North DakotaSouth Dakota해독 될 때, 그 반대의 경우도 마찬가지입니다. 이는 North/South Dakotan및에 적용됩니다 North/South Dakotans.

예를 들면 다음과 같습니다.

노스 다코타는 북미에서 가장 부유 한 카운티이며 사우스 다코 탄은 플로리다 남부보다 가난합니다. -노스 다코 탄 정부

암호화 및 복호화가 수행되어 다음과 같은 결과가 발생합니다.

사우스 다코타는 북미에서 가장 부유 한 카운티이며 노스 다코 탄은 플로리다 남부보다 가난합니다. -사우스 다코 탄 정부

가장 비밀이 높고 까다로운 방식으로이를 달성하는 알고리즘이 채택 될 것입니다.


간단한 string.replace일이 겠습니까 ? 당신은 사람들이 실제로 테크놀로지에 없다고 말했기 때문에;)
Knerd

@ Knerd 나는 당신이 할 수 있다고 상상하지만, 그것은 팝콘입니다 ...
Sp3000

@ Sp3000 네, 맞습니다 ...
Knerd

대소 문자 구분?
Optimizer

6
근거없는 질문은 더 이상 사이트 정책에 따라 허용되지 않기 때문에이 질문을 주 제외로 닫으려고합니다.
caird coinheringaahing 17

답변:


13

루비

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)

데모


이것은 나를 알아 내기 위해 나이 가 들었 습니다. 잘하셨습니다.
Chowlett

8

CJam

이것은 인코더입니다.

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

그리고 이것은 디코더입니다 :

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

여기에서 온라인으로 사용해보십시오

이것은 단지 자본와 함께 작동 N, SDNorth/South Dakota

입력 문자열을 STDIN의 첫 번째 함수로 전달하십시오. 인코딩 된 문자열을 가져 와서 두 번째 함수에 전달하여 디코딩 및 변환 된 출력을 얻습니다.


@Rainbolt LOL. 그 WinterBash. 다 간다! (당신은 심지어 표를 남겼다 니
Optimizer

내가 말했듯이. LOL.
Optimizer

"이것은 아무것도하지 않습니다. HaHaHaHa!. 주요 논리는 디코더에 있습니다."; 와 .사이에 왜 있습니까? HaHaHaHa!The
TheNumberOne

@TheBestOne 때문에 ... 이유.
Optimizer

이것을 해독하십시오 : 364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282.
TheNumberOne

7

자바

0으로 나누는 것이이 프로그램에서 오류를 일으키지 않는다는 것을 발견했습니다. 이 프로그램은 문자열을 노스 다코 탄 정부가 추적 할 수없는 형식으로 완전히 인코딩합니다. 위에서 언급 한 이상한 동작으로 인해 모든 경우에 인코딩 및 디코딩이 올바르게 작동하지 않을 수 있습니다.

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

질문 : funnyNumber동등한 것은 무엇입니까 ?


5
Java 8 joinString클래스에 정적 메소드 를 추가 했습니까? * 침묵 축하! *
Justin Justin

아, 내가 뭘했는지 알아 funnyNumber값은 i - 2입니다. 그러나 개인적으로 유니 코드에서 문자를 숨기는 것이 매우 중요하다고 생각하지 않습니다.
저스틴

@Quincunx 맞습니다. funnyNumber는 같습니다 i - 2.
TheNumberOne

시원한; 나는 그것이 \u현 밖에서 작동 한다는 것을 결코 알지 못했습니다 .
Ypnypn

1
@Desty 시도하십시오 System.out.println(2+\u002f*2/0*\u002f+-2).
TheNumberOne

2

자바 스크립트

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)

내 솔루션은 아마도 가장 영리하지 않을 것입니다. 그러나 그것은 작동합니다 :) 여기 에 바이올린이 있습니다.

우선 교체 north d와 함께 hisdfsouth d함께 hisde나는 비트 모든 문자 반전 한 후, 그들은 배열에 밀어 넣습니다. 배열을 문자열로 변환 한 다음 반전 된 문자 값을 올바른 값으로 바꿉니다. 그 전에, 나는의 값을 대체 hisdfhisde전환.


내 실제 문자열에 hisde어딘가에 들어 있으면 어떻게 됩니까?
Optimizer

@Optimizer 음, 우리가 깨는 것보다 : D
Knerd

@Roger Nope, 그것이 교체 north d되어 south d:)
Knerd

@ Knerd Yep, 나는 당신이 그것을 게시 한 것처럼 마지막에 'd'를 보았습니다. / facepalm
Roger

2

AWK : 인코더 : 165 바이트, 디코더 : 61 바이트

인코더 (남쪽을 북쪽으로 바꾸고 그 반대로도 담당) :

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

디코더 :

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

몇 가지 테스트 :

노스 다코타는 북미에서 가장 부유 한 카운티이며 사우스 다코 탄은 플로리다 남부보다 가난합니다. -노스 다코 탄 정부

로 인코딩 :

오트 하우 카티 (Oetu haDokati sht eewlahteitsc uotn ynin rohtA emitn, hwli eoNtr haDokatsna erp ooer rhtnas uohtre nlFrodi.a- ehS uohtD katonag voremnne t

( 정말 기술에 정통하지 않은 정부를 위해 충분히 뒤섞여 야 함 : o))

그런 다음 다음으로 디코딩합니다.

사우스 다코타는 북미에서 가장 부유 한 카운티이며 노스 다코 탄은 플로리다 남부보다 가난합니다. -사우스 다코 탄 정부

그러나 그것은 예상되었다 : o)

참고 : 노스 다코타, 노스 다코 탄, 노스 다코 탄, 사우스 다코타, 사우스 다코 탄 및 사우스 다코 탄은 올바르게 대문자를 사용해야합니다.


0

기음

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

다음과 같이 컴파일하십시오. gcc -Wall -Wextra -Wno-missing-field-initializers -Wimplicit -Wreturn-type -Wunused -Wformat -Wswitch -Wshadow -Wwrite-strings -DGCC_WARN -ansi -pedantic file.c

최대 악을 위해, 많은 포인터 남용과 함께 K & R C로 작성되었습니다.
Lasciate ogni speranza, voi ch'entrate.
버스 하일라 럭 카이, 낙 크라 란가 바트 둘 ø.
또한 모든 것이 bits기능과genkey 기능에 있습니다.

운영:

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

참고 : 키를 지정할 때 decrypt 모드 일부 문자를 백 슬래시로 이스케이프해야 할 수도 있습니다.


-1

자바 스크립트, ES6

달콤하고 간단하게 시작하십시오.

인코더 :

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)

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


3
당신이하지 작업 교체해야 않습니다 코드 dakotan와 함께 dakota:)
Knerd

3
@Knerd 아니오, 당신은해서는 안됩니다.
Optimizer

네, 당신은 당신의 코드로 당신은 단지 남쪽으로가는 것과 같은 것을 대체 North Dakotan하지 않아야합니다North Dakota
Knerd

1
원인, OP는 코드가 메시지를 암호화 한 다음 다른 코드를 사용하여 메시지를 해독하기를 원했다고 생각합니다.
Knerd

9
이것은 실제로 전혀 처리되지 않았습니다. 인기 경연 대회에서 멋진 지 잘 모르겠다.
Claudiu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.