Implémentez un programme de chiffrement CipherSaber , comme décrit ci-dessous. Des lignes directrices:
- La plus petite entrée, en octets, gagne.
- Cependant, dans une dérogation aux normes de code-golf , vous êtes invités à publier des entrées intéressantes, même si elles ne sont pas sérieuses.
- Une entrée est généralement un programme qui prend le texte en clair de l'entrée standard et écrit le texte chiffré sur la sortie standard, avec la clé spécifiée (par l'utilisateur) d'une manière que vous préférez.
- Cependant, si vous souhaitez implémenter cela en tant que procédure, c'est bien aussi.
- L'IV doit provenir d'un générateur de nombres pseudo-aléatoires cryptographiquement sécurisé. Si votre langue ne le prend pas en charge, choisissez-en une autre. ;-)
- Veuillez ne pas utiliser de bibliothèques, d'appels système ou d'instructions spécifiques à la cryptographie (autres que le PRNG, comme stipulé ci-dessus). Bien sûr, les opérations génériques au niveau du bit bas sont correctes.
CipherSaber est une variante de RC4 / Arcfour, je vais donc commencer par décrire ce dernier, puis les modifications apportées par CipherSaber.
0. RC4 / Arcfour
Arcfour est entièrement spécifié ailleurs , mais pour être complet, je vais le décrire ici. (En cas de divergence entre le projet Internet et cette description, la première est normative.)
Configuration des touches
Configurez deux tableaux S
et S2
, tous deux de longueur 256, où k_1
est le premier octet de la clé et k_n
le dernier.
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
( S2
est rempli des octets de la clé, encore et encore, jusqu'à ce que les 256 octets soient remplis.)
Ensuite, initialisez j
à 0 et mélangez 256 fois:
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
Ceci termine la configuration des clés. La S2
baie n'est plus utilisée ici et peut être nettoyée.
Génération de flux de chiffrement
Initialisez i
et j
à 0, puis générez le flux de clés comme suit:
i = 0
j = 0
while true
i = (i + 1) mod 256
j = (j + S[i]) mod 256
swap S[i], S[j]
k = (S[i] + S[j]) mod 256
yield S[k]
end
Chiffrement / déchiffrement des données
- Pour crypter, XOR la sortie du flux de clés avec le texte en clair
- Pour déchiffrer, XOR la sortie du flux de clés avec le texte chiffré
1. CipherSaber
CipherSaber (qui est ce que nous implémentons dans cette question) est une variante de RC4 / Arcfour de deux manières:
10 octets IV / nonce
Lors du cryptage d'un message, 10 octets aléatoires doivent être obtenus, par exemple via /dev/urandom
, et être écrits dans les 10 premiers octets de la sortie cryptée. Lors du décryptage d'un message, les 10 premiers octets de l'entrée sont l'IV utilisé pour le crypter.
L'étape de configuration de la clé RC4 / Arcfour est exécutée avec passphrase || IV
comme clé, où passphrase
est la phrase de passe spécifiée par l'utilisateur, IV
comme décrit ci-dessus, et ||
est la concaténation. Donc, une phrase secrète de "Bonjour, mon monde!" et un IV de "supercalif" (aussi improbable que soit :-P) donnerait une clé de "Bonjour, monde! supercalif".
Itérations multiples de la configuration des clés
Afin d'éviter la vulnérabilité qui a rendu le cryptage WEP complètement rompu, la boucle de brassage de l'étape de configuration des clés de RC4 est exécutée un nombre de fois spécifié par l'utilisateur. La valeur de j
doit être conservée entre les itérations.
2. Vecteurs de test
Voici quelques vecteurs de test que vous pouvez utiliser pour tester vos programmes. De plus, squeamish ossifrage a créé un outil de chiffrement et de déchiffrement CipherSaber que vous pouvez utiliser pour valider vos résultats.
Il vous suffit d'implémenter le programme de cryptage. Vous n'avez pas besoin de fournir le programme de déchiffrement, mais la sortie de votre programme de chiffrement doit aller et venir correctement à l'entrée d'origine lorsqu'elle est traitée avec un programme de déchiffrement correctement implémenté à l'aide de la bonne clé.
la source
urandom
(qui peut être une entrée distincte si vous le souhaitez) si vous vous souciez de "gagner". :-)Python 2 -
373350326317 octetsPyth arrivera peut-être plus tard. Définit une fonction,
c(p,d,r,m)
qui prend des listes d'octets pour la phrase secrète et les données, et int pour les répétitions et le mode qui crypte quand 1 et décrypte quand 0. C'est parce que la seule différence entre elles concerne le IV. Renvoie la liste d'octets.Voici quelques fonctions de code de test / d'assistance:
la source
else:v,d=d[:10],d[10:]
pièce.Rubis - 263 caractères
Ceci est ma réponse Ruby à la question d'origine sur stackoverflow en 2010! C'est un encodeur et un décodeur tout en un seul programme
Les paramètres sont les suivants :
e ou d (pour codage ou de décodage)
touche
nombre de fois
la source
C, 312 octets
Accepte une clé et le nombre d'itérations de mélange de clés sur la ligne de commande, puis chiffre tout sur stdin en stdout. Celui-ci utilise la fonction de bibliothèque BSD / Darwin
arc4random()
, qui est un PRNG basé sur RC4. Il se déclenche automatiquement, de sorte que les résultats seront différents à chaque fois.Version plus ordonnée:
Exemple:
la source
Python - 266 caractères
Ceci est ma réponse Python à la question d'origine sur stackoverflow en 2010! C'est un encodeur et un décodeur tout en un seul programme
Les paramètres sont les suivants :
e ou d (pour codage ou de décodage)
touche
nombre de fois
Cette version tente de fusionner les 2 boucles du rc4 en une seule (économise jusqu'à présent 11 octets ...)
la source