OpenSSL Uso para descriptografar uma string

0

Peço desculpas se esta não é a comunidade correta.

Eu tenho uma string que acredito ter sido criptografada usando uma criptografia RC2. Eu conheço a chave secreta e o IV, mas estou tentando descriptografá-lo usando o OpenSSL. Eu sei o que o texto simples deve ser.

$ echo MY_CIPHER_TEXT | openssl enc -d -base64 -rc2 -iv MY_IV

Eu sou solicitado pela senha de descriptografia, que eu insiro, mas sempre recebi uma resposta

bad magic number

Acredito que isso signifique que openssl não reconhece MY_CIPHER_TEXT como texto cifrado, mas estou tentando entender por quê.

Alguém pode ajudar a explicar por que estou recebendo a resposta "Bad Magic Number"?

MY_CIPHER_TEXT = nKZQD6RKk9ozeGV5WOMVL9TDZTgg9mOZjDpBDqIocR8OGC+WcB4xAwDx7XTaJNv9v+Y3sEzNphtET6sXxBd0e/0Oh6g2d0LrKls2BFHGbaMynEVW2xy4xLP40se55zdawVLGImSxgiBtf9unfIJYN4EpdPlMiiB2TuvyEoUUtqQ=

MY_VI = jqn76XOl4To=
    
por Michael 24.12.2016 / 08:06

1 resposta

3

Conhecer o algoritmo RC2 não é suficiente; você também precisa combinar o modo de operação e para alguns modos de esquema de preenchimento. A linha de comando OpenSSL (e também a maior parte da API EVP) é padronizada para o modo CBC e o preenchimento "PKCS5" (tecnicamente PKCS7), que pode ou não estar correto.

openssl enc por padrão é a criptografia e decriptografia baseada em senha , que significa a chave real e IV (exceto ECB, que não tem IV) usada para o cifra é derivada por um processo de hash chamado Função de derivação de chave baseada em senha (PBKDF) - e uma não padronizada para inicializar; qualquer argumento que você der como -iv é ignorado - o que é bom porque o argumento que você deu é inválido, veja abaixo. O OpenSSL PBKDF (como outros melhores) usa um 'salt' aleatório que deve ser armazenado em um formato específico do OpenSSL no início do texto cifrado, e a falta desse salt está causando sua mensagem de erro bad magic number . Para obter mais detalhes, consulte link .

Como você tem a chave, NÃO uma senha e o IV, converta os dois em hex (não em base64) e use:

 openssl enc -base64 -d -rc2[-mode] -K $key_in_hex -iv $iv_in_hex
 # note that's -K uppercase not -k lowercase 
 # you can use -a as a synonym for -base64 
 # For a block mode like CBC if standard PKCS5/7 padding wasn't used
 # add -nopad and handle the last few bytes manually as needed.
 # If your input is more than 76 chars per line (as your Q showed) 
 # and OpenSSL version before 1.1.0 you also need -A (uppercase).

Existem muitas maneiras de converter base64 para hexadecimal, mas uma conveniente é:

 somevar=$( echo some_base64 | openssl base64 -d | xxd -p )
 # xxd -p outputs only the hex with no labels or ASCII etc
 # and thus is suitable as an argument to openssl enc 
 # without any processing by tools like sed, tr, awk 
    
por 25.12.2016 / 00:40