2010-03-29 4 views
0

Je suis actuellement confronté à une erreur appelée Bad Base64Coder input character at ...
Voici mon code en java.Erreur: caractère d'entrée Bad Base64Coder

String nonce2 = strNONCE; 
byte[] nonceBytes1 = Base64Coder.decode(nonce2);          
System.out.println("nonceByte1 value : " + nonceBytes1); 

Le problème est maintenant je Bad Base64Coder input character erreur et la valeur nonceBytes1 est imprimée comme nulle. J'essaie de décoder le nonce2 de Base64Coder. Ma valeur strNONCE est 16

/** Generating nonce value */ public static String generateNonce() { try { byte[] nonce = new byte[16]; Random rand; rand = SecureRandom.getInstance ("SHA1PRNG"); rand.nextBytes(nonce); //convert byte array to string. strNONCE = new String(nonce); }catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } return strNONCE; }

+0

Pourquoi êtes-vous base64 codage décodage de la valeur si vous nonce venez de créer vous-même comme un tableau d'octets au hasard? – Thilo

Répondre

1

Il semble tout simplement que vous confondiez des concepts indépendants et que vous soyez tout nouveau dans Java. Base64 est un type de codage qui convertit les tableaux d'octets "illisibles par l'homme" en chaînes "codées" "lues" et inversement (décodage). Il est généralement utilisé pour transférer ou stocker des données binaires en tant que caractères là où cela est strictement nécessaire (en raison du protocole ou du type de stockage).

La chose SecureRandom n'est pas un codeur ou un décodeur. Il renvoie une valeur qui ne doit en aucun cas être associée à un certain cipher ou encoder. Voici quelques extraits des liens avant donnés:

ran·dom
adj.
1. Having no specific pattern, purpose, or objective


Cipher
In cryptography , a cipher (or cypher) is an algorithm for performing encryption or decryption — a series of well-defined steps that can be followed as a procedure.


Encoding
Encoding is the process of transforming information from one format into another. The opposite operation is called decoding .

Je vous recommande vivement aurait d'aligner ces concepts pour vous-même (cliquez sur les liens pour en savoir plus sur eux) et ne pas les jeter dans un grand et même trou. Voici au moins un SSCCE qui montre comment vous pouvez correctement encoder/décoder un tableau d'octets (aléatoire) en utilisant base64 (et comment afficher des tableaux comme chaîne (un format lisible par l'homme)):

package com.stackoverflow.q2535542; 

import java.security.SecureRandom; 
import java.util.Arrays; 

import org.apache.commons.codec.binary.Base64; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     // Generate random bytes and show them. 
     byte[] bytes = new byte[16]; 
     SecureRandom.getInstance("SHA1PRNG").nextBytes(bytes); 
     System.out.println(Arrays.toString(bytes)); 

     // Base64-encode bytes and show them. 
     String base64String = Base64.encodeBase64String(bytes); 
     System.out.println(base64String); 

     // Base64-decode string and show bytes. 
     byte[] decoded = Base64.decodeBase64(base64String); 
     System.out.println(Arrays.toString(decoded)); 
    } 

} 

(en utilisant Commons Codec Base64 par le manière)

Voici un exemple de la sortie:

 
[14, 52, -34, -74, -6, 72, -127, 62, -37, 45, 55, -38, -72, -3, 123, 23] 
DjTetvpIgT7bLTfauP17Fw== 

[14, 52, -34, -74, -6, 72, -127, 62, -37, 45, 55, -38, -72, -3, 123, 23] 
+0

merci beaucoup pour votre aide. Je vais lire les choses pour en savoir plus. –

+0

Merci beaucoup pour votre aide. Honnêtement, je suis assez nouveau pour Java et ces trucs de sécurité informatique. Je suis actuellement en stage dans une société de recherche. Fondamentalement, dans mon projet, j'avais fait la partie de l'envoi de données du client au serveur. Et maintenant c'est à faire côté serveur. Une valeur de nonce est générée et en utilisant cette valeur, je vais calculer les clés. Le côté serveur répondra également cette valeur nonce au côté client. Ensuite, le côté client calcule également les valeurs des clés et essaie de faire correspondre les valeurs après cela. –

+3

Un peu condescendant dans le ton. – RonanOD

2
//convert byte array to string. 
strNONCE = new String(nonce); 

Cela ne va pas travailler. Vous devez l'encoder en base64.

strNONCE = Base64Coder.encode(nonce); 
+0

merci pour la réponse. le deuxième code fonctionne et il est de générer une valeur de nonce. Ce que je veux faire maintenant est de calculer la clé de chiffrement, la clé d'intégrité et la réponse en utilisant cette valeur de nonce. Je suis confronté à un problème dans la première partie du code. Merci. –

+0

le deuxième code ne fonctionne pas, car il crée une chaîne à partir d'octets aléatoires. Ce n'est pas une chaîne valide, et pas codé Base64 (bien, parfois c'est ...) – Thilo

+1

Salut Thilo, merci encore pour votre aide. ci-dessous est la classe pour générer le nonce. et ça marche quand j'appelle la classe.il génère une valeur de nonce. hmm .. –

1

Une chaîne codée base64 ne comporterait que des caractères imprimables. Vous générez strNONCE directement à partir d'octets aléatoires, donc il aura des caractères non-imprimables dedans.

Qu'est-ce que vous essayez de faire exactement?

+0

merci beaucoup pour la réponse, Dave. le second code fonctionne et c'est pour générer une valeur de nonce. ce que je veux faire maintenant utilise cette valeur nonce, je veux obtenir un autre tableau d'octets et le décoder de Base64Coder. à partir de ce que je veux calculer la clé de chiffrement, la clé d'intégrité, etc. cela fait partie de mon projet. =) –

+0

le deuxième code ne fonctionne PAS, car il crée une chaîne à partir d'octets aléatoires. Ce n'est pas une chaîne valide, et pas codé Base64 (bien, parfois c'est ...) – Thilo

Questions connexes