Итак, у меня на работе есть приложение, которое шифрует строку с помощью ColdFusion. Встроенные помощники шифрования ColdFusion делают это довольно просто:
encrypt('string_to_encrypt','key','AES','HEX')
Я пытаюсь использовать Ruby для создания той же зашифрованной строки, что и этот скрипт ColdFusion. К сожалению, шифрование является наиболее запутанным предметом информатики, известным человеку.
Я нашел пару вспомогательных методов, которые используют библиотеку openssl и дают вам действительно простой метод шифрования / дешифрования. Вот результирующая строка:
"\370\354D\020\357A\227\377\261G\333\314\204\361\277\250"
Что выглядит для меня в юникоде. Я пробовал несколько библиотек, чтобы преобразовать это в hex, но все они говорят, что он содержит недопустимые символы. Попытка распаковать это приводит к этому:
string = "\370\354D\020\357A\227\377\261G\333\314\204\361\277\250"
string.unpack('U')
ArgumentError: malformed UTF-8 character
from (irb):19:in `unpack'
from (irb):19
В конце дня это должно выглядеть примерно так (вывод метода шифрования ColdFusion):
F8E91A689565ED24541D2A0109F201EF
Конечно, это предполагает, что все дополнения, векторы инициализации, соли, типы шифров и миллион других возможных различий все выстраиваются в линию.
Вот простой скрипт, который я использую для шифрования / дешифрования:
def aes(m,k,t)
(aes = OpenSSL::Cipher::Cipher.new('aes-256-cbc').send(m)).key = Digest::SHA256.digest(k)
aes.update(t) << aes.final
end
def encrypt(key, text)
aes(:encrypt, key, text)
end
def decrypt(key, text)
aes(:decrypt, key, text)
end
Любая помощь? Может быть, простой вариант, который я могу передать OpenSSL :: Cipher :: Cipher, который скажет ему закодировать шестнадцатеричную финальную строку?