2012-02-01 1 views
6

私は次のことを理解しようとしています。C#Convert.ToBase64String()は64バイトを渡すときに長さを88にするのはなぜですか?

配列の長さ(バッファ)として64バイトを宣言している場合。私がベース64の文字列に変換すると、長さは88であると言われています。長さは64バイトでなければならないのですか?私はこの実際の仕組みを完全に誤解している可能性があります。もしそうなら、説明してください。

//Generate a cryptographic random number 
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); 

// Create byte array 
byte[] buffer = new byte[64]; 

// Get random bytes 
rng.GetBytes(buffer); 

// This line gives me 88 as a result. 
// Shouldn't it give me 64 as declared above? 
throw new Exception(Convert.ToBase64String(buffer).Length.ToString()); 

// Return a Base64 string representation of the random number 
return Convert.ToBase64String(buffer); 
+4

Btw:単純な値をログに記録するのはひどい方法です... –

+0

私はRGN暗号化を個人的には使用しません。暗号化された強力なRNGは遅くなります---それ以上の計算が必要です---スペクトル的になります白、 – MethodMan

+0

このStackOverFlowを見てくださいRGNを使用するのが安全ではない理由の説明http://stackoverflow.com/questions/4892588/rngcryptoserviceprovider-random-number-review – MethodMan

答えて

8

いいえ、ベース64エンコーディングは、エンコードされるデータの6ビットを表すために全バイトを使用します。失われた2ビットは、シンボルとして英数字、プラスおよびスラッシュのみを使用する価格です(基本的には、ASCIIまたはUTF-8エンコーディングでは表示されない文字または特殊文字以外の数字は除きます)。あなたが得ている結果は、(64 * 4/3)が最も近い4バイト境界に切り上げられます。

6

Base64エンコーディングは、3オクテットを4つのエンコード文字に変換します。したがって、

(64/3)* 4≈(22 * 4)= 88バイトです。

Read here.

2

私は64バイトに渡していますので、長さは、64ではないでしょうか?

いいえ64個のトークンをBase256表記で渡しています。 Base64はトークンごとに情報が少ないため、トークンがさらに必要になります。 88右の音。

関連する問題