Base 64符号化
7043 ワード
オリジナル住所:http://www.cnblogs.com/jfzhu/p/4020097.html
転載は出典を明記してください
(一)Encoding VS.Encryption
コード(Encoding)と暗号化(Encryption)は同じ意味だと思っている人が多い.符号化と暗号化はフォーマットの変換ですが、違いがあります.符号化は開示されており、例えば、以下に説明するBase 64符号化は、誰でも復号することができる.暗号化は逆に、自分や特定の人だけがコンテンツを復号することを望んでいます.
(二)Base 64符号化
Base 64 Encodingは何の役に立ちますか?簡単な例を挙げると、SMTPプロトコル(Simple Mail Transfer Protocol簡単メール転送プロトコル)を使用してメールを送信します.このプロトコルはテキストベースのプロトコルであるため、メールに画像が含まれている場合、画像の格納フォーマットはテキストフォーマットではなくバイナリデータ(binary data)であることがわかり、バイナリのデータをテキストフォーマットに符号化しなければならないので、Base 64 Encodingが役に立ちます.
1.符号化原理
Base 64 Encodingの符号化原理は、3バイトごとに4文字に変換され、各文字が6 bitを占める.
6 bitには64種類の組み合わせがあります.つまり、この符号化には少なくとも64種類の文字が必要です(特殊文字=も後述します).Base 64 Encodingは、AからZ、aからz、0から9、および+および/これらの文字(すなわち[A−Za−z 0−9+/])を使用する.
byte[]{1,2,3}の3バイトのデータをバイナリで表すとします.
00000001 | 00000010 | 00000011
上記の原理によれば、Base 64 Encoding符号化を用いた結果は、
000000 | 010000 | 001000 | 000011
10進数0|16|8|3に変換し、上の表と照らし合わせて符号化されたテキストはAQID
Base 64 Encodingが3バイトごとに4文字に変換した以上、1枚の画像のバイト数が3で割り切れない場合はどうすればいいですか?
残りの1バイトが残っている場合、バイトは同様に4文字に変換されます.最初の6 bitは1文字に変換され、次の2 bitは1文字に変換され(ここでは右に0を追加することに注意)、最後に2つの=文字が追加されます.
4バイトのデータをbyte[]{1,2,3,4}としてバイナリで表すとします.
00000001 | 00000010 | 00000011 | 00000100
上記の原理によれば、Base 64 Encoding符号化を用いた結果は、
000000 | 010000 | 001000 | 000011 | 000001 | 000000
10進法を0|16|8|3|1|0に変換し、上の表と照らし合わせると、符号化されたテキストはAQIDBA==である.
3で割り切れない場合、残りの2バイトは、残りの1バイトと同様に4文字に変換され、最後の文字は=となります.
byte[]{1,2,3,4,5}の5バイトのデータをバイナリで表すとします.
00000001 | 00000010 | 00000011 | 00000100 | 00000101
上記の原理によれば、Base 64 Encoding符号化を用いた結果は、
000000 | 010000 | 001000 | 000011 | 000001 | 000000 | 010100
10進法を0|16|8|3|1|0|20に変換し、上の表と照らし合わせて符号化されたテキストはAQIDBAU=
2.はい.Netでの実装
はい.Netでは、バイナリデータをテキストに符号化するには、public static string ToBase 64 String(byte[]inArray)メソッドを使用することができる.テキストファイルからバイナリデータに変換するには、public static byte[]FromBase 64 String(string s)メソッドを使用します.
次に、上記の例を検証し、3組のデータbyte[]{1,2,3}、byte[]{1,2,3,4}、byte[]{1,2,3,4,5}をそれぞれ符号化し、符号化されたテキストがそれぞれAQID,AQIDBA=,AQIDBAU=であるかどうかを検証する.
出力結果:
Encoded string: AQID, Decoded binary is equal to orignial binary? True Encoded string: AQIDBA==, Decoded binary is equal to orignial binary? True Encoded string: AQIDBAU=, Decoded binary is equal to orignial binary? True
(三)まとめ
本稿では、符号化と暗号化の違い、なぜ符号化を用いるのか、ベース64の符号化の原理を紹介し、最後にベース64 Encodingについても紹介する.Netでの実装.
転載は出典を明記してください
(一)Encoding VS.Encryption
コード(Encoding)と暗号化(Encryption)は同じ意味だと思っている人が多い.符号化と暗号化はフォーマットの変換ですが、違いがあります.符号化は開示されており、例えば、以下に説明するBase 64符号化は、誰でも復号することができる.暗号化は逆に、自分や特定の人だけがコンテンツを復号することを望んでいます.
(二)Base 64符号化
Base 64 Encodingは何の役に立ちますか?簡単な例を挙げると、SMTPプロトコル(Simple Mail Transfer Protocol簡単メール転送プロトコル)を使用してメールを送信します.このプロトコルはテキストベースのプロトコルであるため、メールに画像が含まれている場合、画像の格納フォーマットはテキストフォーマットではなくバイナリデータ(binary data)であることがわかり、バイナリのデータをテキストフォーマットに符号化しなければならないので、Base 64 Encodingが役に立ちます.
1.符号化原理
Base 64 Encodingの符号化原理は、3バイトごとに4文字に変換され、各文字が6 bitを占める.
6 bitには64種類の組み合わせがあります.つまり、この符号化には少なくとも64種類の文字が必要です(特殊文字=も後述します).Base 64 Encodingは、AからZ、aからz、0から9、および+および/これらの文字(すなわち[A−Za−z 0−9+/])を使用する.
byte[]{1,2,3}の3バイトのデータをバイナリで表すとします.
00000001 | 00000010 | 00000011
上記の原理によれば、Base 64 Encoding符号化を用いた結果は、
000000 | 010000 | 001000 | 000011
10進数0|16|8|3に変換し、上の表と照らし合わせて符号化されたテキストはAQID
Base 64 Encodingが3バイトごとに4文字に変換した以上、1枚の画像のバイト数が3で割り切れない場合はどうすればいいですか?
残りの1バイトが残っている場合、バイトは同様に4文字に変換されます.最初の6 bitは1文字に変換され、次の2 bitは1文字に変換され(ここでは右に0を追加することに注意)、最後に2つの=文字が追加されます.
4バイトのデータをbyte[]{1,2,3,4}としてバイナリで表すとします.
00000001 | 00000010 | 00000011 | 00000100
上記の原理によれば、Base 64 Encoding符号化を用いた結果は、
000000 | 010000 | 001000 | 000011 | 000001 | 000000
10進法を0|16|8|3|1|0に変換し、上の表と照らし合わせると、符号化されたテキストはAQIDBA==である.
3で割り切れない場合、残りの2バイトは、残りの1バイトと同様に4文字に変換され、最後の文字は=となります.
byte[]{1,2,3,4,5}の5バイトのデータをバイナリで表すとします.
00000001 | 00000010 | 00000011 | 00000100 | 00000101
上記の原理によれば、Base 64 Encoding符号化を用いた結果は、
000000 | 010000 | 001000 | 000011 | 000001 | 000000 | 010100
10進法を0|16|8|3|1|0|20に変換し、上の表と照らし合わせて符号化されたテキストはAQIDBAU=
2.はい.Netでの実装
はい.Netでは、バイナリデータをテキストに符号化するには、public static string ToBase 64 String(byte[]inArray)メソッドを使用することができる.テキストファイルからバイナリデータに変換するには、public static byte[]FromBase 64 String(string s)メソッドを使用します.
次に、上記の例を検証し、3組のデータbyte[]{1,2,3}、byte[]{1,2,3,4}、byte[]{1,2,3,4,5}をそれぞれ符号化し、符号化されたテキストがそれぞれAQID,AQIDBA=,AQIDBAU=であるかどうかを検証する.
byte[] binary1 = new byte[] { 1, 2, 3 };
string encoded1 = Convert.ToBase64String(binary1);
byte[] decoded1 = Convert.FromBase64String(encoded1);
Console.WriteLine("Encoded string: {0}, Decoded binary is equal to orignial binary? {1}"
, encoded1, binary1.SequenceEqual(decoded1));
byte[] binary2 = new byte[] { 1, 2, 3, 4};
string encoded2 = Convert.ToBase64String(binary2);
byte[] decoded2 = Convert.FromBase64String(encoded2);
Console.WriteLine("Encoded string: {0}, Decoded binary is equal to orignial binary? {1}"
, encoded2, binary2.SequenceEqual(decoded2));
byte[] binary3 = new byte[] { 1, 2, 3, 4, 5};
string encoded3 = Convert.ToBase64String(binary3);
byte[] decoded3 = Convert.FromBase64String(encoded3);
Console.WriteLine("Encoded string: {0}, Decoded binary is equal to orignial binary? {1}"
, encoded3, binary3.SequenceEqual(decoded3));
出力結果:
Encoded string: AQID, Decoded binary is equal to orignial binary? True Encoded string: AQIDBA==, Decoded binary is equal to orignial binary? True Encoded string: AQIDBAU=, Decoded binary is equal to orignial binary? True
(三)まとめ
本稿では、符号化と暗号化の違い、なぜ符号化を用いるのか、ベース64の符号化の原理を紹介し、最後にベース64 Encodingについても紹介する.Netでの実装.