Écrivez un programme ou une fonction (ou un ensemble de programmes / fonctions) pour crypter et décrypter les données en fonction des spécifications suivantes:
Chiffrement
Calculez un hachage XOR de l'entrée en XOR-ing chaque octet avec l'autre.
XOR chaque octet de l'entrée par ce hachage.
Décale le résultat de quatre bits vers la gauche.
Remplissez le côté gauche avec les quatre premiers bits du hachage XOR.
Remplissez le côté droit avec les quatre derniers bits du hachage XOR.
Exemple
Entrée donnée:
"G0lf"
(0x47306C66
)Calculer le hachage XOR:
0x47 ^ 0x30 ^ 0x6C ^ 0x66 = 0x7D
XOR chaque octet par hachage:
0x3A4D111B
Résultat attendu (après shift et pad):
"s¤Ñ\x11½"
(0x73A4D111BD
)
Règles
Votre programme / fonction peut entrer / sortir de n'importe quel type qui a du sens dans la langue de golf de votre choix (chaîne, tableau d'octets, etc.) tant que l'entrée / sortie sont les octets réels. Par exemple, vous ne pouvez pas générer de chaîne hexadécimale.
Le chiffrement et le déchiffrement peuvent être séparés dans des programmes séparés (le score sera leur taille combinée) ou un seul. Les méthodes uniques peuvent prendre un argument pour savoir si elles doivent chiffrer ou déchiffrer.
L'entrée pour le chiffrement peut avoir une taille d'au moins 1 octet.
L'entrée pour le déchiffrement peut être d'au moins 2 octets.
Les octets non imprimables n'ont pas besoin d'être échappés dans la sortie.
la source
Réponses:
CJam, 28 + 27 = 55 octets
Pour chaque partie, je présente un programme qui s'attend à ce que l'entrée / sortie soit sous la forme d'un tableau d'entiers et un autre qui utilise une chaîne. Le nombre d'octets ci-dessus concerne la version du tableau d'entiers, mais le script lié et l'explication concernent la version basée sur des chaînes (qui peut être utilisée pour tester l'exemple donné dans la question).
Chiffrement
Décryptage
Voici un script de test qui fait un aller-retour complet et imprime le code crypté avant de refaire le décryptage.
Explication
la source
CJam, 36 + 34 = 70 octets
Une approche un peu différente en utilisant des formes binaires
Encrypter :
Comment ça fonctionne:
Decrypter :
Comment ça fonctionne:
Essayez le chiffreur et le déchiffreur en ligne
la source
Pyth, 69 octets
Cela combine le cryptage et le décryptage, ajoutez simplement un
0
argument as pour le cryptage ou un1
pour le décryptage. La raison en est simple. La conversion de chaînes en bits (ou entier 4 bits) ou l'inverse est vraiment très longue en Pyth. En combinant les deux fonctions en un seul programme, je peux économiser beaucoup d'octets.Démonstrations en ligne: chiffrement et déchiffrement .
Explication:
La première partie convertit l'entrée en une liste d'entiers 4 bits (chaque caractère est converti en 2 entiers 4 bits) et la stocke
K
.La deuxième partie détermine les valeurs de hachage et les stocke
J
. S'il lesQ==0
calcule par xor, sinon il prend la première et la dernière valeur deK
.La partie suivante fait le xor en utilisant les valeurs de hachage. Lorsqu'il
Q == 0
est effectué sur la liste complèteK
, sinon uniquement sur la listeK
sans la première et la dernière valeur.Et la dernière partie se reconvertit
K
en caractères:la source
Javascript ( ES6 ) 83 + 73 = 156
Les deux fonctions prennent en entrée et sortent un tableau de nombres pour représenter les octets.
Crypter
858483Déchiffrer
7573Démonstration (Firefox uniquement)
Utilisation des chaînes 131 + 129 = 260
Et juste pour le plaisir ... voici quelques versions qui utilisent des chaînes d'entrée / sortie à la place.
la source