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é.
urandom
(qui peut être une entrée distincte si vous le souhaitez) si vous vous souciez de "gagner". :-)