[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 メーリングリストの案内