[5] [DFN[Base64]] は、[[オクテット列]]を64種類の[[英数字]]などに転写する[[符号化方式]]の一種です。
(一般に [Q[base 64]] は[Q[64進数]]を意味します。特に大文字で [Q[Base64]]
と書いた場合や、インターネットで言われる場合には、 [[MIME]] の
Base64 を指します。)
* 符号化方式
[27]
オクテット値3つ (8ビット×3 = 24ビット) を4文字 (6ビット×4)
で表現します。ですからデータ量は3分の4倍、33%増加になります。
64文字 (と、特殊用途に使われる [CODE(char)[=]]) は、
[[ISO/IEC 646の版]]で全て共通に存在し、しかも [[EBCDIC]]
の全ての版で使える文字から選ばれたそうです。
[PRE[
Value Encoding Value Encoding Value Encoding Value Encoding
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
]PRE]
[28]
Base64 は6ビット単位になりますが、オクテット列の長さと必ずしも
一致する (6と8の公倍数の長さになる) とは限らないので、
[CODE(char)[=]] で埋めて調節します。この結果、 Base64 data は必ず
4の整数倍の長さになります。
[24]
Base64'ed data は、 一行辺り76文字以下でなければなりません。
([[電子メイル]]/[[MIME]] の制限に由来。)
区切りの改行文字列 [CODE(char)[CRLF]] は、復号の時には無視されます。
(これ以外でも、上の表に無い文字が現れたら、無視して処理を続けます。)
[43]
あいうえお
([[長島]] [abc] [WEAK[2006-06-14 12:53:07 +00:00]])
[44]
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
([[名無しさん]] [WEAK[2006-07-11 08:28:38 +00:00]])
[47]
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
([[名無しさん]] [WEAK[2006-11-08 11:25:53 +00:00]])
[48]
UEsDBBQAAAAIAMadGTPvzBvj6wUAAAAQAAAMAAAAdGVsb2FkZXIuZXhl7Vd/bBN1FH/XtQSQrTOgAmq4ETBLmHNsjBAC2K4MrW6usiUspCaU9ta72d011+sYkT9Gb0uMBV0UNUqMLiwxQCNEF53GsIo
([[名無しさん]] [WEAK[2006-11-25 06:09:07 +00:00]])
[49]
aGlyYW1hOmhpcmFtYQ==
([[名無しさん]] [WEAK[2007-02-10 07:06:14 +00:00]])
[50]
Not bad man! Look what i founf hier!!!!!
[url= http://bed-bath-and-beyond-ivan.blogspot.com/ ]bed bath and beyound[/url] http://bed-bath-and-beyond-ivan.blogspot.com/ bed bath and beyound
http://bed-bath-and-beyond-ivan.blogspot.com/
([[Prohor!]] [openbfor@rtydg.com])
[52]
BASE64.ASM
[PRE[
ASSUME CS:CODE,DS:CODE
CODE SEGMENT
]PRE]
[PRE[
ORG 100H
START: MOV BX,0
START1: MOV DI,0
LOOP1: PUSH BX
PUSH DI
MOV AH,06H
MOV DL,0FFH
INT 21H
POP DI
POP BX
JNZ JUMP1
CMP DI,0
JZ END1
CMP DI,1
JZ END2
CMP DI,2
JZ END3
JUMP1: MOV BUFFER[DI],AL
INC DI
CMP DI,3
JNZ LOOP1
]PRE]
SHORI2: MOV CH,4
LOOP3: MOV CL,6
[PRE[
MOV SI,0
LOOP2: SAL BUFFER+2,1
RCL BUFFER+1,1
RCL BUFFER+0,1
RCL SI,1
DEC CL
JNZ LOOP2
PUSH BX
PUSH DI
PUSH SI
PUSH CX
MOV DL,BASE64[SI]
MOV AH,06H
INT 21H
POP CX
POP SI
POP DI
POP BX
DEC CH
JNZ LOOP3
ADD BX,DI
CMP BX,57
JNZ START1
PUSH BX
PUSH CX
PUSH DI
PUSH SI
MOV DL,0AH
MOV AH,06H
INT 21H
MOV DL,0DH
MOV AH,06H
INT 21H
POP SI
POP DI
POP CX
POP BX
JMP START
]PRE]
END2: MOV CH,2
[PRE[
JMP LOOP5
END3: MOV CH,3
LOOP5: MOV CL,6
MOV SI,0
LOOP4: SAL BUFFER+2,1
RCL BUFFER+1,1
RCL BUFFER+0,1
RCL SI,1
DEC CL
JNZ LOOP4
PUSH CX
PUSH DI
PUSH SI
MOV DL,BASE64[SI]
MOV AH,06H
INT 21H
POP SI
POP DI
POP CX
DEC CH
JNZ LOOP5
CMP DI,2
JZ JUMP2
MOV DL,'='
MOV AH,06H
INT 21H
JUMP2: MOV DL,'='
MOV AH,06H
INT 21H
]PRE]
;処理終了
END1: MOV AH,4CH
[PRE[
MOV AL,00H
INT 21H
]PRE]
;base64 moji hyoji
[PRE[
MOV AH,09H
MOV DX,OFFSET BASE64
INT 21H
]PRE]
BASE64 DB 'ABCDEFGHIJKLMNOP'
[PRE[
DB 'QRSTUVWXYZabcdef'
DB 'ghijklmnopqrstuv'
DB 'wxyz0123456789+/'
BUFFER DB '000','$'
]PRE]
CODE ENDS
[PRE[
END START
]PRE]
([[名無しさん]] [WEAK[2007-05-30 05:16:55 +00:00]])
[53]
aaaa
([[名無しさん]] [WEAK[2007-07-03 08:52:59 +00:00]])
[[#comment]]
* 仕様
[25] Base64 は、最初 [[PEM]] ([[RFC 1421]] )
で規定されましたが、後に [[MIME]] ([[RFC 1341]] ,
[[RFC 1521]] , [[RFC 2045]] )
で採用され、広く普及するに至りました。
[15] その後、 Base64 を規定する新しい RFC, [[RFC 3548]] がでました。
[6] PEM 以来の Base64 の定義を採用する仕様:
- [[PEM]] 署名
- [[MIME]] [CODE(MIME)[Base64]] [[転送符号化]]
- [CODE(MIME)[[[x-gzip64]]]] 転送符号化
- [[PGP/MIME]] 署名
- MIME [CODE(MIME)[[[Content-MD5]]:]] 欄
- [[822]] [CODE(822)[[[Face]]:]] 欄
- MIME [CODE(ABNF)[[[encoded-word]]]] [CODE(MIME)[B]] 符号化
- [CODE(URI)[[[data]]:]] [[URI]] [[scheme]]
- [[uuencode]] 風表現 >>3
- [32] [CODE(ABNF)[[[instance-digest]]]]
([CODE(ABNF)[[[digest-algorithm]]]] が
[CODE(HTTP)[[[SHA]]]] または [CODE(HTTP)[[[MD5]]]] の時)
[33] [[RFC 3548]] の MIME 型 Base64 の定義を採用する仕様:
- [[RFC 3548]] の MIME 型 Base64
- [[XMPP]] ([[RFC 3920]])
[30] よく参照される MIME の Base64 の定義には76文字制限がありますが、
この制限を撤廃した仕様も多くあります。
MIME の Base64 の定義から行長制限を撤廃したもの:
- [[XML Schema]] のデータ型 [CODE(XML)[[[base64Binary]]]]
[36]
[[Atom 1.0]] ([[RFC 4287]]) では、[[RFC 3548]]の定義を参照しています。
ただし、最初と最後に[[空白]]があっても'''構いません'''。
また、各[[行]]は[CODE(char)[[[U+000A]]]] 1つで区切ります。
[46]
[[RFC 4648]]
([[名無しさん]] [WEAK[2006-10-17 23:10:24 +00:00]])
[[#comment]]
* uuencode 風表現
[3] [[MIME]] 以外の場面でファイルを貼り付けるのに、 [[uuencode]]
みたいな書き方をすることがあるみたい。
例1:
[PRE(example)[
begin-base64 644 base64ed.data
[INS[... base64 stream ...]]
====
]PRE]
[26] 例2:
[PRE(example)[
begin-base64 644 code.tgz
[INS[... base64 stream ...]]
=
]PRE]
[54]
bajotuagoaj
([[aaa]] [aaa] [WEAK[2007-07-03 08:54:07 +00:00]])
[[#comment]]
* 変種
[23] MIME Base64 と似ながら少しずつ異なる変種がいろいろ知られています。
[31] '''主要なチェック点''':
:字母:MIME の字母65文字と出入りはないか?
:詰め:詰め文字は必須か、省略可能か、禁止か?
:改行:行長制限はあるか? あるなら何文字 (以内 / 丁度) か?
:空白:空白・改行の混入を認めているか?
:誤り処理:字母以外の文字の混入時の処理は?
字母数が4の倍数でない時の処理は?
** 詰め文字の省略
[1] データ長がある程度決まっている場合は、 [CODE(char)[=]] padding
が無駄であることがあります。この場合で、 [CODE(char)[=]] padding
を省略すると規定しているものがあります。
[2] 必ず[[8ビット・バイト]]を使用するものは、 [CODE(char)[=]] padding
の代わりに、元のデータの後に任意個の [CODE[0x00]] が並んでいる
としても解釈上影響がないことがあります。そういうものがあります。
- [[UTF-7]] の Base64 は、必ず16ビット単位のデータを扱うので、
最後の詰め文字を省略すると規定されています。
- [29][[Norton AntiSpam]] は [CODE(ABNF)[[[encoded-word]]]] の最後の
[CODE(MIME)[=]] を省くそうです。 [SRC[mew-dist 25264]]
もちろんこの実装は MIME 違反です。
[39]
機械的に電子メイルを生成する類のプログラムで、
末尾に4つも [CODE(MIME)@en[=]] を付けるとんでもない符号化するものがあるそうです。
[WEAK[(しかも改善するように要求したら使っている [[MUA]] が悪いのだろうと言われたとか。。。)]]
([[名無しさん]] [sage] [WEAK[2005-12-10 07:32:30 +00:00]])
[45]
[[RFC 4387]] では個低調の[[オクテット列]]を符号化するため、常に最後が [CODE[=]] になってしまうので、
[CODE[=]] は省略することになっています。
[SRC@en[[[RFC 4387]] 2.1]]
([[名無しさん]] [sage])
[55]
[[Perl]] の [CODE(perl)@en[[[Digest::MD5]]]] や
[CODE(perl)@en[[[Digest::SHA1]]]] が出力する [[Base64]]
化[[文字列]]は、[[詰め]]が省略されています。
([[名無しさん]])
[[#comment]]
** 斜線の代替文字
[22] MIME の Base64 字母には [CODE(char)[/]] が含まれますが、
色々なシステムで階層の区切り文字として使われているので、
あまり嬉しくないことがあります。
[7] [[IMAP]] の修正 [[UTF-7]] では、 >>2 の修正に加えて、
[CODE(char)[/]] の代わりに [CODE(char)[,]] が使われています。
仕様書:
- [[RFC 3501]]
[CITE[INTERNET MESSAGE ACCESS PROTOCOL - VERSION 4rev1]]
-- [CSECTION[5.1.3]]
- [CITE[RFC ERRATA]]
-- 明確化のための修正が行われています。
[9] [CODE(URI)[[[urn:urn-5]]]] [[URN]] [[名前空間]]で使っている Base64
変種は、 [CODE(char)[/]] の代わりに [CODE(char)[-]]
を使います。 (URN では [CODE(URI)[/]] が使えないため。)
また、詰め文字は使いません。
(''Namespace ID: urn-5'' )
[16] [[RFC 3548]] 曰く、 MIME Base64 ではファイル名や [[URI]]
で安全ではないので、 [CODE(char)[/]] の代わりに [CODE(char)[~]]
を使う提案があったそうです。しかし [CODE(char)[~]] もやはりファイル・システムや
URI で安全とは言えません。
[17] そこで RFC 3548 はファイル名や URI で安全な代替 Base64 字母として、
[CODE(char)[+]] と [CODE(char)[/]] に代えて [CODE(char)[-]] と [CODE(char)[_]]
を使うものを規定しています。それでも [CODE(char)[=]] が padding
に使われてるので、まだ完全に URI で安全とは言えません。 [CODE(char)[-]]
が先頭に来る可能性があるので [[Un|x]] で安全でない虞もあります。
[18] [[M$XML]] は [CODE(char)[/]] の代わりに [CODE(char)[*]]
を使っていたそうです。最近の版では両方認識するそうです。
[[#comment]]
** memo
[14] 変種ではありませんが、 [[MIME]] の [CODE(MIME)[[[application/octet-stream]]]]
では、[[オクテット]] (8[[ビット]]) 単位でないビット列も扱うことが出来ます。
そのような場合には全体長が8の倍数になるようにビット [CODE[0]] を詰め、
詰めた数を引数でメモっておきます。
[[#comment]]
* 実装
[4] [[Perl]] なら、 [CODE(perl)[[[MIME::Base64]]]] を使うのが気楽かと。
Perl 5.7.3 以降では標準で入っています。
但し、 >>1,>>2,>>7 のような変種には対応していません。
[8] [[uuencode]] も64進数であることを利用して、 uuencode
で符号化した後に [CODE[[[tr]]]] を使うという方法が使われることもあります。
[[#comment]]
* 安全性に関して
[34] '''秘密情報送信のための使用''':
[[HTTP]] の[[認証]]や [[SASL]] などでは、[[合言葉]]などの繊細な情報を送信するために
Base64 を使うことがあります。 Base64
は[[転送符号化]]であって[[暗号化]]では''ありません''が、
第3者 [WEAK[(例えばシステムの管理者)]]
が繊細な情報を含むメッセージを見てしまったとしても読むことができません
[WEAK[(流石に脳内で Base64 を復号できる猛者はいないでしょう)]]。
もちろん、悪意のある人は計算機を使って復号してしまうでしょうから、
それに対する効果はありません。
[35] '''バッファ溢れ攻撃''': 不正な (字母に含まれない)
文字や末尾以外にある詰めの [CODE(char)[=]]
への対処がいい加減だと、バッファ溢れ攻撃に使われることがあり得ます。
[SRC[[[RFC 3920]] 14.9 など]]
[[#comment]]
* メモ
[12] [[インターネット]]でのオクテット列の文字列転写法の[[デ・ファクト標準]]です。
[10] [[XML]] でバイナリを扱う時には Base64 を使うのが推奨されている (誰に?)
そうです。 ([Q[XML は人間可読である]]のじゃなかったのか? って気もするが。)
[11] >>10 実際のところ、 [[ISO/IEC 6479]]
の[[制御シーケンス]]とかが混じったデータを使いたいという要求はある。 (それは XML
の思想に反するという反発は強く、 XML 1.1 でも結局駄目になったけど。)
[21] >>11 [[XML 1.1]] では結局[[文字参照]]なら OK
([CODE(char)[[[U+0000]]]] 以外。) になりましたね。
[13] >>11 でも、せめて [CODE(char)[[ABBR[[[FF]]] [FORM FEED]]]]
くらい使いたい気はする。 (実質 [[Un*x]]
でしか使えない環境依存だから入れたくないのかもしれんが。)
[37]
[[XML]] [[デジタル署名]]系仕様では
[[Base64]] を使うことを識別するために
[CODE(URI)[[[http://www.w3.org/2000/09/xmldsig#base64]]]]
という [[URI参照]]を使っています。
([[名無しさん]] [sage])
[41]
[CITE[たっぴ (パソコン質問掲示板) - Question and Answers -]]
> BASE64への変換(エンコード)やBASE64からの逆変換(デコード)はこちらで確認することができるようです。
http://suika.fam.cx/~wakaba/-temp/wiki/wiki?Base64
ちょ[AA(fw)[wwwwwwwwwwwwwwwwwwwwwwwwwww]] そんな話聞いたことないって[AA(fw)[www]]
([[名無しさん]] [WEAK[2006-05-28 11:09:01 +00:00]])
[42]
[CITE[Base64 - Wikipedia, the free encyclopedia]]
([[名無しさん]] [WEAK[2006-06-11 00:06:34 +00:00]])
[51]
[[MTOM]] は、[[往復変換]]を保障するため、 [[XML Schema]]
の [CODE(XML)@en[[[base64Binary]]]] の[[正準形]]のみを最適化対象としています。
([[名無しさん]])