Decodificadores e codificadores de código

18

Digamos que você tenha algum texto e queira enviá-lo ao seu amigo, mas não deseja que mais ninguém o leia. Isso provavelmente significa que você deseja criptografá-lo para que somente você e seu amigo possam lê-lo. Mas há um problema: você e seu amigo se esqueceram de concordar com um método de criptografia; portanto, se você enviar uma mensagem a eles, eles não poderão descriptografá-la!

Depois de pensar nisso por um tempo, você decide apenas enviar ao seu amigo o código para criptografar sua mensagem junto com a mensagem. Seu amigo é muito inteligente, então provavelmente pode descobrir como descriptografar a mensagem estudando o método de criptografia.

Obviamente, como outras pessoas podem estar lendo a mensagem, você deseja escolher um esquema de criptografia que torne o mais difícil possível o crack (descubra o esquema de descriptografia).

Tarefa dos Policiais

Nesse desafio, os policiais desempenharão o papel de gravador: você criará um esquema de criptografia que converte cadeias de caracteres em cadeias de caracteres. No entanto, esse esquema de criptografia deve ser bijetivo , o que significa que não há duas seqüências de caracteres mapeadas para outra sequência e todas as sequências podem ser mapeadas por uma entrada. Ele deve receber apenas uma entrada - a sequência a ser codificada.

Você publicará algum código que executa a criptografia e uma única mensagem criptografada com o esquema detalhado por seu código.

Como você está pagando pelo byte para enviar mensagens, sua pontuação será o comprimento do seu código mais o tamanho do texto cifrado . Se sua resposta estiver errada, você terá uma pontuação infinita.

Após uma semana, você poderá revelar o texto e marcar sua resposta como Segura . Respostas seguras são aquelas que não podem ser quebradas.

Tarefa de ladrões

Os ladrões serão os amigos do escritor ou o intermediário mal-intencionado (não há diferença material, mas você pode interpretar como se isso tornar mais divertido fazê-lo). Eles pegam os esquemas de criptografia e o texto cifrado e tentam descobrir a mensagem criptografada. Depois que descobrirem a mensagem criptografada, eles a postarão em um comentário. (Não haverá um tópico de ladrões separado para esta pergunta.)

O vencedor será o ladrão com mais rachaduras.


Aqui está um exemplo de como pode ser uma solução quebrada:

Comprar Mais Laranjas

Assistente de Trigo
fonte
Se a codificação for bijetiva, quais são o domínio e o codomain?
Freira vazando
As strings com quais caracteres?
Freira vazando
1
@WheatWizard Quais 256? Você quer dizer 256 bytes, não caracteres, certo?
Erik the Outgolfer
7
O que impede alguém de usar uma função criptograficamente segura?
21417 Tutleman
2
Sobre quem é o ônus de provar a bijetividade: o policial ou ladrões em potencial? Ou seja, se não se sabe se uma função é bijetiva, o que acontece?
Stephen

Respostas:

5

Geléia , 57 + 32 = 89 bytes ( rachado )

“¡ḟċ⁷Ḣṡ⁵ĊnɠñḂƇLƒg⁺QfȥẒṾ⁹+=?JṚWġ%Aȧ’
O‘ḅ256b¢*21%¢ḅ¢ḃ256’Ọ

Mensagem criptografada:

EªæBsÊ$ʳ¢?r×­Q4e²?ò[Ý6

Como uma sequência hexadecimal:

4518AAE6421973CA
9724CAB3A23F72D7
AD18855134651810
B23F1CF25BDD9036

Explicação:

O‘ḅ256b¢*21%¢ḅ¢ḃ256’Ọ
O                     convert each into codepoint
 ‘ḅ256                convert from bijective base 256 to integer
      b¢              convert from integer to base N
        *21           map each to its 21th power
           %¢         modulo N
             ḅ¢       convert to integer from base N
               ḃ256’  convert from integer to bijective base 256
                    Ọ convert each from codepoint

Onde Né codificado pela sequência “¡ḟċ⁷Ḣṡ⁵ĊnɠñḂƇLƒg⁺QfȥẒṾ⁹+=?JṚWġ%Aȧ’, que é o número 105587021056759938494595233483151378724567978408381355454441180598980268016731.

Além disso, este é o método RSA com Na chave pública e acima indicada 21. Quebrar isso é equivalente a encontrar os dois principais fatores de N.

Freira Furada
fonte
Bem. Consigo descriptografar minha própria mensagem criptografada com a chave que encontrei, mas ela parece falhar na sua. : - / (? O resultado esperado não é uma mensagem não-Inglês de 4 caracteres, é isso)
Arnauld
3
A mensagem é _ìNb( Experimente online! ).
Anders Kaseorg 19/07
@AndersKaseorg Yup. Era o que eu tinha, mas esperava algo um pouco mais significativo. :-)
Arnauld
1
Pelo que vale, aqui está o código que usei do meu lado.
Arnauld
1
O @AndersKaseorg Jelly tenta avaliar seus argumentos, portanto, bytes nulos são realmente possíveis. tio.run/##y0rNyan8/9//////6jEGIKgOAA
Dennis
5

Geléia , 88 + 64 = 152 bytes

Função de criptografia:

“¥@ɦ⁺€€Ṅ`yȤDƁWĊ;Y^y⁻U ⁸ßɠƁXẹṡWZc'µ÷ḷỊ0ÇtṙA×Ḃß4©qV)iḷỊDƭ Mṛ+<ṛ_idðD’
O‘ḅ256b¢*21%¢ḅ¢ḃ256’Ọ

Mensagem criptografada:

AX!?ÖÍL¹    JÓ°û0àah4Û{µÌá`
^tÝrRÕù#êwðãTÓK"Íû´Ëß!øòOf«

Como uma sequência hexadecimal:

9F419458213FD6CD4CB9094A10D3B0FB
8F30E0616834DB7BB517CCE1600A5E74
DD7252D5F923EA77F0E354D34B9F22CD
FB80B4CBDF21F80E94F24F9A66AB9112

Explicação:

O‘ḅ256b¢*13%¢ḅ¢ḃ256’Ọ
O                     convert each into codepoint
 ‘ḅ256                convert from bijective base 256 to integer
      b¢              convert from integer to base N
        *13           map each to its 13th power
           %¢         modulo N
             ḅ¢       convert to integer from base N
               ḃ256’  convert from integer to bijective base 256
                    Ọ convert each from codepoint

Onde Né codificado pela sequência:

“¥@ɦ⁺€€Ṅ`yȤDƁWĊ;Y^y⁻U ⁸ßɠƁXẹṡWZc'µ÷ḷỊ0ÇtṙA×Ḃß4©qV)iḷỊDƭ Mṛ+<ṛ_idðD’

qual é o número

15465347049748408180402050551405372385300458901874153987195606642192077081674726470827949979631079014102900173229117045997489671500506945449681040725068819

Além disso, este é o método RSA com Na chave pública e acima indicada 13. Quebrar isso equivale a encontrar os dois fatores principais de N, que tem 512 bits.

Freira Furada
fonte
2
Eu amo que a sua aparência string encriptada como o seu código
Skidsdev
Usando este maravilhoso programa , tenho certeza de que posso resolver sua solução alguns milênios após a morte por calor do universo.
socrático Phoenix
A fatoração @SocraticPhoenix por divisão de teste nunca pode chegar perto da peneira quadrática.
Leaky Nun
@LeakyNun Eu não entendo suas palavras grandes matemática ...
socrático Phoenix
@SocraticPhoenix, seu programa tenta cada fator entre 2, enquanto a peneira quadrática é muito mais rápida. Ele pode fatorar um semiprime de 256 bits em 6 minutos, enquanto o seu programa levaria uma eternidade.
Leaky Nun
3

JavaScript (ES6), 43 + 33 = 76 bytes Cracked by Leaky Nun

Função de criptografia, 43 bytes:

s=>[...s].sort(_=>Math.cos(i++),i=0).join``

Mensagem criptografada, 33 bytes:

Nota: este método de criptografia depende do navegador.

FireFox: "ty a)s kaasoeocr!hTt; o s  -cwaoo"
Chrome : "oht aasoaoas   e)tosr;oky c!-cw T"
Edge   : "tskso ;- caroteoTha wa soo ay c!)"
Arnauld
fonte
T! a)o khas eotrto-c; o sa cwsaoy
Freira vazando
@LeakyNun Err ... não.
Arnauld
O que minha resposta produz em vez disso?
Freira vazando
Qual navegador você está usando? Estou usando o Chrome.
Freira vazando
6
That was soooo easy to crack! -;)(I utilizado firefox a quebrá-la)
gotejante Nun
3

Braingolf, Rachado

(d1&,&g)&@

Experimente online!

Mensagem criptografada, 45 bytes (UTF-8)

°Áݭїϳ{ًչםק{їϳэÁק{|э³קѡ|

Hexcódigos de mensagem criptografada

C2 B0 C3 81 DD AD D1 97 CF
B3 C2 90 7B D9 8B D5 B9 D7
9D D7 A7 7B D1 97 CF B3 D1
8D C3 81 D7 A7 7B 7C D1 8D
C2 B3 D7 A7 D1 A1 7C C2 85

Mensagem descriptografada

C'mon, this one's *easy*!

Explicação

(d1&,&g)&@  Implicit input from commandline args
(......)    Foreach loop, foreach codepoint of input
 d          Split into digits
  1         Push 1
   &,       Reverse
     &g     Concatenate
        &@  Print

Decodificador

Um decodificador pode ser feito alterando apenas 3 caracteres. Basta retirar o 1e insira $_inbetween &,e&g

(d&,$_&g)&@
Skidsdev
fonte
Você pode fornecer um TIO?
precisa saber é o seguinte
1
C'mon, this one's *easy*!
KSmarts
@KSmarts Correct!
Skidsdev 20/07
gnão é documentado?
Leaky Nun
Isso é bijetivo?
Leaky Nun
3

JavaScript (ES6), 96 + 9 = 105 bytes

q=>Buffer(q).map((a,i,d)=>d[i-1]^Math.abs(1e16*Math.sin(d[i]+i))%255).sort((a,i)=>Math.tan(a*i))

Texto cifrado (codificado em hexadecimal): 7d111c74b99faff76a

Experimente online!

Resultados de amostra (usando o mecanismo V8):

abc123 -> db48ea4f86b9

Olá -> 1b3420f5ab

iovoid
fonte
Envio inválido: vários textos simples geram o mesmo texto cifrado. Por exemplo: "C", "D". Isso conta apenas para o primeiro caractere. Das 256 entradas possíveis, apenas 165 saídas exclusivas.
Mark Jeronimus
É bijetivo para o intervalo pretendido (ASCII A a ASCII z)
iovoid
Eu acabei de lhe dizer que não é. Apenas tente seu código com respectivamente "C" e "D" como a string de entrada. Mesma sequência de saída 76.
22618 Mark Jeronimus