Perché un messaggio crittografato a volte termina con "=="

22

Come esercizio di programmazione ho bisogno di decifrare un messaggio. I soli indizi che ho sono che sembra siano:

  • Il messaggio codificato contiene solo caratteri Base64
  • una sequenza di lettere n (n in 1,4,7,10) volte restituisce un messaggio crittografato con "==".
  • una sequenza di lettere n (n in 2,5,8,11) volte restituisce un messaggio crittografato con "=".
  • una sequenza di lettere n (n in 3,6,9,12) restituisce un messaggio crittografato senza un carattere specifico.

Non voglio una soluzione, mi chiedo solo se questa sequenza di occorrenze per il segno di uguale fornisce un indizio o no.

Grazie.

    
posta czioutas 17.11.2015 - 10:23
fonte

3 risposte

52

I segni = si riferiscono alla lunghezza della stringa codificata in Base64 . Essenzialmente, probabilmente nella forma più comune di Base64, = viene usato come carattere di riempimento per garantire che l'ultimo blocco possa essere decodificato correttamente.

Base64 non è crittografia - non vi è alcun nascondiglio in corso - ma viene spesso utilizzata per consentire l'invio di dati binari in formato solo testo. Tutti i caratteri usati in Base64 si incollano correttamente e possono essere inseriti usando una tastiera senza tasti modificatori oltre lo shift.

    
risposta data 17.11.2015 - 11:06
fonte
3

Come accennato in precedenza, Base64 non è una crittografia ma una codifica. Come puoi vedere nella RFC che ha specificato lo standard, base64 funziona nel modo seguente.

  • Hai un flusso di caratteri s, di lunghezza n.
  • leggi 3 valori a 8 bit dal flusso (ora hai un totale di 24 bit = 3 byte)
  • Rompi questi 24 bit a 4 gruppi di 6 bit ciascuno
  • Usando la tabella dell'alfabeto Base 64, codifichi ognuno dei gruppi a 6 bit nell'equivalente Base64

Ora, c'è la possibilità di raggiungere la fine dello stream e non si dispone di un (s mod 6! = 0) a 24 bit di gruppo. Se ciò accade, aggiungi degli zeri alla fine dell'input, finché non hai un numero intero di gruppi di 6 bit.

Dato che il tuo stream di input è codificato ASCII, quindi è composto da caratteri a 8 bit, ci sono solo due casi in cui finisci nello scenario sopra.

1) Hai 8 bit nell'ultimo gruppo

2) Hai 16 bit nell'ultimo gruppo

Nel primo caso, vengono aggiunti 4 zeri (che forniscono 12 bit) e l'output sarà composto da due caratteri (2 * 6 bit = 12 bit) codificati in base all'alfabeto e due "=" caratteri padding

Nel secondo caso, verranno aggiunti 2 zeri (fornendo un totale di 18 bit) e l'output sarà composto da tre caratteri (3 * 6 bit = 18 bit) e un carattere di riempimento "=".

Ecco come a volte finisci con uno, due o nessun "=" alla fine del testo codificato. Per maggiori informazioni dovresti leggere veramente la RFC che ha definito lo standard e la voce wikipedia ad essa correlata.

    
risposta data 25.11.2015 - 13:12
fonte
1

Ci sono molti altri sistemi di codifica che usano il segno = di alcuni includono:

ESAB46 (BASE64 all'indietro)

ATOM128

MEGAN35

FERON74

Come è già stato detto, il = è filler / buffer per indicare al unencoder la lunghezza. Questo è particolarmente il motivo per cui i crittologi stanno cercando un modo migliore di fare il buffering perché quel = è un regalo morto.

    
risposta data 17.11.2015 - 13:42
fonte

Leggi altre domande sui tag