Вот команда, которую вам нужно будет ввести, чтобы зашифровать строку foo
в некоторый зашифрованный текст:
echo -n "foo" | openssl enc -e -base64 -rc4 -nosalt -pass pass:secretkey -p
И это возвращает:
key=610A2EE688CDA9E724885E23CD2CFDEE
ryW2
ryW2
это ваш зашифрованный текст в кодировке base64.
Мы добавили -p
, чтобы мы могли видеть ключ, который используется для шифрования.
-p
требуется, потому что OpenSSL использует внутреннюю функцию EVP_BytesToKey
для преобразования парольную фразу для ключа, и для этого не существует эквивалентного Ruby метода. Соответственно, вам придется использовать это значение ключа непосредственно в Ruby при шифровании или дешифровании вместо ключевой фразы.
Расшифровка так же проста:
echo "ryW2" | openssl enc -d -base64 -rc4 -nosalt -pass pass:secretkey
Это возвращает :
foo
Учитывая все это, вот как вы могли бы зашифровать эту строку, используя Ruby, чтобы получить то же значение:
require 'openssl'
require 'base64'
plaintext = 'foo'
cipher = OpenSSL::Cipher.new('rc4')
cipher.encrypt
# Use the key that was generated by EVP_BytesToKey
key = '610A2EE688CDA9E724885E23CD2CFDEE'
# Convert the key to a byte string
key_bytes = key.scan(/../).map { |x| x.hex.chr }.join
cipher.key = key_bytes
ciphertext = cipher.update(plaintext) + cipher.final
base64 = Base64.strict_encode64(ciphertext)
Это возвращает то же значение, что и OpenSSL на командная строка:
ryW2
Расшифровка довольно проста:
decipher = OpenSSL::Cipher.new('rc4')
decipher.decrypt
decipher.key = key_bytes
decrypted = decipher.update(ciphertext) + decipher.final
Это возвращает исходный открытый текст:
foo
В конечном итоге шифрование и дешифрование довольно просты, поскольку пока вы знаете, что EVP_BytesToKey
вернет при заданном pass
. Вы можете узнать больше о EVP_BytesToKey
здесь: