расшифровывать bash так же, как ruby - PullRequest
0 голосов
/ 16 июня 2020

У меня есть код расшифровки Ruby, и он работает. Но одна из сред, с которой я должен работать, не установлена ​​Ruby (и также не может быть установлена ​​по какой-то причине), поэтому я должен переписать другой язык. Я выбрал bash, потому что он есть почти во всех средах, но скрипт bash вернул digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:crypto/evp/evp_enc.c:603.

Мой Ruby код здесь (расшифровать правильно, хочу работать как он):

require 'openssl'
require 'base64'

class Decryptor
  class << self

    def decryptor
      key = 'somekey' # utf-8
      iv = 'someiv' # utf-8
      OpenSSL::Cipher::AES.new(128, :CBC).yield_self { |d| d.decrypt }.tap { |dc| dc.key = key }.tap { |dcr| dcr.iv = iv }
    end

    def decrypt
      msg = "some_encrypted_message" ## actually base64 encoded
      b64_pass = Base64.decode64(msg)
      dc = decryptor
      cr.password = dc.update(b64_pass) + dc.final
    end
  end
end

Decryptor.decrypt

Мой Bash скрипт ниже:

#!/bin/bash

key = "somekey"
key=$(hexdump -e '"%X"' <<< "$key")
iv = "someiv"
iv=$(hexdump -e '"%X"' <<< "$iv")

msg = "some_encrypted_message" ## actually base64 encoded

echo $msg | openssl aes-128-cbc -d -base64 -K $key -iv $iv 

Ключ ввода и iv в коде Ruby - UTF-8, но в сценарии bash - шестнадцатеричный, так что, возможно, это причина, по которой я не могу расшифровать с помощью bash (потому что, когда я конвертирую их в шестнадцатеричный, как указано выше, каким-то образом он возвращал 33 бит), но я понятия не имею, что мне делать ... Кто-нибудь может мне помочь?

спасибо.

ОБНОВЛЕНИЕ:

Я пробовал передать ключ и iv шестнадцатеричный анализ Ruby скрипту bash, и он может правильно расшифровать сообщение. Поэтому очевидно, что то, как разобрать их на шестнадцатеричный, является причиной, по которой я не могу расшифровать. Код, который я использовал для их разбора по Ruby, приведен ниже:

 'somekey'.unpack('H*').pop.scan(/[0-9a-f]{2}/).join('')

какая разница между приведенным выше и $(hexdump -e '"%X"' <<< "somekey")?

1 Ответ

0 голосов
/ 17 июня 2020

после посещения man-страницы hexdump я обнаружил эту строку формата, которая отображает почти то же значение, что и версия ruby:

$(hexdump -e '8/1 "%02x"' <<< 'somekey') | sed 's/..$//'

Команда sed обрезает последние два символа (0a ) вывода hexdump.

edit: Очевидно, конструкция <<< добавляет новую строку к строке <em>somekey , которая преобразуется в hex с помощью hexdump. Sed был использован здесь для удаления последовательности 0a. Вызов sed можно избежать, подавив новую строку:

$(echo -n 'somekey' | hexdump -e '8/1 "%02x"' )

... давая немного более дешевое решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...