Implementare un programma di crittografia CipherSaber , come descritto di seguito. Linee guida:
- La voce più piccola, in byte, vince.
- Una voce sarebbe in genere un programma che prende il testo normale dall'input standard e scrive il testo cifrato nell'output standard, con la chiave specificata (dall'utente) nel modo che preferisci.
- Tuttavia, se si desidera implementare questo come una procedura, va bene lo stesso.
- L'IV deve provenire da un generatore di numeri pseudocasuali crittograficamente sicuro. Se la tua lingua non lo supporta, scegline una diversa. ;-)
- Non utilizzare librerie, chiamate di sistema o istruzioni specifiche per criptovalute (diverse dal PRNG, come stipulato sopra). Naturalmente, le operazioni generiche bit a basso livello vanno bene.
CipherSaber è una variante di RC4 / Arcfour, quindi inizierò descrivendo quest'ultimo, quindi le modifiche apportate da CipherSaber.
0. RC4 / Arcfour
Arcfour è completamente specificato altrove , ma per completezza, lo descriverò qui. (In caso di discrepanze tra la bozza di Internet e questa descrizione, la prima è normativa.)
Impostazione chiave
Configurare due array S
e S2
, entrambi di lunghezza 256, dove si k_1
trova il primo byte della chiave ed k_n
è l'ultimo.
S = [0, ..., 255]
S2 = [k_1, ..., k_n, k_1, ...]
( S2
viene riempito con i byte della chiave, ancora e ancora, fino a riempire tutti i 256 byte.)
Quindi, inizializza j
su 0 e mescola 256 volte:
j = 0
for i in (0 .. 255)
j = (j + S[i] + S2[i]) mod 256
swap S[i], S[j]
end
Questo completa l'impostazione della chiave. L' S2
array non viene più utilizzato qui e può essere rimosso.
Generazione del flusso di cifratura
Inizializza i
e j
su 0, quindi genera il flusso di chiavi come segue:
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
Crittografia / decrittografia dei dati
- Per crittografare, XOR l'output keystream con il testo in chiaro
- Per decrittografare, XOR l'output keystream con il testo cifrato
1. CipherSaber
CipherSaber (che è ciò che stiamo implementando in questa domanda) è una variante di RC4 / Arcfour in due modi:
10 byte IV / nonce
Quando si crittografa un messaggio, è necessario ottenere 10 byte casuali, ad esempio via /dev/urandom
, e scrivere nei primi 10 byte dell'output crittografato. Quando si decodifica un messaggio, i primi 10 byte dell'input sono il IV utilizzato per crittografarlo.
La fase di impostazione della chiave RC4 / Arcfour viene eseguita passphrase || IV
come chiave, dove si passphrase
trova la passphrase specificata dall'utente, IV
come descritto sopra ed ||
è concatenazione. Quindi, una passphrase di "Ciao, mondo!" e un IV di "supercalif" (per quanto improbabile sia :-P) si tradurrebbe in una chiave di "Hello, world! supercalif".
Più iterazioni di impostazione chiave
Per aiutare a prevenire la vulnerabilità che ha reso la crittografia WEP completamente rotta, il ciclo di shuffle della fase di impostazione della chiave di RC4 viene eseguito un numero di volte specificato dall'utente. Il valore di j
deve essere mantenuto tra le iterazioni.
2. Test dei vettori
Ecco alcuni vettori di test che puoi utilizzare per testare i tuoi programmi. Inoltre, ossifrage squeamish ha creato uno strumento di crittografia e decrittografia CipherSaber che è possibile utilizzare per convalidare i risultati.
Hai solo bisogno di implementare il programma di crittografia. Non è necessario fornire il programma di decrittografia, ma l'output del programma di crittografia deve essere inviato correttamente all'input originale quando elaborato con un programma di decrittografia correttamente implementato utilizzando la chiave corretta.
urandom
(che può essere una voce separata se vuoi) se ti interessa "vincere". :-)