Шифрование AES в ColdFusion, расшифровка в ruby

Мы не можем для жизни из нас понять это. Нам нужно заставить ColdFusion шифровать данные, которые Ruby расшифрует. Мы перепробовали так много разных настроек на стороне ColdFusion, просмотрели сообщения SO, просмотрели документы Adobe и не смогли заставить их работать. ColdFusion необходимо зашифровать его, чтобы ruby ​​мог сделать это:

aes = OpenSSL::Cipher::Cipher.new('aes-256-cbc').encrypt
aes.key = Digest::MD5.hexdigest("#{password}#{salt}")
aes.iv = Digest::MD5.hexdigest("#{salt}#{password}")[0,16]
encrypted = aes.update(data) + aes.final

Псевдокод ColdFusion

key = tobase64(binaryDecode(lcase(hash(password & salt, "md5")), "hex"))
iv = lcase(left(hash(salt & password, "md5"), 16))
encrypt(data, key, "AES/CBC/PKCS5Padding", "Base64", iv)

Пробовал с/без tobase64/binaryDecode (видел, что кто-то упомянул, что он будет обрабатывать обратное преобразование внутри или что-то глупое). lcase заключается в том, чтобы заставить его генерировать MD5, похожие на то, что строит ruby.

Что мы делаем не так? Бесконечные bad decrypt на рубиновой стороне


person Daniel Huckstep    schedule 10.11.2011    source источник
comment
Что вы делаете неправильно? Я не знаю. Было бы полезно, если бы вы описали проблемы, которые у вас возникли (вы знаете, сообщения об ошибках и все такое...).   -  person Marnen Laibow-Koser    schedule 10.11.2011
comment
Не хочу показаться саркастическим, но вы сначала сравнивали основы? Исходный ввод такой же: хешированные значения, iv, ключ? Кроме того, вы установили файлы политики неограниченной прочности? kb2.adobe.com/cps/546/e546373d.html   -  person Leigh    schedule 11.11.2011


Ответы (1)


Что мы делаем не так?

Вы невнимательны к кодировкам.

Вы должны учитывать кодировку.

В ColdFusion вы должны использовать только массив байтов в качестве ключа или IV, и вы должны шифровать только массивы байтов.

Не работайте с ключами, IV или открытыми текстами в любой другой форме, кроме массива байтов. Не рассматривайте их как строки в кодировке base64, строки UTF-16 (что Java делает по умолчанию) или любые другие формы. Вы всегда должны иметь дело только с массивами байтов, и вы всегда должны знать кодировку и использовать одну и ту же кодировку между ColdFusion и Ruby.

Вы можете получить массив байтов из строки, используя кодировку. Я бы предпочел использовать кодировку UTF-8. Посмотрите на функции CharsetEncode и CharsetDecode.

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

person yfeldblum    schedule 10.11.2011
comment
Я значительно упростил процесс для вопроса, но как только мы заработаем в простом случае, мы сможем улучшить обработку IV/ключа. Первоначально я хотел использовать метод ruby ​​pkcs5_keyivgen для обработки генерации ключа / iv из пароля, но ColdFusion действительно не понравится (если вы тоже не понимаете этого). - person Daniel Huckstep; 11.11.2011
comment
Re: вы должны использовать только массив байтов в качестве ключа или IV Нет, с encrypt(data, ..) все аргументы являются строками, кроме iv и iterations, а аргумент data интерпретируется как UTF-8. С encryptBinary() data может быть массивом байтов. Но я согласен, что использование одной и той же кодировки/кодировки имеет решающее значение. - person Leigh; 11.11.2011
comment
Ли, тогда это аргумент против использования функции encrypt. То, что я сделал раньше, — это перейти к классам javax.crypto из кода ColdFusion и выполнить шифрование массивов байтов с использованием этих классов. Это несложно, вы получаете гораздо лучший контроль, и намного проще выполнять шифрование правильно и функционально. - person yfeldblum; 11.11.2011
comment
Справедливость - Да, я использовал оба и согласен, что javax.crypto предлагает больше контроля. Но я думаю, что суть в том, чтобы понять требования инструмента, который вы используете. Если вы не позаботитесь о кодировке/кодировке, ни одна из опций не будет работать должным образом;) - person Leigh; 11.11.2011
comment
Лейт - правильно. Но javax.crypto заставляет вас давать ему байтовые массивы, а это значит, что вам приходится иметь дело с кодировками, а это значит, что вы должны понимать, что кодировки — это большая проблема при работе с переносимым шифрованием текста. Вы должны понимать требования инструмента, который вы используете. И javax.crypto заставляет вас понимать требования. - person yfeldblum; 11.11.2011
comment
Справедливость – Да, я согласен, это заставляет вас лучше осознавать это. Но когда я впервые использовал его, я тоже делал подобные ошибки;) Так что все, что я предлагал, это попытаться узнать инструмент, который вы используете, будь то encrypt или javax.crypto. Тогда вы сможете успешно использовать любой из них. - person Leigh; 12.11.2011