2016-01-18 12 views
5

W naszej aplikacji otrzymujemy zaszyfrowany tekst z zewnętrznego serwera. Ten tekst został zaszyfrowany za pomocą openssl w php.Openssl zaszyfrowane w PHP musi zostać odszyfrowane w Ruby

Kiedy próbuję odszyfrować tekst w moim kodu Ruby, otrzymuję następujący komunikat o błędzie:

OpenSSL::Cipher::CipherError: wrong final block length 

Czytałem kilka rozwiązań na StackOverflow i był proponuję dodać poniższy wiersz do kodu cipher.padding = 0. Ale po dodaniu padding = 0, otrzymuję inny błąd:

OpenSSL::Cipher::CipherError: data not multiple of block length 

Poniżej jest mój szorstki skrypt Pisałem do odszyfrowania kodu.

require 'openssl' 
require 'digest/sha1' 
require 'base64' 

encrypted = "VaZYJzn9QVEQIH4fmtA1Cg==" 
key = "my_secret_key" 

cipher = OpenSSL::Cipher::Cipher.new("aes-128-ecb") 

cipher.decrypt 
cipher.padding = 0 

cipher.key = key 

decrypted = cipher.update(encrypted) 
decrypted << cipher.final 
puts Base64.decode64(decrypted) 

Gdybym zaszyfrować tekst używając Ruby to mogę łatwo odszyfrować. Mam problem z odszyfrowaniem kodu, który jest zaszyfrowany w php. Czy jest jakiś sposób, abym mógł sprawić, że szyfrowanie i deszyfrowanie będą kompatybilne między php i Ruby.

+0

Czy jesteś pewien, że tekst zaszyfrowany w PHP został wygenerowany z tymi samymi parametrami, z których korzystasz? tj. AES z 128-bitową długością bloku w trybie ECB? – helmbert

+1

Nie znam ruby, ale wygląda na to, że dekodujesz base64 po odszyfrowaniu zamiast wcześniej. – Mike

+0

@helmbert tak Jestem całkiem pewien, że kod php używa 128 bitowej długości bloku w trybie ECB. – Reboot

Odpowiedz

1

Po prostu zmień sposób, w jaki to robisz.

Od decrypted << cipher.final do decrypted = cipher.update(encrypted) + cipher.final

mógł uzyskać ciąg jak

<GF\x8F\xDC\x91\xE1ew\xB1\x1C\xE8\xF8V\xA0\x99g\x01C\xCDF\xD6\v\x841l\x13\xA6\x9496{

ostatni cytat z Ruby Doc Nigdy nie należy używać trybu EBC, chyba że jesteś absolutnie pewien, że koniecznie musisz go

Powiązane problemy