2016-03-25 16 views
2

Ich habe eine sehr grundlegende Verschlüsselungsmodul geschrieben, dass ich einige Werte in einer .yaml Datei zu verschlüsseln verwenden.Warum kommt die Verschlüsselungsmodul unterschiedliche Werte, wenn im in jruby zurückkehrt statt Rubin

require 'OpenSSL' 
require 'Base64' 

cipher = OpenSSL::Cipher::AES.new(256, :CBC) 
cipher.key = ENV['KEY'] 
cipher.iv = ENV['IV'] 
cipher.encrypt 
encrypted = cipher.update(ARGV[0]) + cipher.final 
p Base64.encode64(encrypted).gsub!(/\n/,'') 

Wenn ich den Verschlüssler wie so laufen, bekomme ich einen Wert

rvm use jruby-9.0.5.0  
jruby encryptor.rb 'password' 
4cP7jptj5Z14c2KoXdNf+g== 

Wenn ich den Verschlüssler wie folgt ausführen, ich

rvm use ruby-2.2.0  
ruby encryptor.rb 'password' 
y5ZdDfAGRmK1wQy2e4EOIA== 

Im relativ neuen, einen anderen Wert erhalten Verschlüsselung, also kann dies eine geladene (oder einfache) Frage sein, aber warum gibt mein Modul zwei verschiedene Werte zurück, abhängig davon, welchen Interpreter ich verwende?

EDIT: Der Schlüssel ist 32 Bytes, und ich habe die IV-16 geändert Bytes zu sein, und die Ergebnisse unterscheiden sich immer noch zwischen den Dolmetscher.

BEISPIEL SCHLÜSSEL:

key = 1DR337Z5C5CBD94643L9772F96C546AC 
iv = 2BR367Z5R5CFD949 
+0

@zaph nur hinzugefügt, um sie auf die Frage –

+0

Wie wird die Eingangs Polsterung in jeder behandelt wird ? – zaph

+0

Wenn ich die obigen Eingaben key = "1DR337Z5C5CBD94643L9772F96C546AC", iv = "2BR367Z5R5CFD94: data" "Passwort" mit PKCS # 7 padding erhalte ich: "4cP7jptj5Z14c2KoXdNf + g ==". – zaph

Antwort

4

Mit OpenSSL, wenn Sie cipher.encrypt aufrufen, setzen Sie den Schlüssel und die iv zurück (oder ändern Sie zumindest den internen Zustand des cipher Objekts in irgendeiner Weise). Es ist ein Ruby-Fehler dazu: https://bugs.ruby-lang.org/issues/8720

Die JRuby OpenSSL emulation layer scheint nicht, dieses Verhalten zu haben, und das gleiche Ergebnis, wo Sie den Anruf cipher.encrypt haben.

Die Abhilfe/fix ist der Aufruf cipher.encrypt tritt vor Sie den Schlüssel festgelegt, um sicherzustellen, und iv:

cipher.encrypt 
cipher.key = ENV['KEY'] 
cipher.iv = ENV['IV'] 
+1

Yep, arbeitete wie ein Charme, danke! –

0

Versorgungs voller Länge Werte für den Schlüssel und IV.

Im Falle des Schlüssels benötigen Sie 256-Bit (32-Byte).

Im Falle der IV die Länge der Blockgröße sein muß, die (für AES) ist 16-Byte.

Wenn die Eingänge zu kurz sind, ist es nicht Standard, wie dies zu umgehen und jede Implementierung kann verschiedene Methoden wählen, wie null Polsterung oder einfach nur mit, was auch immer sofort Bytes, die die gelieferten Werten folgen.

+1

Wir haben nicht die tatsächlichen Werte haben, hat er sie aus dem ENV Hash bekommen – DGM

+0

yep, und ich kann bestätigen, dass sowohl der Schlüssel und die iv sind genau die gleiche Länge –

+1

Der Schlüssel und IV sollte nicht gleich lang sein, da Sie sind Verwenden eines 32-Byte-Schlüssels. – zaph