Я использую довольно простой скрипт 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
@tadman исправил :)
Вы используете другой, случайный IV для расшифровки. Это значение должно быть идентичным. То есть вы захватываете его при шифровании:
iv = cipher.random_iv
Затем вы расшифровываете, используя это:
cipher.iv = iv
Тогда он правильно расшифровывается. Вам нужна та же пара ключ + IV, чтобы расшифровка прошла успешно.
Но разве не в этом весь смысл? Полагаться на секрет/ключ, а не на IV?
Ключ определяется пользователем (например, парольная фраза), но IV генерируется или определяется заранее. Оба необходимы для разблокировки контента. Вы всегда можете жестко закодировать конкретный IV, если хотите, или сгенерировать его случайным образом и сохранить вместе с ключом. Обратите внимание, что жесткое кодирование IV может подвергнуть вас большему риску с точки зрения безопасности, но если ставки невелики, это не имеет большого значения. Это просто облегчает угадывание вашей парольной фразы, так как с фиксированным IV вам не нужно проверять все возможные IV.
Здесь невероятное количество пробелов в конце каждой строки. Несколько было бы понятно, но там свыше 190!