Un chiffre de quatre carrés plus féroce

17

Contexte

Il y a cent treize ans, le cryptographe amateur Félix Delastelle a publié son travail sur le chiffre à quatre carrés , un chiffre de substitution digraphique qui accepte deux permutations d'un alphabet de 25 lettres comme clés et code les messages constitués de ces lettres.

Comme la plupart des chiffrements à plume et papier, le chiffre à quatre carrés n'a pas de valeur cryptographique aujourd'hui, mais au moment de son invention, il avait un avantage significatif sur ses homologues monographiques.

Cent treize ans plus tard, Alice Delastelle décide d'améliorer le chiffre à quatre carrés en augmentant la taille de l'alphabet et le nombre de clés. [citation requise]

Configuration des touches

L'alphabet contient les caractères suivants (en commençant par un espace):

 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ

Étant donné une phrase de passe, nous construisons une permutation de cet alphabet comme suit:

  1. Ne conservez que la première occurrence de chaque caractère.

  2. Ajoutez les caractères inutilisés de l'alphabet, dans leur ordre naturel.

Après avoir transformé quatre phrases de passe en quatre clés, nous divisons chaque clé en un carré de longueur de côté 7 et organisons les quatre carrés résultants de sorte qu'ils forment un grand carré.

Par exemple, si les phrases de passe étaient

PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!

les clés seraient construites et disposées comme ceci:

PROGAMI  POULARI
N UZLES  TY CNES
&CDF!"#  &DBWG!"
$%'()*+  #$%'()*
,-./:;<  +,-./:;
=>?@BHJ  <=>?@FH
KQTVWXY  JKMQVXZ

CORET H  DON'T E
SBAYPL!  LV!"#$%
"#$%&'(  &()*+,-
)*+,-./  ./:;<=>
:;<=>?@  ?@ABCFG
DFGIJKM  HIJKMPQ
NQUVWXZ  RSUWXYZ

Chiffrement

Étant donné un message en clair tel que

ALICE LOVES BOB.

nous ajoutons 0 ou 1 espace pour rendre sa longueur uniforme et la divisons en paires de caractères:

["AL" "IC" "E " "LO" "VE" "S " "BO" "B."]

Pour chaque paire de caractères, nous localisons le premier caractère dans le premier carré (ordre de lecture) et le second dans le quatrième.

Ensuite, nous choisissons les caractères dans les carrés restants de telle sorte que les quatre caractères sélectionnés forment un rectangle dont les côtés sont parallèles aux côtés des carrés.

Enfin, nous remplaçons la paire de caractères par les caractères sélectionnés des deuxième et troisième carrés.

Pour notre exemple de chaîne, cela donne

["PP" "A@" "E " "YT" "ZE" "EH" "=T" "<-"]

résultant dans le texte chiffré suivant:

PPA@E YTZEEH=T<-

Tâche

Écrivez un programme ou une fonction qui accepte quatre phrases de passe et un texte en clair, utilise la variante ci-dessus du chiffre à quatre carrés pour le chiffrer et renvoie le texte chiffré résultant.

Détails:

  • Les cinq chaînes d'entrée seront composées uniquement de caractères de l'alphabet mentionné.

  • Les cinq chaînes d'entrée peuvent être lues dans n'importe quel ordre, comme tel, une chaîne unique délimitée par des retours à la ligne ou comme un tableau de cinq chaînes.

  • Vous pouvez supposer qu'aucune des chaînes n'est vide.

  • La sortie doit être une seule chaîne.

    Si vous choisissez d'imprimer la sortie sur STDOUT, vous pouvez imprimer uniquement les caractères du texte chiffré et (éventuellement) une nouvelle ligne de fin.

  • Les règles de standard s'appliquent.

Cas de test

Dans tous les cas de test, les quatre premières chaînes correspondent aux carrés clés dans l'ordre de lecture et la dernière chaîne d'entrée au texte en clair.

Contribution

PROGRAMMING PUZZLES & CODE GOLF
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
DON'T TELL EVE!!!
ALICE LOVES BOB.

Production

PPA@E YTZEEH=T<-

Contribution

 !"#$%&'()*+,-./:;<=>
 !"#$%&'()*+,-./:;<=>?@ABCDE
 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKL
 !"#$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRS
HELLO, WORLD! 

Production

LALLR)#TROKE !

Contribution

,'K AB-Q=?@("W$>XM).C#<I:G!OLP*+;SZJTU%NED/&VFHRY
:,-D$C<SU=IYHFVA;! JG/M&L+WT%#.Q@(N*R")EZOBKX?'>P
L()JX,BND?Z<>P*FU%=O@&KIC+A!Y:;$SWHR.EMG'/T"QV #-
<->CI")AP Q:+U;O/F(KH&ER!MW?X'VJLZ#.$,BSGN@TD%*Y=
SPIN THE PPCG WHEEL OF BLAME!

Production

#>TE,VK+,ZQ(&<[email protected]@DM%NAC&>

Contribution

& %(,-#)$@?/=>'*"<:;!.+
=/$- ?;',@#!(&<")%.:>+*
&%-/<?.;$'#:=!( ,>"+*)@
=,<-*?#.'@/;>%!+:(& ")$
HNRA#JX$H %JAV+"GTS,

Production

GOOD LUCK, HAVE FUN.
Dennis
la source

Réponses:

4

CJam, 52 50 49 47 46 44 octets

l2/qN/'[,32>A,s-f|2/f{~@S+2<.#_7f%_W%.m.m.=}

L'ordre d'entrée est constitué de lignes 5, 2, 3, 1, 4. Essayez-le en ligne .

(-1 octet grâce à @ MartinBüttner, -2 octets grâce à @Dennis)

Explication

l2/           Read the message and split into chunks of 2
qN/           Read rest of input and split by newlines (pass phrases)
'[,32>        Generate " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ"
A,s-          Remove digits 0123456789
f|            Setwise OR with each pass phrase to remove duplicates, giving keys
2/            Split keys into two pairs
f{ ... }      For each message chunk...
  ~             Unwrap key pairs
  @S+2<         Add a space to the message chunk then cap to length 2
  .#            Find the two chars in keys 1, 4
  _7f%          Copy indices and perform modulo 7 on both
  _W%           Copy and reverse
  .m.m          Vectorised subtraction twice
  .=            Apply both indices to keys 2, 3

Pour les indices, nous voulons échanger les chiffres les moins significatifs, la base 7. Par exemple, pour le premier exemple ALsont les indices 4et 7dans les clés 1 et 4 respectivement. Dans la base 7, c'est [0 4]et [1 0]. L'échange des chiffres les moins significatifs donne [0 0]et [1 4], c'est 0-à- dire et11 , et cela correspond respectivement à Pet Pdans les touches 2 et 3.

Cependant, au lieu de la conversion de base, le code effectue les opérations suivantes:

[4 7]     A: Initial indices
[4 0]     B: Indices mod 7
[0 4]     C: Reverse of B

[4 -4]    B-C
[0 11]    A-(B-C)
Sp3000
la source
6

Pyth, 74 71 octets

L+%eb7*7/hb7Jcms+oxdN{d--CMr33 91`MTd.z2ssm@VeJ,ydy_dCmxLhdedC,hJ.tcz2d

Pourrait probablement être beaucoup optimisé. J'utilise beaucoup de zips.

Prend la saisie dans l'ordre suivant:

ALICE LOVES BOB.
PROGRAMMING PUZZLES & CODE GOLF
DON'T TELL EVE!!!
POPULARITY CONTESTS & CODE BOWLING
CORRECT HORSE BATTERY STAPLE
orlp
la source
Puis-je voler votre idée de commande d'entrée?
Maltysen du
@Maltysen Sure.
orlp
4

Pyth - 88 86 83 78 76 75 72 octets

8 octets enregistrés grâce à @orlp .

Waaay trop longtemps, je suis assez mécontent de cela, mais je le poste juste pendant que je cherche une meilleure façon de gérer les carrés.

Jm+oxdN{d-+d-CMr33 91`MTd.zsms@VtPJ,+*7hKs.DR7xV,hJeJdeK+*7@[email protected]

Essayez-le en ligne ici .

Maltysen
la source
Vous pouvez remplacer c+e.z*%le.z2d2par C.tce.z2d. Ne demandez pas :)
orlp