2016-01-18 8 views
5

In unserer Anwendung erhalten wir verschlüsselten Text von externen Server. Dieser Text wurde unter Verwendung von openssl in PHP verschlüsselt.Openssl verschlüsselt in PHP muss in Ruby entschlüsselt werden

Wenn ich versuche, den Text in meinem Ruby-Code zu entschlüsseln, erhalte ich folgende Fehlermeldung:

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

I paar Lösungen auf Stackoverflow gelesen und war empfehlen folgende Zeile in dem Code cipher.padding = 0 hinzuzufügen. Aber nach dem Hinzufügen padding = 0, erhalte ich unterschiedliche Fehler:

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

Im Folgenden meine grobe Skript habe ich geschrieben, um den Code zu entschlüsseln.

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) 

Wenn ich den Text mit Ruby verschlüsseln, dann kann ich es leicht entschlüsseln. Ich habe ein Problem, den Code zu entschlüsseln, die in php verschlüsselt sind. Gibt es eine Möglichkeit, Verschlüsselung und Entschlüsselung zwischen PHP und Ruby kompatibel zu machen?

+0

Sind Sie sicher, dass der PHP-Chiffretext mit denselben Parametern generiert wurde wie Sie? d.h. AES mit einer 128-Bit-Blocklänge im ECB-Modus? – helmbert

+1

Ich kenne Ruby überhaupt nicht, aber es sieht für mich so aus, als ob Sie nach dem entschlüsseln statt vorher base64 dekodieren. – Mike

+0

@helembert Ja, ich bin mir ziemlich sicher, dass der PHP-Code 128 Bit Blocklänge im ECB-Modus verwendet. – Reboot

Antwort

1

Ändern Sie einfach die Art, wie Sie es nennen.

Von decrypted << cipher.final zu decrypted = cipher.update(encrypted) + cipher.final

könnte die Zeichenfolge wie

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

Last, Zitat von Ruby Doc Sie sollten nie ECB-Modus bekommen verwenden, wenn Sie absolut sicher sind, dass Sie unbedingt brauchen

Verwandte Themen