Расшифровка Ruby OPENSSL AES128 CBC со случайным iv не работает

Я использую довольно простой скрипт Ruby для шифрования/дешифрования, и, похоже, он работает, НО бит дешифрования искажает первые несколько байтов сообщения. Что мне не хватает?

Вот код:

key = OpenSSL::Random.random_bytes(16)
plain_text = "Some important txt we want to encrypt"
cipher = OpenSSL::Cipher::AES128.new(:CBC)
cipher.encrypt
cipher.key = key
cipher.random_iv
cipher_text = cipher.update(plain_text) + cipher.final

cipher = OpenSSL::Cipher::AES128.new(:CBC)
cipher.decrypt
cipher.key = key
cipher.random_iv
decrypted_plain_text = cipher.update(cipher_text) + cipher.final

puts "AES128 in CBC mode"
puts "Plain text: " + plain_text
puts "Cipher text: " + urlsafe_encode64(cipher_text)
puts "Decrypted plain text: " + decrypted_plain_text

И результат:

AES128 in CBC mode Plain text: Some important txt we want to encrypt
Cipher text:
P2fdC7cApQvxHnfxSEfB2iJaueK3xRoj-NN3bDR8JheL_VPFYTDF_RxpLfBwoRfp
Decrypted plain text: �܇�Σ }w�D�A:xt we want to encrypt

Здесь невероятное количество пробелов в конце каждой строки. Несколько было бы понятно, но там свыше 190!

tadman 24.06.2019 21:49

@tadman исправил :)

content01 24.06.2019 21:54
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
0
2
606
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы используете другой, случайный IV для расшифровки. Это значение должно быть идентичным. То есть вы захватываете его при шифровании:

iv = cipher.random_iv

Затем вы расшифровываете, используя это:

cipher.iv = iv

Тогда он правильно расшифровывается. Вам нужна та же пара ключ + IV, чтобы расшифровка прошла успешно.

Но разве не в этом весь смысл? Полагаться на секрет/ключ, а не на IV?

content01 24.06.2019 21:55

Ключ определяется пользователем (например, парольная фраза), но IV генерируется или определяется заранее. Оба необходимы для разблокировки контента. Вы всегда можете жестко закодировать конкретный IV, если хотите, или сгенерировать его случайным образом и сохранить вместе с ключом. Обратите внимание, что жесткое кодирование IV может подвергнуть вас большему риску с точки зрения безопасности, но если ставки невелики, это не имеет большого значения. Это просто облегчает угадывание вашей парольной фразы, так как с фиксированным IV вам не нужно проверять все возможные IV.

tadman 24.06.2019 22:17

Другие вопросы по теме