Как я могу mcrypt 128 CFB для Ruby?

Мне нужно обменяться с PHP API, который шифрует запросы и ответы. На моей стороне я в рельсах 4.0.0 (ruby 2.0), и я не могу заставить его работать.

Я прочитал много ответов на эту тему и попытался понять, как работает mcrypt, например. http://www.chilkatsoft.com/p/php_aes.asp, но без успеха. Я до сих пор не могу расшифровать зашифрованный из PHP или зашифровать что-то, что PHP может расшифровать

Не могли бы вы помочь мне, пожалуйста, и посмотреть, что я делаю не так?

Код PHP:

$secretKey = "1234567891234567";
$encrypt = urlencode( base64_encode( mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
md5($secretKey),
$cleartext,
MCRYPT_MODE_CFB,
$secretKey
) ) );

$input = urldecode($input);
$decrypt = mcrypt_decrypt( MCRYPT_RIJNDAEL_128,
md5($secretKey),
base64_decode($input),
MCRYPT_MODE_CFB,
$secretKey );

Рубиновый код:

def self.encode(params = {})
cipher = OpenSSL::Cipher::AES.new(256, :CFB)
cipher.encrypt
cipher.key = Digest::MD5.hexdigest("1234567891234567")
cipher.iv = "1234567891234567"encrypted = cipher.update(params.to_query) + cipher.final

CGI.escape(Base64.strict_encode64(encrypted))
end

def self.decode(answer)
decrypted = Base64.decode64(CGI.unescape(answer))

decipher = OpenSSL::Cipher::AES.new(256, :CFB)
decipher.decrypt
decipher.key = Digest::MD5.hexdigest("1234567891234567")
decipher.iv = "1234567891234567"decoded = decipher.update(decrypted) + decipher.final
end

5

Решение

Вы должны использовать 'ncfb' вместо MCRYPT_MODE_CFB в коде PHP. По умолчанию в PHP используется 8-битная обратная связь вместо обратной связи полного размера блока.

В качестве альтернативы вы можете указать :CFB8 быть совместимым с PHP в Ruby. Это я догадался после прочтения документации для CFB в документации OpenSSL.

Большое спасибо это Q / A по информационной безопасности который я нашел только потому, что знал, что искал.

5

Другие решения

Взгляни на https://github.com/kingpong/ruby-mcrypt

в вашем драгоценном файле добавить

gem "ruby-mcrypt", :lib => "mcrypt"

использование

crypto = Mcrypt.new(:twofish, :cbc, MY_KEY, MY_IV, :pkcs)

# encryption and decryption in one step
ciphertext = crypto.encrypt(plaintext)
plaintext  = crypto.decrypt(ciphertext)

# encrypt in smaller steps
while chunk = $stdin.read(4096)
$stdout << crypto.encrypt_more(chunk)
end
$stdout << crypto.encrypt_finish

# or decrypt:
while chunk = $stdin.read(4096)
$stdout << crypto.decrypt_more(chunk)
end
$stdout << crypto.decrypt_finish

Вы также можете проверить https://stackoverflow.com/a/21489711/1380867

1