2013-01-11 19 views
8

ENDBEARBEITUNG: Gelöste, Upgrade lokalen dev auf Railo 3.3.4.003 löste das Problem.Unterschiedliche Ausgabe von toBase64() in CFML auf 2 verschiedenen Maschinen


Ich muss RC4 verschlüsseln einige Saiten und sie Base64 codiert, und ich bin in einer Situation ausgeführt wird, wo die gleiche Eingangs verschiedene Ausgänge auf 2 verschiedenen Entwickler-Setups generieren.

Zum Beispiel, wenn ich eine Zeichenfolge [email protected]
Auf einer Maschine (DEV-1) habe, werde ich bekommen: DunU+ucIPz/Z7Ar+HTw=
und auf der anderen Seite (DEV-2) es wird sein: DunU+ucIlZfZ7Ar+HTw=

Zuerst bin ich rc4 verschlüsselt es durch eine function found here. Weiter füttere ich es: toBase64(my_rc4_encrypted_data, "iso-8859-1")

Soweit ich feststellen kann, ist die rc4-Verschlüsselung Ausgabe auf beiden gleich (oder ich vermisse etwas). Unten sind SERVER-Variablen von beiden Maschinen sowie die Verschlüsselungsfunktion.

Ist das etwas, mit dem wir einfach leben müssen oder gibt es etwas, was ich tun kann, um es "richtig zu handhaben" (für das Fehlen eines besseren Wortes). Ich bin besorgt, dass in der Zukunft wird mich das beißen und wundern, dass es abgewendet werden kann.

bearbeiten 1: Output von my_rc4_encrypted_data.getBytes() gibt: DEV-1:

Native Array (byte[]) 
14--23--44--6--25-8-63-63--39--20-10--2-29-60 

DEV-2:

Native Array (byte[]) 
14--23--44--6--25-8-63-63--39--20-10--2-29-60 

(keine Codierung übergeben getBytes())

DEV-1 (entfernt)

server.coldfusion 
productname Railo 
productversion 9,0,0,1 

server.java 
archModel 64 
vendor Sun Microsystems Inc. 
version 1.6.0_26 

server.os 
arch amd64 
archModel 64 
name Windows Server 2008 R2 
version 6.1 

server.railo 
version 3.3.2.002 

server.servlet 
name Resin/4.0.18 

DEV-2 (lokale)

server.coldfusion 
productname  Railo 
productversion 9,0,0,1 

server.java 
vendor Oracle Corporation 
version 1.7.0_01 

server.os 
arch x86 
name Windows 7 
version 6.1 

server.railo 
version 3.2.2.000 

server.servlet 
name Resin/4.0.18 

RC4-Funktion:

function RC4(strPwd,plaintxt) { 
    var sbox = ArrayNew(1); 
    var key = ArrayNew(1); 
    var tempSwap = 0; 
    var a = 0; 
    var b = 0; 
    var intLength = len(strPwd); 
    var temp = 0; 
    var i = 0; 
    var j = 0; 
    var k = 0; 
    var cipherby = 0; 
    var cipher = ""; 

    for(a=0; a lte 255; a=a+1) { 
    key[a + 1] = asc(mid(strPwd,(a MOD intLength)+1,1)); 
    sbox[a + 1] = a; 
    } 

    for(a=0; a lte 255; a=a+1) { 
    b = (b + sbox[a + 1] + key[a + 1]) Mod 256; 
    tempSwap = sbox[a + 1]; 
    sbox[a + 1] = sbox[b + 1]; 
    sbox[b + 1] = tempSwap;  
    } 

    for(a=1; a lte len(plaintxt); a=a+1) { 
    i = (i + 1) mod 256; 
    j = (j + sbox[i + 1]) Mod 256;  
    temp = sbox[i + 1]; 
    sbox[i + 1] = sbox[j + 1]; 
    sbox[j + 1] = temp; 
    k = sbox[((sbox[i + 1] + sbox[j + 1]) mod 256) + 1];  
    cipherby = BitXor(asc(mid(plaintxt, a, 1)), k); 
    cipher = cipher & chr(cipherby);  
    } 
    return cipher; 
} 
+1

Nur um zu testen, können Sie sie beide auf die gleiche JVM-Version ausführen, und sehen, ob das einen Unterschied macht. Es ist eine einfache Variable zu eliminieren. Als nächstes wäre es, die gleiche Version von Railo anzuprobieren, falls es einen Unterschied gibt. –

+0

Scheint seltsam. Die RC4-Funktion sollte bei gleicher Eingabe die gleiche Ausgabe liefern. Ich würde versuchen Base64 für etwas Einfaches auf beiden Rechnern zu kodieren. Ich sehe, Sie haben unterschiedliche Architekturen und Base64 codiert die binäre Darstellung in eine Zeichenfolge, so dass ich nicht weiß, ob das einen Unterschied verursachen könnte. –

+0

Macht Sinn, aber das ist leider außerhalb meiner "Zuständigkeit". Das Beste, was ich tun kann, ist die "Befehlskette". – vector

Antwort

2

Leigh schrieb:

aber sicher sein, die gleiche Codierung in Ihrem Test dh String.getBytes (Codierung) (Bearbeiten) verwenden Wenn Sie es weglassen, die Jvm Standard ist verwendet.

Leigh ist richtig - RAILO-1393 in einem change zu toBase64 führte im Zusammenhang Codierungen in 3.3.0.017 charset, die zwischen den 3.3.2.002 und 3.2.2.000 Versionen Sie verwenden.

0

Soweit ich die RC4-Verschlüsselung Ausgang sagen kann, ist die gleiche auf beiden (oder ich vermisse etwas). Im Folgenden sind SERVER-Variablen von beiden Maschinen sowie die Verschlüsselungsfunktion.

Ich würde empfehlen, die Ausgabe in zwei Dateien zu speichern und dann die Dateigröße oder, noch besser, ein Dateivergleichswerkzeug zu vergleichen. Base64-Codierung ist ein Standardansatz zum Konvertieren von Binärdaten in Zeichenfolgedaten.

Unter der Annahme, dass Ihre Binärdateien genau zu 100% identisch sind, versuchen Sie auf beiden Servern, die Daten in Base 64 und dann wieder in den Binärcode zu konvertieren. Ich würde voraussagen, dass nur einer (oder keiner) der Server die Daten wieder in Binärdaten konvertieren kann. An diesem Punkt sollten Sie einen Hinweis darauf haben, welcher Server Ihr Problem verursacht, und sich weiter einarbeiten.

Wenn beide die Base 64 Daten in binäre umkehren können und die Binärdatei auf beiden Servern korrekt ist ... nun, ich bin mir nicht sicher.