Шифрование AES 256 CBC с помощью Ruby с OpenSSL не работает - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь зашифровать данные с помощью библиотеки OpenSSL в Ruby, используя фразу-пароль.Код Ruby выглядит следующим образом:

require('openssl')
require('base64')

cipher = OpenSSL::Cipher.new ('AES-256-CBC')
cipher.encrypt
cipher.iv = iv = cipher.random_iv

pwd = 'topsecret'
salt = OpenSSL::Random.random_bytes 8
iter = 10000
key_len = cipher.key_len
digest = OpenSSL::Digest::SHA256.new

key = OpenSSL::PKCS5.pbkdf2_hmac(pwd, salt, iter, key_len, digest)
cipher.key = key

puts "salt=#{salt.unpack('H*')[0]}"
puts "key=#{key.unpack('H*')[0]}"
puts "iv=#{iv.unpack('H*')[0]}"

encrypted = cipher.update 'my data to encrypt'
encrypted << cipher.final

puts "encrypted=#{Base64.strict_encode64(encrypted)}"

# it returns:
# salt=1332e5603cbc018a
# key=11a168cf01556a5ee3e22e049f0e65d3adcd75f39e32c7d19aec32a0ccb40d93
# iv=35a08f2d3e719abbee78a0f4fe47c938
# encrypted=E3Ag6cRL2R+xytgw01i6tKSFpV7s7bKoiiWvPA1FYxM=

К сожалению, когда я пытаюсь расшифровать это, я получаю ошибку bad magic number:

$ echo "E3Ag6cRL2R+xytgw01i6tKSFpV7s7bKoiiWvPA1FYxM=" | openssl enc -aes-256-cbc -base64 -d -p -pass pass:topsecret
bad magic number

Однако, когда я пытаюсь это выполнить в терминале, запустивКоманда openssl enc, она работает:

$ echo 'my data' | openssl enc -aes-256-cbc -base64 -p -pass pass:topsecret                            
salt=8135837A305553F2
key=8B4373ABD786BAC107F4112640E95E920C77C017FCEC18E1BD919CED42F0298E
iv =910637CE50FADF27D944B7A8DD239E6D
U2FsdGVkX1+BNYN6MFVT8oWa5P/oxZFwzMk1DRCSSGg=

$ echo "U2FsdGVkX1+BNYN6MFVT8oWa5P/oxZFwzMk1DRCSSGg=" | openssl enc - aes-256-cbc -d -p -base64 -pass pass:topsecret
salt=8135837A305553F2
key=8B4373ABD786BAC107F4112640E95E920C77C017FCEC18E1BD919CED42F0298E
iv =910637CE50FADF27D944B7A8DD239E6D
my data

Я думаю, что перепробовал все возможные комбинации генерации ключа / IV по парольной фразе, но каждый раз получаю ошибку.Кто-нибудь может определить, где проблема с этим способом?Я потратил на это целый день.

...