Esistono due modi per correggere i dati di input descritti qui, o, più specificamente e in linea con l'OP, per rendere il metodo b64decode di base64 del modulo Python in grado di elaborare i dati di input in qualcosa senza sollevare un'eccezione non rilevata:
- Aggiungi == alla fine dei dati di input e chiama base64.b64decode (...)
Se questo solleva un'eccezione, allora
io. Catturalo tramite prova / tranne,
ii. (R?) Elimina qualsiasi = caratteri dai dati di input (NB potrebbe non essere necessario),
iii. Aggiungi A == ai dati di input (da A == a P == funzioneranno),
iv. Chiama base64.b64decode (...) con quelli A == - dati di input aggiunti
Il risultato dell'elemento 1. o dell'articolo 2. sopra darà il risultato desiderato.
Avvertenze
Ciò non garantisce che il risultato decodificato sarà quello originariamente codificato, ma (a volte?) Darà all'OP abbastanza per lavorare con:
Anche con la corruzione voglio tornare al binario perché posso ancora ottenere alcune informazioni utili dallo stream ASN.1 ").
Vedi cosa sappiamo e ipotesi di seguito.
TL; DR
Da alcuni rapidi test di base64.b64decode (...)
sembra che ignori caratteri non [A-Za-z0-9 + /]; che include ignorare = s a meno che non siano gli ultimi caratteri in un gruppo analizzato di quattro, nel qual caso i = s terminano la decodifica (a = b = c = d = dà lo stesso risultato di abc = e a = = b == c == dà lo stesso risultato di ab ==).
Sembra anche che tutti i caratteri aggiunti vengano ignorati dopo il punto in cui base64.b64decode (...) termina la decodifica, ad esempio da un = come quarto in un gruppo.
Come notato in diversi commenti sopra, ci sono zero, o uno, o due, = s di riempimento richiesto alla fine dei dati di input per quando il valore [numero di caratteri analizzati a quel punto modulo 4] è 0 o 3, o 2, rispettivamente. Quindi, dagli elementi 3. e 4. sopra, l'aggiunta di due o più = s ai dati di input correggerà eventuali problemi di [riempimento errato] in quei casi.
TUTTAVIA, la decodifica non può gestire il caso in cui il [numero totale di caratteri analizzati modulo 4] è 1, perché sono necessari almeno due caratteri codificati per rappresentare il primo byte decodificato in un gruppo di tre byte decodificati. In dati di input codificati non corrotti, questo caso [N modulo 4] = 1 non si verifica mai, ma poiché l'OP ha affermato che i caratteri potrebbero mancare, potrebbe accadere qui. Questo è il motivo per cui aggiungere semplicemente = s non funzionerà sempre, e perché aggiungere A == funzionerà quando l'aggiunta di == non funziona. NB Usare [A] è tutto tranne che arbitrario: aggiunge solo bit cancellati (zero) al decodificato, che può essere corretto o meno, ma allora l'oggetto qui non è la correttezza ma il completamento con base64.b64decode (...) senza eccezioni .
Quello che sappiamo dal PO e soprattutto dai commenti successivi lo è
- Si sospetta che manchino dati (caratteri) nei dati di input con codifica Base64
- La codifica Base64 utilizza i 64 valori di posizione standard più il riempimento: AZ; az; 0-9; +; /; = è imbottitura. Ciò è confermato, o almeno suggerito, dal fatto che
openssl enc ...
funziona.
ipotesi
- I dati di ingresso contengono solo dati ASCII a 7 bit
- L'unico tipo di danneggiamento è la mancanza di dati di input codificati
- L'OP non si preoccupa dei dati di uscita decodificati in qualsiasi punto dopo quello corrispondente a qualsiasi dato di ingresso codificato mancante
Github
Ecco un wrapper per implementare questa soluzione:
https://github.com/drbitboy/missing_b64
base64.b64decode(strg, '-_')
? Questo è a priori, senza che tu ti preoccupi di fornire dati di esempio, la soluzione Python più probabile al tuo problema. I "metodi" proposti erano suggerimenti di DEBUG, NECESSARIAMENTE "incostante" data la scarsità delle informazioni fornite.