tags:

views:

148

answers:

3

I am currently facing an error called Bad Base64Coder input character at ...
Here is my code in java.

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

The problem now is I get Bad Base64Coder input character error and the nonceBytes1 value is printed as null. I am trying to decode the nonce2 from Base64Coder. My strNONCE value is 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; }

+1  A: 
//convert byte array to string.
strNONCE = new String(nonce); 

That is not going to work. You need to base64 encode it.

strNONCE = Base64Coder.encode(nonce);
Thilo
thanks for the reply.the seconde code is working and it is to generate a nonce value.what i want to do now is to compute cipher key, integrity key and response using that nonce value. i am facing problem in first part of the code. thanks.
sebby_zml
the second code is NOT working, because it creates a String from random bytes. That is not a valid String, and not Base64 encoded (well, sometimes it is...)
Thilo
Hi Thilo, thanks again for your help. below is the class to generate the nonce. and it is working when i call the class. it does generate a nonce value. hmm..
sebby_zml
A: 

A base64 encoded string would only have printable characters in it. You're generating strNONCE directly from random bytes, so it will have non-printable characters in it.

What exactly is it you're trying to do?

dave
thanks a lot for the reply, dave. the seconde code is working and it is to generate a nonce value. what i want to do now is using that nonce value, i want to get another byte array and decode it from Base64Coder. from that i want compute cipher key, integrity key etc.it's part of my project. =)
sebby_zml
the second code is NOT working, because it creates a String from random bytes. That is not a valid String, and not Base64 encoded (well, sometimes it is...)
Thilo
A: 

It simply look like you're confusing some independent concepts and are pretty new to Java as well. Base64 is a type of encoding which converts "human unreadable" byte arrays into "human readable" strings (encoding) and the other way round (decoding). It is usually used to transfer or store binary data as characters there where it is strictly been required (due to the protocol or the storage type).

The SecureRandom thing is not an encoder or decoder. It returns a random value which is in no way to be corelated with a certain cipher or encoder. Here are some extracts from the before given links:

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.

I'd strongly recommend you to align those concepts out for yourself (click the links to learn more about them) and not to throw them in one big and same hole. Here's at least an SSCCE which shows how you can properly encode/decode a (random) byte array using base64 (and how to show arrays as string (a human readable format)):

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

}

(using Commons Codec Base64 by the way)

Here's an example of the output:

[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]
BalusC
thank you so much for your help. i'll read though the stuffs to understand more on it.
sebby_zml
Thanks a lot for your kind help. Honestly, I am pretty new to java and these cyber security stuffs. I am currently doing internship in a research company. Basically, in my project, I had done the part of sending datas from client to server. And now it is to do server side. A nonce value is generated and using that value, I'll compute the keys.The server side will response that nonce value to client side as well. Then client side will also compute keys' values and try to match the values after that.
sebby_zml