[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]]]] の[[正準形]]のみを最適化対象としています。 ([[名無しさん]])