Codebreakers et Codewriters

18

Supposons que vous ayez du texte et que vous souhaitiez qu'il soit envoyé à votre ami, mais que vous ne voulez pas que quelqu'un d'autre le lise. Cela signifie probablement que vous souhaitez le crypter afin que seuls vous et votre ami puissiez le lire. Mais il y a un problème: vous et votre ami avez oublié de vous mettre d'accord sur une méthode de cryptage, donc si vous leur envoyez un message, ils ne pourront pas le décrypter!

Après y avoir réfléchi pendant un certain temps, vous décidez d'envoyer simplement à votre ami le code pour crypter votre message avec le message. Votre ami est très intelligent, il peut donc probablement trouver comment déchiffrer le message en étudiant la méthode de chiffrement.

Bien sûr, étant donné que d'autres personnes peuvent lire le message, vous souhaitez choisir un schéma de cryptage qui le rend aussi difficile que possible à déchiffrer (comprendre le schéma de décryptage).

Tâche des flics

Dans ce défi, les flics joueront le rôle de l'auteur: vous concevrez un schéma de cryptage qui convertit les chaînes en chaînes. Cependant, ce schéma de chiffrement doit être bijectif , ce qui signifie qu'aucune chaîne ne doit correspondre à une autre chaîne et que chaque chaîne peut être mappée par une entrée. Il ne doit prendre qu'une seule entrée: la chaîne à encoder.

Vous publierez ensuite un code qui effectue le cryptage, et un seul message crypté avec le schéma détaillé par votre code.

Puisque vous payez à l'octet pour envoyer des messages, votre score sera la longueur de votre code plus la longueur du texte chiffré . Si votre réponse est fêlée, vous obtiendrez un score d'infini.

Après une semaine, vous pouvez révéler le texte et marquer votre réponse comme sûre . Les réponses sûres sont celles qui ne peuvent pas être résolues.

Tâche des voleurs

Les voleurs joueront soit en tant qu'ami de l'écrivain, soit en tant qu'intermédiaire malveillant (il n'y a pas de différence matérielle, mais vous pouvez jouer un rôle comme si c'était plus amusant de le faire). Ils prendront les schémas de cryptage et le texte chiffré et tenteront de comprendre le message crypté. Une fois qu'ils auront compris le message crypté, ils le publieront dans un commentaire. (Il n'y aura pas de thread de voleur distinct pour cette question.)

Le gagnant sera le voleur avec le plus de fissures.


Voici un exemple de ce à quoi pourrait ressembler une solution fissurée:

Acheter plus d'oranges

Post Rock Garf Hunter
la source
Si l'encodage est bijectif, quels sont le domaine et le domaine de codage?
Leaky Nun
Les cordes avec quels personnages?
Nonne qui fuit
1
@WheatWizard Which 256? Vous voulez dire 256 octets pas des caractères non?
Erik le Outgolfer
7
Qu'est-ce qui empêche quelqu'un d'utiliser une fonction cryptographiquement sécurisée?
Tutleman
2
À qui incombe la charge de prouver la bijectivité: le flic ou les voleurs potentiels? Autrement dit, si l'on ne sait pas si une fonction est bijective, que se passe-t-il?
Stephen

Réponses:

5

Gelée , 57 + 32 = 89 octets ( fissurée )

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

Message crypté:

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

En tant que chaîne hexadécimale:

4518AAE6421973CA
9724CAB3A23F72D7
AD18855134651810
B23F1CF25BDD9036

Explication:

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

Nest codé par la chaîne “¡ḟċ⁷Ḣṡ⁵ĊnɠñḂƇLƒg⁺QfȥẒṾ⁹+=?JṚWġ%Aȧ’, qui est le nombre 105587021056759938494595233483151378724567978408381355454441180598980268016731.

De plus, il s'agit de la méthode RSA avec les Ndonnées ci-dessus et la clé publique 21. La fissuration équivaut à trouver les deux facteurs premiers de N.

Leaky Nun
la source
Bien. Je peux décrypter mon propre message crypté avec la clé que j'ai trouvée, mais il semble échouer avec la vôtre. : - / (Le résultat attendu n'est pas un message non anglais à 4 caractères, n'est-ce pas?)
Arnauld
3
Le message est _ìNb( Essayez-le en ligne! ).
Anders Kaseorg
@AndersKaseorg Yup. C'est ce que j'avais, mais je m'attendais à quelque chose d'un peu plus significatif. :-)
Arnauld
1
Pour ce que ça vaut, voici le code que j'ai utilisé de mon côté.
Arnauld
1
@AndersKaseorg Jelly tente d'évaluer ses arguments, donc des octets nuls sont en effet possibles. tio.run/##y0rNyan8/9//////6jEGIKgOAA
Dennis
5

Gelée , 88 + 64 = 152 octets

Fonction de cryptage:

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

Message crypté:

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

En tant que chaîne hexadécimale:

9F419458213FD6CD4CB9094A10D3B0FB
8F30E0616834DB7BB517CCE1600A5E74
DD7252D5F923EA77F0E354D34B9F22CD
FB80B4CBDF21F80E94F24F9A66AB9112

Explication:

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

Nest codé par la chaîne:

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

quel est le nombre

15465347049748408180402050551405372385300458901874153987195606642192077081674726470827949979631079014102900173229117045997489671500506945449681040725068819

De plus, il s'agit de la méthode RSA avec les Ndonnées ci-dessus et la clé publique 13. Le cracker équivaut à trouver les deux facteurs premiers de N, qui ont 512 bits.

Leaky Nun
la source
2
J'adore le fait que votre chaîne cryptée ressemble à votre code
Skidsdev
En utilisant ce merveilleux programme , je suis sûr que je peux casser votre solution quelques millénaires après la mort thermique de l'univers.
Socratic Phoenix
La factorisation @SocraticPhoenix par division d'essai ne peut jamais s'approcher du tamis quadratique.
Leaky Nun
@LeakyNun Je ne comprends pas vos gros mots mathématiques ...
Socratic Phoenix
@SocraticPhoenix votre programme essaie chaque facteur à partir de 2, tandis que le tamis quadratique est beaucoup plus rapide. Il peut factoriser un semi-temps 256 bits en 6 minutes, alors que votre programme aurait pris une éternité.
Leaky Nun
3

JavaScript (ES6), 43 + 33 = 76 octets fissurés par Leaky Nun

Fonction de cryptage, 43 octets:

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

Message crypté, 33 octets:

NB: Cette méthode de cryptage dépend du navigateur.

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
la source
T! a)o khas eotrto-c; o sa cwsaoy
Leaky Nun
@LeakyNun Err ... non.
Arnauld
Que produit ma réponse à la place?
Leaky Nun
Quel navigateur utilisez-vous? J'utilise Chrome.
Leaky Nun
6
That was soooo easy to crack! -;)(J'ai utilisé Firefox pour le casser)
Leaky Nun
3

Braingolf, fissuré

(d1&,&g)&@

Essayez-le en ligne!

Message crypté, 45 octets (UTF-8)

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

Hexcodes du message crypté

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

Message déchiffré

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

Explication

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

Décodeur

Un décodeur peut être créé en changeant seulement 3 caractères. Retirez simplement le 1, et insérez $_entre &,et&g

(d&,$_&g)&@
Skidsdev
la source
Pouvez-vous fournir un TIO?
Kritixi Lithos
1
C'mon, this one's *easy*!
KSmarts
@KSmarts Correct!
Skidsdev
gest sans papiers?
Leaky Nun
Est-ce un bijectif?
Leaky Nun
3

JavaScript (ES6), 96 + 9 = 105 octets

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

Texte chiffré (codé hexadécimal): 7d111c74b99faff76a

Essayez-le en ligne!

Exemples de sorties (en utilisant le moteur V8):

abc123 -> db48ea4f86b9

Bonjour -> 1b3420f5ab

iovoid
la source
Soumission non valide: plusieurs textes en clair génèrent le même texte chiffré. Par exemple: "C", "D". Cela ne compte que pour le premier caractère. Sur les 256 entrées possibles, seulement 165 sorties uniques.
Mark Jeronimus
Il est bijectif pour la plage prévue (ASCII A à ASCII z)
iovoid
Je viens de te dire que non. Essayez simplement votre code avec respectivement "C" et "D" comme chaîne d'entrée. Même chaîne de sortie 76.
Mark Jeronimus