Primeiro, pego uma string codificada em base64 e a decodifico:
local base64_str="OQbb8rXnj/DwvglW018uP/1tqldwiJMbjxBhX7ZqwTw="
echo "${base64_str}" | base64 --decode > foo.txt
O tamanho do arquivo binário é 32 bytes com base em:wc -c < foo.txt
Eu costumo xxd
codificar o valor no arquivo para o formato hexadecimal:
xxd -p ./foo.txt ./foo.hex.txt
O valor hexadecimal no arquivo foo.hex.txt é:
3906dbf2b5e78ff0f0be0956d35f2e3ffd6daa577088931b8f10615fb66a
c13c
O tamanho do arquivo hash codificado é de 66 bytes usandowc -c < foo.hex.txt
Gostaria de pegar a string base64 e convertê-la para hexadecimal de modo que ela permaneça uma string de 32 bytes que eu possa usar com o openssl para criptografar e descriptografar usando cifras aes-256.
local iv_hex=$(base64_to_hex "${iv}")
local key_hex=$(base64_to_hex "${key}")
openssl enc -aes-256-ctr -K "${key_hex}" -iv "${iv_hex}" -in "${input_file}" -out "${output_file}"
Converter string pequena codificada em base64 para hexadecimal
1. Redução de garfos
A resposta aceita oferece uma solução com muitos garfos! Detesto garfos inúteis !
Aqui está meu pequeno conversor de base64 para hexadecimal :
Para evitar bifurcações como essa
myVar=$(myFunc args)
, esta função preencherá apenas uma variável e não imprimirá nada.Então você pode usar:
Veja no final desta página a comparação do tempo de execução.
2. Jeito bash puro:
Isso não depende
xxd
nembase64
precisa ser instalado. (E sem forks, será significativamente mais rápido do que executar 3 forks! Lembre-se disso se você planeja executar isso repetidamente!)Disto: Script Bash - decodificar string codificada em array de bytes , no meu site: base64decoder.sh.txt , base64decoder.sh , com uma modificação muito pequena**:
Primeiro prepare uma matriz somente leitura como:
Então
b64ToHex
função:Se o loop bash for conhecido por ser lento, fazer um loop de apenas 32 bytes será significativamente mais rápido e exigirá menos do sistema do que executar quatro bifurcações!
Uso de STDIN :
De um argumento:
Atribuir uma variável:
Então, de, para variáveis:
Nota: isso é feito sem garfo.
Para se divertir: recuperando a string base64 original, com o bash V5.1+, você pode:
3. Modo bash puro, mas usando bash V5.2+
Mesmo script, mas usando patsub_replacement e
mapfile
, eu poderia fazer isso sem nenhum loop bash !4. Comparação do tempo de execução
Bem, agora um pequeno teste de comparação fazendo repetidamente a mesma conversão para calcular o tempo de execução.
Agora tenho 4 funções:
b64toHex
Minha versão usandobase64
exxd
b64ToHex
Minha versão bash puraT
(observe o superior )b64ToHex52
Meu bash puro usando bash versão 5.2+base64_to_hex
da resposta aceita.Aqui está minha pequena função de teste:
Vamos mostrar com um pequeno milhar de operação:
Poderia produzir algo como:
Onde
r
para real ,u
: usuário ,s
: tempo do sistema ep
: porcentagem da CPU é:100 * ( u + s ) / r
xxd
ebase64
com apenas dois garfos será até um pouco mais rápida quexxd
,base64
etr
). Eles são os mais lentos e, sim: mais dois forks ocupam espaço no sistema.Nota: em um sistema multicore,
user
o tempo é maior quereal
o tempo, graças à paralelizaçãoNo meu Raspberry-Pi II modelo B , tive que reduzir meu teste para 20 loops.
Produziu no meu RPi II :
xxd -p
pode haver\n
caracteres na saída, então você precisa removê-los:Use sua string base64 como exemplo: