开发者

Error: Bad Base64Coder input character

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


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


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]


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?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜