混淆达科他州[关闭]


20

您已被北达科他州政府雇用来加密该州的通讯。编写两个程序,一个用于加密消息,另一个用于解密该消息。

政府并不真正精通技术,因此加密算法不需要复杂。只需确保结果乍一看看上去与原始图像不相似。

但是,您暗中忠于南达科丹州政府。您的工作是将通信混在一起,以便每次提及North DakotaSouth Dakota在解密时进行,反之亦然。这也适用于North/South DakotanNorth/South Dakotans

例如:

北达科他州是北美最富有的县,而南达科他州比南佛罗里达州更贫穷。-北达科丹州政府

将经过加密然后解密,结果是:

南达科他州是北美最富有的县,而北达科他州比南佛罗里达州更贫穷。-南达科丹州政府

以最秘密,最棘手的方式完成此任务的算法(如投票最多)将被接受。


做简单的string.replace工作吗?因为您说人们并不真正喜欢技术;)
Knerd 2014年

@Knerd我想你可以,但是这是一个popcon ...
Sp3000

@ Sp3000是的,你是对的...
Knerd 2014年

区分大小写 ?
Optimizer

6
我投票关闭此问题为离题,因为站点策略不再允许不满意的问题。
caird coinheringaahing

Answers:


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 2014年

8

贾姆

这是编码器:

232375064392749269032321519657657089927649992440902190178063558812627752920796248165803740235420850037801568815744960725761679066919872746899310628404239458 128b:c~

这是解码器:

364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282 128b:c~

在这里在线尝试

这只是资本运作NSDNorth/South Dakota

将输入字符串从STDIN传递到第一个函数。获取编码的字符串,将其传递给第二个函数以获取解码和转换后的输出。


@Rainbolt哈哈。它的WinterBash。一切顺利!(令人惊讶的是,您甚至还剩下选票)
Optimizer

就像我说的。大声笑。
Optimizer

“这什么也没做。HaHaHaHa !。主要逻辑在于解码器。” 为什么.HaHaHaHa!和之间有一个The
TheNumberOne 2014年

@TheBestOne因为...原因。
Optimizer

尝试对此解码:364380128038419794871782113211824472986419260504039724627500790722811712426518562428698978399810134993565366126560239807690210155343815201005388714282
TheNumberOne 2014年

7

爪哇

我发现除以零不会在该程序中引起错误。该程序将字符串完全编码成无法追溯到北达科他州政府的形式。由于上述奇怪的行为,编码和解码可能无法在所有情况下均正常工作。

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 join是否向String类中添加了静态方法?*欢呼
贾斯汀

啊,我明白你在那里做了什么。funnyNumber的值为i - 2。我个人并不认为用unicode隐藏字符是很容易的。
贾斯汀

@Quincunx正确,funnyNumber等于i - 2
TheNumberOne 2014年

凉; 我从来不知道\u在字符串之外起作用。
Ypnypn 2014年

1
@Desty试试System.out.println(2+\u002f*2/0*\u002f+-2)
TheNumberOne 2014年

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)

我的解决方案可能不是最聪明的。但这有效:) 在这里是一个小提琴

首先,我代替north dhisdfsouth dhisde,然后我按位反转所有的人物和他们推在数组中。我将数组转换为字符串,然后将反转的字符值替换为正确的值。在此之前,我更换的价值观hisdfhisde切换。


如果我的实际字符串包含该怎么办 hisde某处怎么办?
Optimizer

@Optimizer好了,比我们打破了:D
还好

@Roger Nope,因为它将替换north dsouth d :)
Knerd

@Knerd Yep,正如您张贴的那样,我在最后看到了“ d”。/ facepalm
罗杰

2

AWK:编码器:165个字节,解码器:61个字节

编码器(还负责将North替换成South,反之亦然):

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

一些测试:

北达科他州是北美最富有的县,而南达科他州比南佛罗里达州更贫穷。-北达科丹州政府

编码为:

俄克拉荷马州立大学奥克塔分校(Ostu HaDokati)

(这应该是足够争夺一个算不上精通技术的政府:O))

然后将其解码为:

南达科他州是北美最富有的县,而北达科他州比南佛罗里达州更贫穷。-南达科他州政府

但这是预期的:o)

注意:北达科他州,北达科他州,北达科他州,南达科他州,南达科他州和南达科他州必须正确大写。


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

编译: 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。
巴士(Haīilarukgâī,naǵkxarańgabatdhuløk)。
而且,一切都在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

JavaScript,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
您的代码无效,您应该替换dakotandakota:)
Knerd 2014年

3
@Knerd不,你不应该。
Optimizer

是的,您应该用自己的代码替换North DakotanNorth Dakota

1
原因是,我认为OP希望代码对消息进行加密,然后再对另一个代码进行解密。
Knerd 2014年

9
这根本不是真正的不足。我很想拒绝投票,但不确定在人气竞赛中这是否很酷?
Claudiu 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.