[mew-dist 25267] Re: B decode 時のエラー条件緩和
Motohiko Minakuchi
zxcv3794 at example.com
2004年 9月 8日 (水) 00:50:21 JST
From: Kazu Yamamoto (山本和彦) <kazu at example.com>
Subject: [mew-dist 25265] Re: B decode 時のエラー条件緩和
Date: Tue, 07 Sep 2004 21:31:17 +0900 (JST)
> base64 は、8bit 3文字を 6bit 4文字に変換する符号化方式です。ですので、
> base64 で符号化した後は、長さが 4 の倍数になります。
はい、そのあたりは、「**B ENCODING ERROR**」の原因を探るために勉強しま
した。(一夜漬けですが)
> =?iso-2022-jp?B?GyRCJCIbKEI?=
> を見ると、4 の倍数ではなく、計算すると 1 足りないことが分ります。
>
> しかし、どうやって "=" が落ちたと判断するのですか? "D" が落ちたかもし
> れませんよ。
以下の仮定には、問題があるでしょうか?
1 あるソフトウェアは、桁合せの "=" を付加しない。
(仮定というより実績で、バグとの回答を引出すべく努力中です)
2 それに起因する誤まった encode は、他の原因の "=" 個数の不正より着信
頻度が多い。 あるいは、他の原因のものは強制復号の結果を一目見たら壊
れてるのが判る。
> # ちなみに、base64 の復号化は Emacs (の C で書かれた)関数を利用してい
> # るので、気の効いた(?)変更は難しいです。
以下のいずれかできると思うのですが、ちょっと不細工です。 他の方も要望
されたとき、改めて考えて頂ければ充分です。
1 符号化文字列の桁数が 4 の倍数になるまで "=" を追加。
(桁合せの "=" を理解する関数の場合)
2 符号化文字列の桁数が 4 の倍数になるまで "A" を追加して関数を呼び、結
果の復号化文字列末尾に 1~2 桁の NULL 文字があれば削除。
("=" を理解しない関数の場合)
試しに、デコード過程確認のソフトを作って確認しました。 下記は、"=" の
落ちた「あ」の場合、符号化文字列に "A" を追加すれば、復号結果に NULL
文字が余分に現れることを示しています。
G y R C J C I b K E I (A)
06 32 11 02 09 02 08 1b 0a 04 08 00
1b 24 42 24 22 1b 28 42 00
Esc $ B (あ) Esc ( B NULL
> 何とか不完全な形で復号化しても、さらに文字コードとして解釈しなければい
> けません。不完全なデータを文字コードとして解釈すると、何が起こるか分ら
> ないので、かなり気が重いです。
確かに、末尾の "=" 以外が落ちていた場合や混入文字がたまたまBase64とし
て合法だった場合も "="数の不正として現われますね。 それが、始めに書い
た仮定を超えた重大問題(画面が乱れるとか)につながるのなら、今後とも無理
だと理解します。
--
水口 元彦 (みなくち もとひこ)
zxcv3794 at example.com
Mew-dist メーリングリストの案内