O OpenSSL pode decodificar dados de base64 que não contêm quebras de linha?

5

Eu tenho dois pedaços de dados base64 em uma variável bash. As quebras de linha habituais nos dados da base64 foram substituídas por espaços e a variável é basicamente uma cadeia de uma linha muito longa.

Eu posso decodificar os dois pedaços de dados base64 contidos na variável, mas experimentei algumas nuances ao tentar fazê-lo. Gostaria de entender se estou abordando isso corretamente ou se há uma maneira melhor de decodificar dados de base64 que não contém quebras de linha. Aqui está o que eu tenho:

O primeiro pedaço é de 350 caracteres e eu posso decodificá-lo com sucesso assim:

echo ${DATA::350} | openssl base64 -d | wc -c
256

A segunda parte é de 5745 caracteres, mas o comando acima não produz os resultados esperados. ou seja:

$ echo {DATA:350} | openssl base64 -d | wc -c
432

No entanto, funciona se eu colocar as quebras de linha:

$ echo ${DATA:350} | tr ' ' "\n" | openssl base64 -d | wc -c
4240

Espero que exista algum problema de comprimento de linha que o primeiro fragmento seja pequeno o suficiente para evitar, e parece ser um recurso do decodificador base64 sendo usado (os dois usuais, base64 e openssl base64 , se comportam diferentemente).

O base64 decoder (em vez de openssl base64 ) pára no primeiro caractere inválido (o espaço em branco) e, portanto, apenas decodifica a primeira "linha" (48 bytes de dados de saída), enquanto o OpenSSL gera 432 caracteres (9 "linhas "). O comando base64 tem uma opção para ignorar lixo , então isso funciona:

$ echo ${DATA:350} | base64 -d -i | wc -c
4240

O decodificador OpenSSL não parece ter essa opção.

Além disso, a remoção do espaço em branco funciona totalmente para base64 , mas não para openssl base64 :

$ echo ${DATA:350} | tr -d ' ' | openssl base64 -d | wc -c
400

$ echo ${DATA:350} | tr -d ' ' | base64 -d | wc -c
4240

Então, no final, eu substituí as novas linhas e usei o decodificador OpenSSL porque eu precisava processar os dados decodificados de qualquer maneira:

$ openssl enc -d -a -in <(echo ${DATA:350} | /usr/bin/tr ' ' "\n") -aes-256-cbc -pass file:<(echo $skey) | ...

Mas eu gostaria de entender O OpenSSL pode decodificar dados de base64 que não contêm quebras de linha?

    
por starfry 30.07.2016 / 15:41

1 resposta

12

Se você não precisar de espaços, openssl lidará com isso com a opção -A :

Então:

$ ls -l sp2.bmp
-rw-r--r-- 1 sweh sweh 3000054 Apr 21 20:13 sp2.bmp
$ x=$(openssl base64 -A < sp2.bmp)                
$ echo "$x" | wc
      1       1 4000073
$ echo "$x" | openssl base64 -d -A > res
$ ls -l res
-rw-r--r-- 1 sweh sweh 3000054 Jul 30 10:00 res
$ cmp res sp2.bmp 
$ 

Podemos ver que os dados de base64 estão todos em uma linha e podem ser decodificados.

man enc explica a opção -A .

Se você precisar manter os espaços, será necessário removê-los (convertendo para '\n' ou excluindo e usando -A ).

    
por 30.07.2016 / 16:04