Ошибка: неправильный ввод символов Base64Coder - PullRequest
0 голосов
/ 29 марта 2010

В настоящее время я сталкиваюсь с ошибкой, которая называется Bad Base64Coder input character at ...
Вот мой код в Java.

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

Проблема в том, что я получаю ошибку Bad Base64Coder input character, а значение nonceBytes1 выводится как ноль. Я пытаюсь декодировать nonce2 из Base64Coder. Мое strNONCE значение равно 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; }

Ответы [ 3 ]

2 голосов
/ 29 марта 2010
//convert byte array to string.
strNONCE = new String(nonce); 

Это не сработает. Вам нужно в base64 его кодировать.

strNONCE = Base64Coder.encode(nonce);
1 голос
/ 29 марта 2010

Похоже, вы путаете некоторые независимые понятия и довольно плохо знакомы с Java. Base64 - это тип кодирования, который преобразует байтовые массивы «нечитаемый человеком» в «читаемые человеком» строки (кодирование) и наоборот (декодирование). Обычно он используется для передачи или хранения двоичных данных в виде символов там, где это строго требуется (из-за протокола или типа хранилища).

SecureRandom не является кодером или декодером. Он возвращает случайное значение, которое никоим образом не может быть связано с определенным шифром или кодером . Вот некоторые выдержки из ранее приведенных ссылок:

RAN · дом
прил.
1. Не имея определенного шаблона, цели или задачи


Cipher
В криптография , шифр (или шифр) алгоритм для выполнения шифрование или дешифрование - серия четко определенных шагов, которые могут быть после процедуры.


Кодирование
Кодирование - это процесс преобразование информации из одного формат в другой. Противоположный операция называется декодирование .

Я настоятельно рекомендую вам выровнять эти понятия для себя (нажмите на ссылки, чтобы узнать о них больше), а не бросать их в одну большую и ту же дыру. Вот, по крайней мере, SSCCE , который показывает, как можно правильно кодировать / декодировать (случайный) байтовый массив с использованием base64 (и как отображать массивы в виде строки (удобочитаемый формат)):

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

}

(используя Commons Codec Base64 кстати)

Вот пример вывода:

[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]
1 голос
/ 29 марта 2010

A base64 закодированная строка будет содержать только печатные символы. Вы генерируете strNONCE непосредственно из случайных байтов, поэтому в нем будут непечатаемые символы.

Что именно вы пытаетесь сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...