2010-12-04 87 views
3

J'ai créé un objet SecretkeySpec qui contient une clé de 128 bits. Je voudrais avoir cette clé dans une chaîne (cette chaîne doit être remise dans la clé d'origine plus tard), donc j'utilise l'encodage Base64.JAVA: clé 128 bits vers un problème de chaîne et retour

Voici comment ma clé ressemble au format brut à partir du tableau d'octets en caractères:

*P??? ?ukL|?~ 

donc je prends les octets et codez comme ça.

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

Maintenant, quand je traduis en caractères i get:

S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo= 

Maintenant, je veux avoir ma clé arrière restauré à son format d'origine des base64 tableau codées.

String dkey = "S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo="; 

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

Maintenant, quand je vérifie le résultat que je reçois:

DKlDkp+kJ9nUFa0wZHyFfg== 

au lieu de:

*P??? ?ukL|?~ 

Comme vous pouvez voir ce n'est pas le résultat que j'espérais voir. J'ai sûrement fait une erreur de novice, et pardonnez-moi pour cela mais je suis relativement nouveau à la programmation. J'apprécierais si quelqu'un pourrait me donner un exemple de transformation de la clé de 128 bits vers et depuis un format lisible, et peut-être une explication où j'ai eu tort de penser.

Et je m'excuse pour les fautes d'orthographe, l'anglais n'est pas ma langue maternelle.

Merci à l'avance

+0

Quelle classe 'Base64' utilisez-vous? Est-ce à partir de la bibliothèque Apache Codec? –

+0

Que fait 'eF.getSpec(). GetEncoded()'? Je ne vois pas un appel similaire dans la partie décodage. – casablanca

+0

@casablanca: Je * présume * que c'est la méthode ['getEncoded()' de la classe 'SecretKeySpec'] (http://download.oracle.com/javase/1.4.2/docs/api/javax/crypto/spec /SecretKeySpec.html#getEncoded%28%29). Si c'est le cas, alors il devrait simplement retourner les octets bruts représentant la clé. –

Répondre

2
S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo= 

décodent à

KlDkp+kJ9nUFa0wZDHyFfg==. 

Le D supplémentaire au début une erreur de copier et coller?

KlDkp+kJ9nUFa0wZDHyFfg== 

est à son tour une chaîne base64 valide qui décode certaines données binaires. Donc, il semble que vous faites l'encodage deux fois.

Maintenant, quand je traduis en caractères i get

Comment exactement ce que vous faites ça?Y a-t-il un autre encodage base64 impliqué dans cette étape?

+0

Je le vérifie avec une boucle for: String stringkey = ""; \t \t \t \t \t \t \t pour (octet forbyte: key) { \t \t \t \t \t \t \t \t carbonisation 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.println (stringkey); je vérifie mon code deux fois, il y a seulement 1 appel à Base64.encode et seulement 1 appel à Base64.decode. et cela semble en effet être une faute de frappe. – Rohan

+0

@Rohan: Peut-être que vous devriez éditer votre question pour inclure * tout * code pertinent. –

+0

en effet son K1Dk etc décode à ce qui ressemble à la clé d'origine qui commence par (* P). Est-ce que Rohan peut vérifier ce qui sort de 'eF.getSpec(). getEncoded()'? – lijie

0

Vous avez eu des erreurs dans le code (en supposant que vous avez écrit à partir du haut de votre tête). Cela ressemble à une version de travail. Notez que l'utilisation de ces classes internes n'est pas très intelligente (ici, je préférerais utiliser la librairie Apache Commons Codecs, par exemple et sa classe org.apache.commons.codec.binary.Base64).

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)); 
    } 

} 

Sortie:

 
SGVsbG8gV29ybGQh 
Hello World! 

Hope this helps.

+0

Salut Jiri, Merci pour la réponse mais mon cas un peu différent alors que, comme j'ai une clé de 128 bits qui doit être traduit dans un format lisible. donc en effet je l'ai encodé comme je l'ai dit ci-dessus (octet [] ok = Base64.encode (eF.getSpec(). getEncoded());) eF.getSpec(). getEncoded() est en effet la clé, désolé de ne pas être clair sur cette partie. mais quand je le décode le résultat n'est pas le même que mon entrée. – Rohan