У меня есть код расшифровки 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")
?