2010-12-04 15 views
3

Ich habe ein SecretkeySpec-Objekt erstellt, das einen 128-Bit-Schlüssel enthält. Ich möchte diesen Schlüssel in einem String haben (diese Zeichenfolge muss später wieder in den ursprünglichen Schlüssel eingefügt werden), also verwende ich Base64-Codierung.JAVA: 128-Bit-Schlüssel zu String-Problem und zurück

Dies ist, wie meine Schlüssel aus dem Byte-Array in Zeichen im Rohformat aussehen:

*P??? ?ukL|?~ 

Also nehme ich das Bytes und es so codieren.

byte[] okay = Base64.encode(eF.getSpec().getEncoded()); 

Jetzt, als ich es in Zeichen übersetze i erhalten:

S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo= 

Jetzt mag ich meinen Schlüssel wieder restauriert haben, um es von dem Base64 codiert Array ursprüngliches Format ist.

String dkey = "S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo="; 

byte[] key = null; 
key = dKey.getBytes(); 
key = Base64.decode(key); 

Jetzt, als ich das Ergebnis überprüfen i erhalten:

DKlDkp+kJ9nUFa0wZHyFfg== 

statt:

*P??? ?ukL|?~ 

Wie Sie sehen dies ist nicht das Ergebnis, das ich zu sehen hoffte. Ich habe sicherlich einen Anfängerfehler gemacht, und vergib mir dafür, aber ich bin relativ neu im Programmieren. Ich würde es schätzen, wenn mir jemand ein funktionierendes Beispiel geben könnte, den den 128-Bit-Schlüssel zu und von lesbarem Format zu transformieren, und vielleicht eine Erklärung, wo ich falsch mit dem Denken ging.

Und ich entschuldige mich für Rechtschreibfehler, Englisch ist nicht meine Muttersprache.

Vielen Dank im Voraus

+0

Was 'Base64' Klasse verwenden Sie? Ist es von der Apache Codec-Bibliothek? –

+0

Was macht 'eF.getSpec(). GetEncoded()'? Ich sehe keinen ähnlichen Anruf im Decodierungsteil. – casablanca

+0

@casablanca: Ich * nehme an * es ist die ['getEncoded()' Methode der 'SecretKeySpec' Klasse] (http://download.oracle.com/javase/1.4.2/docs/api/javax/crypto/spec /SecretKeySpec.html#getEncoded%28%29). Wenn das der Fall ist, sollte es einfach die rohen Bytes zurückgeben, die den Schlüssel darstellen. –

Antwort

2
S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo= 

decodiert

KlDkp+kJ9nUFa0wZDHyFfg==. 

Sind die zusätzlichen D am Anfang einer Kopie und Paste-Fehler?

KlDkp+kJ9nUFa0wZDHyFfg== 

wiederum ist eine gültige Base64-Zeichenfolge, die zu einigen Binärdaten dekodiert. Es scheint also, dass Sie die Codierung zweimal durchführen.

Jetzt, als ich es in Zeichen übersetzen i bekommen

Wie genau tun Sie das?Gibt es eine andere Base64-Codierung in diesem Schritt beteiligt?

+0

Ich überprüfe es mit einer for-Schleife: String stringkey = ""; \t \t \t \t \t \t \t für (byte forbyte: key) { \t \t \t \t \t \t \t \t char forchar = (char) forbyte; \t \t \t \t \t \t \t \t \t stringkey + = forchar; \t \t \t \t \t \t \t \t} \t \t \t \t \t \t \t System.out.printin (stringkey); Ich überprüfe meinen Code zweimal, es gibt nur 1 Anruf zu Base64.encode und nur 1 Anruf zu Base64.decode. und das scheint tatsächlich ein Tippfehler zu sein. – Rohan

+0

@Rohan: Vielleicht sollten Sie Ihre Frage bearbeiten, um * alle * relevanten Code einzuschließen. –

+0

tatsächlich entschlüsselt seine K1Dk etc zu etwas, das wie der ursprüngliche Schlüssel aussieht, der mit (* P) ​​beginnt. Kann Rohan prüfen, was aus 'eF.getSpec() kommt. getEncoded()'? – lijie

0

Sie haben einige Fehler im Code (vorausgesetzt, Sie es von der Spitze des Kopfes schrieb). Dies sieht wie eine funktionierende Version aus. Beachten Sie, dass die Verwendung dieser internen Klassen nicht sehr clever ist (hier würde ich zum Beispiel die Apache Commons Codecs-Bibliothek und ihre org.apache.commons.codec.binary.Base64-Klasse bevorzugen).

package edu.sasik.test.encoding; 

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; 

public class TestBase64 { 

    public static void main(String[] args) { 
    String base64Str = Base64.encode("Hello World!".getBytes()); 
    System.out.println(base64Str); 
    byte[] bytes = Base64.decode(base64Str); 
    System.out.println(new String(bytes)); 
    } 

} 

Ausgang:

 
SGVsbG8gV29ybGQh 
Hello World! 

Hoffnung, das hilft.

+0

Hallo Jiri, Danke für die Antwort, aber mein Fall ein bisschen anders als das, da ich einen 128-Bit-Schlüssel habe, der in ein lesbares Format übersetzt werden muss. so kodiere ich es tatsächlich, wie ich oben sagte (byte [] okay = Base64.encode (eF.getSpec(). getEncoded());) eF.getSpec(). getEncoded() ist in der Tat der Schlüssel, tut mir leid, dass unklar zu sein dieser Teil. aber wenn ich es entziffere, ist das Ergebnis nicht dasselbe wie meine Eingabe. – Rohan

Verwandte Themen