2014-10-15 19 views
5

Potrzebuję wymiany z PHP API, który kryptuje żądania i odpowiedzi. Po mojej stronie jestem w szynach 4.0.0 (ruby 2.0) i nie mogę sprawić, żeby to działało.Jak mogę zaimportować 128 CFB do Ruby?

Przeczytałem wiele odpowiedzi na ten temat i próbowałem zrozumieć, jak działa mcrypt, np. http://www.chilkatsoft.com/p/php_aes.asp, ale bez powodzenia. Nadal nie mogę odszyfrować zaszyfrowanych z PHP ani zaszyfrować czegoś, co PHP może odszyfrować

Czy możesz mi pomóc i zobaczyć, co robię źle?

kod PHP: Kod

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

Ruby:

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

Czy porównywałeś wyjściowe funkcje MD5, szczególnie jeśli są one wielkie lub małe (PS, jeśli rozwiąże to problem, który chciałbym opublikować jako odpowiedź)? –

+0

To były moje pierwsze sprawdzenia, md5, Base64.encode64 i kod urlenkowy. Ale dla zapisu: md5 php: fb77fc7f384d0c2bc555701e57a9e589 md5 ruby: fb77fc7f384d0c2bc555701e57a9e589 – Stephanie

+0

Cóż, to zostawia mnie zaskoczonego. Myślę, że mogę tylko debugować odpowiedź, ale to oznacza upewnienie się, że mój interpreter PHP i Ruby działa poprawnie ... już głosowałem. –

Odpowiedz

5

Musisz użyć 'ncfb' zamiast MCRYPT_MODE_CFB w kodzie PHP. Domyślnie PHP przyjmuje 8-bitowy sygnał zwrotny zamiast sprzężenia zwrotnego pełnego rozmiaru bloku.

Alternatywnie można określić, że :CFB8 jest kompatybilny z PHP w Ruby. Ten zgadłem po przeczytaniu dokumentacji CFB w dokumentacji OpenSSL.

Wielkie dzięki dla this Q/A on IT security, które znalazłem tylko dlatego, że wiedziałem, czego szukałem.

+0

'ncfb' - preferowane jest 128-bitowe sprzężenie zwrotne. –

+0

Dziękuję bardzo! Umieszczam: CFB8 w moim kodzie ruby ​​i działa idealnie, ponieważ nie jestem właścicielem kodu PHP. Jeszcze raz dziękuję za pomoc w tej sprawie! – Stephanie

+1

@Stephanie Cieszę się, że udało ci się, Stephanie. Tak, dlatego zredagowałem swoją odpowiedź, zdarza się dość często, że jedna strona jest w zasadzie z góry zdefiniowana i nie można jej zmienić. –

1

przyjrzeć https://github.com/kingpong/ruby-mcrypt

w pliku gem dodać

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

Wykorzystanie

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 

można również sprawdzić https://stackoverflow.com/a/21489711/1380867

+0

O, czekaj, teraz widzę, co pokazujesz. Użycie 'mcrypt' dla Ruby jest w porządku (OpenSSL jest lepiej utrzymywany, ale domyślam się, że używasz' mcrypt' w PHP ...). Ale obecnie nie odpowiadasz kryptografii w pytaniu, jeśli określisz dopełnienie twofish, CBC i PKCS. –

Powiązane problemy