2010-03-29 107 views
0

我目前面臨的一個錯誤稱爲Bad Base64Coder input character at ...
這是我在Java代碼中。錯誤:錯誤Base64Coder輸入字符

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

現在的問題是,我得到Bad Base64Coder input character錯誤和nonceBytes1值打印爲空。我試圖從Base64Coder解碼nonce2。我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; }

+0

爲什麼你的Base64編碼譯碼如果你自己剛剛創建它作爲一個隨機字節數組的現時價值? – Thilo 2010-03-29 03:14:02

回答

1

它只是看起來像你混淆了一些獨立的概念,是相當新到Java爲好。 Base64是一種將「人類不可讀」字節數組轉換爲「人類可讀」字符串(編碼)和其他方式(解碼)的編碼類型。它通常用於將二進制數據作爲字符傳輸或存儲在嚴格要求的地方(由於協議或存儲類型)。

SecureRandom事情不是編碼器或解碼器。它返回的值爲random,與某個cipherencoder沒有任何關係。以下是來自前給予鏈接一部分摘錄:

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 .

我強烈建議您對齊這些概念爲自己(點擊鏈接瞭解更多關於他們),而不是把他們扔在一個大的同一個洞裏。這裏的至少一個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] 
+0

非常感謝你的幫助。我會閱讀,雖然東西瞭解更多。 – 2010-03-29 03:27:52

+0

非常感謝您的善意幫助。坦率地說,我對Java和這些網絡安全產品相當陌生。我目前正在一家研究公司實習。基本上,在我的項目中,我完成了從客戶端到服務器發送數據的部分。現在是做服務器端。生成一個隨機數值並使用該值,我將計算密鑰。 服務器端也將響應那個nonce值給客戶端。然後,客戶端也將計算鍵值,並嘗試匹配之後的值。 – 2010-03-29 03:46:16

+3

有點居高臨下的語氣。 – RonanOD 2015-08-14 14:43:59

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

這是行不通的。你需要base64編碼它。

strNONCE = Base64Coder.encode(nonce); 
+0

感謝您的回覆。 第二代碼正在工作,它將生成一個隨機數值。 我現在要做的是計算密鑰,完整性密鑰和使用該nonce值的響應。我在代碼的第一部分遇到問題。謝謝。 – 2010-03-29 02:57:19

+0

第二個代碼不工作,因爲它從隨機字節創建一個字符串。這不是一個有效的字符串,而不是Base64編碼(好吧,有時它是...) – Thilo 2010-03-29 03:07:25

+1

嗨蒂羅,再次感謝您的幫助。下面是生成隨機數的類。當我打電話給班級時它正在工作。它確實生成一個隨機數值。嗯.. – 2010-03-29 03:14:04

1

A base64編碼的字符串只能有可打印字符。您正在從隨機字節直接生成strNONCE,因此它將包含不可打印的字符。

究竟什麼是你正在試圖做的?

+0

非常感謝答覆,戴夫。 seconde代碼正在工作,它將生成一個隨機數值。我現在想要做的是使用nonce值,我想要獲得另一個字節數組並從Base64Coder解碼它。從那我想要計算密鑰,完整性密鑰等 它是我的項目的一部分。 =) – 2010-03-29 03:01:36

+0

第二個代碼不工作,因爲它從隨機字節創建一個字符串。這不是一個有效的字符串,而不是Base64編碼(好吧,有時它是...) – Thilo 2010-03-29 03:07:09