2011-09-30 77 views
4

我有一個安全機制,實現對稱算法RijndaelManaged。我設法找到信息什麼是使用RijndaelManaged對於特定IV的加密數據的最大大小。根據我的計算,它將是128個字節。不過,我需要使用Base64將這128個字節轉換爲字符串。有沒有一種方法可以計算Base64編碼將用於編碼大小爲128的輸入字節數組的字符的最大數量?Base64編碼數據最大尺寸

此致的Pawel

回答

10

絕對 - Base64需要4個字符來表示每3個字節。 (填充用於不是3字節精確倍數的二進制數據。)因此,128個字節總是172個字符。 (解決這個問題的方法是base64在每個字符中代表6位(2 = 64);因此3個字節= 24位= 4個基本64個字符)。

+0

也參考此鏈接。 http://stackoverflow.com/questions/38632955/how-to-get-128-bytes-of-base64-encoded-string-of-172-characters –

+0

@UsmanRana:請不要使用評論來嘗試提請注意其他問題。 –

4

基64編碼字符串將使用每3個字節(或其部分)有4個字符。所以128個字節將是172個基本64個字符。

+0

我得到一個172字符長度的結果字符串,但是當我顯示string.getBytes()。length時,長度也是172.我只需要128字節。 –

+0

@UsmanRana:這可以通過問一個新問題來回答。雖然你很可能沒有正確使用Base64編碼/解碼功能。我不確定在這種情況下'string.getBytes()'是什麼,因爲string沒有這樣的方法。如果你使用的是Encoding.GetBytes,那麼我希望它是相同的。你大概不會使用'Convert.FromBase64String',因爲輸出的長度不一樣。基本上你需要更多的信息,這是可以回答的,評論不是提供這個地方的地方。 – Chris

+0

雖然一旦你問這個問題隨時鏈接到這裏,我會看看。 – Chris

0

如果您需要以編程方式檢查,您可以通過檢查模數來實現。下面是一些psudocode(無特定語言):

 
function base64Inflation (numBytes) 
    minimumBase64Bytes = roundDown(numBytes/3 * 4)  
    modulus = numberOfBytes % 3    // Assuming % is the modulo operator 
    if modulus == 0 
     return minimumBase64Bytes   // Exact fit! No padding required. 
    else 
     return minimumBase64Bytes + 4  // Doesn't quite fit. We need to pad. 

我也實施了同樣的邏輯在golang:

http://play.golang.org/p/JK9XPAle5_

0

的Java

byte[] bytes = new byte[128]; 
int base64Length = bytes.length/3 * 4; // Strictly integer division 
if (bytes.length % 3 != 0) 
{ 
    base64Length += 4; // Extra padding characters will be added 
} 
System.out.println(bytes.length + " bytes will be encoded in " + base64Length + " characters."); 

所以,凡輸入bytes.length == 128,輸出將是base64Length == 172個字符。