2016-08-31 2 views
1

Ich versuche, einige Daten zu entschlüsseln, die ich von einer API abholen und einige seltsame Fehler bekommen.NoMethodError beim Versuch, Daten mit Blowfish zu entschlüsseln

Einige Hintergrund

Die Daten Ich Abrufen wurde mit Blowfish verschlüsselt und dann in eine Base64-String codiert und hergestellt in einem JSON-String zur Verfügung. Hier ist ein Beispiel von dem, was der JSON-String sieht aus wie

{"payload":"BR0UzF38W4oVB7fjP6WgClqdaMKIYTl661mpneqoXQYIYkBQvjlMQZ+yn...."} 

In meinem Ruby-Skript Ich mache folgende:

require 'crypt/blowfish' 
require 'base64' 

# get json data 
response = Net::HTTP.get(URI('http://www.url-to-json.com')) 
results = JSON.parse(response) 

# decode the base64 results 
decoded = Base64.decode64(results['payload']) 

# setup blowfish object with key 
blowfish = Crypt::Blowfish.new('my_secret_key') 

# decrypt the data 
puts blowfish.decrypt_string(decoded) 

und das ist der Fehler, der zurückgegeben wird:

/Users/Ken/.rvm/gems/[email protected]/gems/crypt-2.2.1/lib/crypt/stringxor.rb:4:in `^': undefined method `b' for "java.uti":String (NoMethodError) 
    from /Users/Ken/.rvm/gems/[email protected]/gems/crypt-2.2.1/lib/crypt/cbc.rb:62:in `decrypt_stream' 
    from /Users/Ken/.rvm/gems/[email protected]/gems/crypt-2.2.1/lib/crypt/cbc.rb:115:in `decrypt_string' 
    from /Users/Ken/Code/vs/scripts/test.rb:55:in `run' 
    from init.rb:43:in `<main>' 

Haben Sie einen Einblick, was diesen Fehler verursachen könnte? Ich habe es seit Stunden getestet und kann anscheinend keine Fortschritte machen. Meine beste Vermutung ist, dass es ein Codierungsproblem ist, aber wenn ich die Kodierung erzwinge mit force_encoding() bekomme ich die gleichen Fehler.

Und falls Sie sich wundern, bin ich in Ruby Version 1.9.3-P327 für diese App gesperrt.

Vielen Dank im Voraus für jede Hilfe!

+0

Sieht aus wie ein Fehler in Crypt-Juwel für mich, kann aber nicht bestätigen. Funktioniert es, wenn Sie handgemachte Daten zur Verfügung stellen? – Felix

Antwort

3

Der Schuldige ist diese b Methode. Es wurde in Ruby 2.0 eingeführt. Wie Sie in der Dokumentation sehen können, gibt es eine Kopie einer Zeichenfolge mit ASCII-8BIT-Codierung zurück. Sie können entweder die Ruby-Version oder die affe-patch-String-Klasse aktualisieren, um diese Methode hinzuzufügen. Es ist normalerweise in C implementiert, aber ich denke, diese Ruby-Implementierung wird auch funktionieren:

+0

Das hat funktioniert! Vielen Dank! – Ken

Verwandte Themen