2014-10-15 22 views
5

Ho bisogno di scambiare con un'API PHP che cripta le richieste e le risposte. Dalla mia parte sono in rails 4.0.0 (ruby 2.0) e non riesco a farlo funzionare.Come posso crittografare 128 CFB in Ruby?

Ho letto molte risposte su questo argomento e ho cercato di capire come funziona mcrypt, ad es. http://www.chilkatsoft.com/p/php_aes.asp, ma senza successo. Non riesco ancora a decifrare il codice crittografato da PHP o crittografare qualcosa che il PHP può decodificare

Potrebbe aiutarmi per favore e vedere cosa sto facendo male?

codice PHP: Codice

$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); 

Rubino:

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 
+0

Avete confrontato l'output delle funzioni MD5, soprattutto se sono maiuscole o minuscole (PS se questo risolve il problema, vorrei postare questa risposta come risposta) –

+0

Questo era il mio primo assegno, l'md5, Base64.encode64 e l'urlencode. Ma per la cronaca: mp5 php: fb77fc7f384d0c2bc555701e57a9e589 md5 rubino: fb77fc7f384d0c2bc555701e57a9e589 – Stephanie

+0

Beh, questo mi lascia perplesso. Immagino di poter eseguire solo il debug della risposta, ma questo significa che il mio interprete PHP e Ruby è attivo e funzionante ... già votato. –

risposta

5

Devi usare 'ncfb' invece di MCRYPT_MODE_CFB nel codice PHP. Il valore predefinito di PHP è un feed back a 8 bit invece di un feedback delle dimensioni del blocco completo.

In alternativa è possibile specificare :CFB8 per essere compatibile con PHP in Ruby. Questo ho indovinato dopo aver letto la documentazione per CFB nella documentazione di OpenSSL.

Mille grazie a this Q/A on IT security che ho trovato solo perché sapevo cosa stavo cercando.

+0

'ncfb' - vale a dire la risposta a 128 bit dovrebbe essere preferita. –

+0

Grazie mille !!! Inserisco: CFB8 nel mio codice rubino e funziona perfettamente perché non sono il proprietario del codice PHP. Grazie ancora per il tuo aiuto! – Stephanie

+1

@Stephanie Sono contento che abbia funzionato per te Stephanie. Sì, è per questo che ho modificato la mia risposta, accade abbastanza spesso che una parte è fondamentalmente predefinita e non può essere modificata. –

1

un'occhiata a https://github.com/kingpong/ruby-mcrypt

nel file gemma aggiungere

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

Uso

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 

si può anche verificare https://stackoverflow.com/a/21489711/1380867

+0

Oh, aspetta, ora vedo cosa stai mostrando. Usare 'mcrypt' per Ruby va bene (OpenSSL è meglio gestito, ma suppongo che tu usi' mcrypt' in PHP ...). Ma al momento non indossi la crittografia nella domanda se specifichi padding twofish, CBC e PKCS. –