仙石浩明の日記

2008年7月3日

Western Digital RMA チームから届いた文字化けメールを解読してみた

故障した HDD WD10EACS を RMA (Return Merchandise Authorization, 返却承認) 手続きで交換してみた」で書いたように、 RMA 手続きを行なった上で Western Digital へ故障したハードディスク ドライブ (以下 HDD と略記) を送ったら、 激しく文字化けしたメールが送られてきた。

あとは HDD が送られてくるのを のんびり待つだけと思っていたら、 わずか一日後 6/26 18:44 に Western Digital からメールが来た。 しかし文字化けがひどくて読めない。 最初は何語で書いてあるかすら判然としなかったのだが、 どうやら Shift JIS で書かれた文面を quoted-printable エンコードする際に なにか問題があったようだ。 例えば 0x82 が「,」に、0x95 が「.」に置き換わってしまっている。 置換が規則的でないので、 暗号解読よろしく一文字一文字置き換え規則を推測していくしかない。

文面を再現するのに時間がかかりそうだなぁ~と思っている間に、 交換品の HDD が届いてしまったので、 「暗号」解読するモチベーションを失ってしまっていたのだが、

Posted by 通りすがり 2008年07月02日 00:36
結局、メールにはなんて書いてあったのでしょうか?

というコメントを頂いてしまったので、 暗号解読してみることにした。

以下、Western Digital からの文字化けメールを全文引用 (一部伏字) する:

From: "Western Digital RMA" <noreply@wdc.com>
To: <sengoku@gcd.org>
Date: Thu, 26 Jun 2008 02:44:25 -0700
MIME-Version: 1.0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Microsoft CDO for Windows 2000
Content-Class: urn:content-classes:message
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1896
X-OriginalArrivalTime: 26 Jun 2008 09:44:25.0728 (UTC) FILETIME=[3861F800:01C8D771]

HIROAKI SENGOKU -l,=D6=81A

^=C8?=BA,=C9.\Z=A6,=B3,=EA,=BD RMA =
,=CCfXfe=81[f^fX,=F0Sm"F,=B5,=C4,=AD,=BE,=B3,=A2=81B  RMA
,=C9S=D6,=B7,=E9,=A8-=E2,=A2=8D?,=ED,=B9,=CD,=B1,=CCf=81=81[f<,=C9.=D4=90=
M,=B5,=C4,=AD,=BE,=B3,=A2=81B
=8F=EE.=F1,=AA=90=B3,=B5,=A2=8F=EA=8D?=81A,=B1,=CC"dZqf=81=81[f<,=C9,=CD.=
=D4=90M,=B5,=C8,=A2,=C5,=AD,=BE,=B3,=A2=81B


RMA "=D4=8D?=81F 8083XXXX

--------------------------------------------------------------

O=F0S=B7fhf?fCfu,=F0 5=81`7 ?c<=C6"=FA'?,=C9"=AD'-,=B5,=DC,=B7=81B

^=C8?=BA,=CCfhf?fCfu,=F0 Western Digital =
,=CDZ=F3-=CC,=B5,=DC,=B5,=BD=81F

     fVfSfAf<"=D4=8D?     =90=BB.i"=D4=8D?             =
Z=F3-=CC"=FA=81iGMT=81j
     ------------     ---------------      -------------
     WCASJxxxxxxx     WD10EACS-00ZJB0      6/25/2008

--------------------------------------------------------------

^=C8?=BA,=C9.\Z=A6,=B3,=EA,=BD RMA =
"=AD'-=8F=F3<=B5,=F0Sm"F,=B5,=C4,=AD,=BE,=B3,=A2=81B

-A'-<=C6Z=D2,=CCfVfXfef?,=CC=8DX=90V,=C91?c<=C6"=FA,=AA,=A9,=A9,=E8=81A,=BB=
,=CCO=E3"=AD'-'=C7=90=D5"=D4=8D?,=AA-LO=F8,=C9,=C8,=E8,=DC,=B7,=CC,=C5=81=
A,=B2-=B9=8F=B3,=AD,=BE,=B3,=A2=81B

O=F0S=B7fhf?fCfu,=CC'-.t=90=E6=81F

     HIROAKI SENGOKU
     XXXXXXXXXXXXXXXXXXXXXXXXX TAKATSU
     KAWASAKI, Japan 213-XXXX
     JAPAN

"z'-<=C6Z=D2=81F     Fedex
"z'-'=C7=90=D5"=D4=8D?=81F XXXXXXXXXXXX

     fVfSfAf<"=D4=8D?     =90=BB.i"=D4=8D?             =
"=AD'-"=FA=81iGMT=81j
     ------------     ---------------      -------------
     WCASJXXXXXXX     WD10EACS-32ZJB0      6/26/2008

--------------------------------------------------------------

S=D6~AfSf"fN=81F
RMAZ=E8=8F?ZwZ=A6=8F=EE.=F1,=CC?{--/^=F3=8D=FC
  - =

http://websupport.wdc.com/rd.asp?t=3D102&l=3Djp&p=3Dm&r=3D8083XXXX&f=3De

"=AD'-,=C6=8D=AB.=EF,=CC=8F=EE.=F1
  - http://websupport.wdc.com/rd.asp?t=3D103&l=3Djp&p=3Drp

RMAfXfe=81[f^fX,=CC?{--
  - =

http://websupport.wdc.com/rd.asp?t=3D104&l=3Djp&p=3Dv&r=3D8083XXXX&z=3D21=

3-XXXX

Western Digital fTf|=81[fgfz=81[f?fy=81[fW
  - http://websupport.wdc.com/rd.asp?t=3D105&l=3Djp&p=3Dh

^=C8=8F=E3=81A
WD RMA f`=81[f?

http://websupport.wdc.com/rd.asp?t=3D105&l=3Djp&p=3Dh

ヘッダに「quoted-printable」と書いてあるとおり、 quoted-printable エンコーディングを行なったのだろうが、 のっけから「^=C8?=BA,=C9.\Z=A6,=B3,=EA,=BD」となっていて、 一体何語なんだ?と思わせる始まり方である。

ちなみに quoted-printable というのは 8bit データを、 「印字可能 (printable)」つまり 7bit の英数字・記号だけで表現するための方法 (エンコーディング) で、 印字可能でない 8bit データは 16進数で表わして前に「=」をつける (「=」自身は「=3D」で表現する)。 例えば「^=C8?=BA,=C9.\Z=A6,=B3,=EA,=BD」は、 16進数で書くと 「5E C8 3F BA 2C C9 2E 5C 5A A6 2C B3 2C EA 2C BD」 という 8bit データ列を意味する。

腕に覚えのあるかたは、解答を見ずに解読を試みてはいかがだろうか?

結論から言うと元のテキストは Shift JIS で書かれた日本語である。 海外からのメールなので、日本語以外の可能性を考えてしまったのが敗因だった。 最初から日本語であると決めつけていれば、 もうちょっと早く解読できていたかもしれない。

Shift JIS の場合 1byte 目は 0x80 (16進数で 80) 以上であるはずなのだが、 なぜ冒頭が「5E C8 3F BA ...」になってしまっているかというと、 元テキストにおいて 0x80 ~ 0x98 のデータが、 メール中で以下のように化けてしまっているため。

元データメール中の文字
80?
81=81 (正常)
82 ‚,
83 ƒf
86 †?
87 ‡?
88 ˆ^
89 ‰?
8A ŠS
8B ‹<
8C ŒO
8D=8D (正常)
8E ŽZ
8F=8F (正常)
 
元データメール中の文字
90=90 (正常)
91 ‘'
92 ’'
93 “"
94 ”"
95 •.
96 –-
97 —-
98 ˜~

表中、「元データ」の欄に、Windows の欧文文字コード CP1252 の字形を入れてみた。 それぞれの元データがメール中でどのように化けるかを見ていると、 quoted-printable エンコーディングにおいて、 CP1252 の字形を印字可能文字 (7bit の英字・記号) で無理矢理表現しようとした結果、 このような「文字化け」変換が行なわれてしまったように思えてくる。

注目すべきはこの変換が多対一対応である点、 すなわち異なるデータがメール中で同じ文字に変換されてしまっている点だろう。 例えば、 0x80, 0x86, 0x87, 0x89 のいずれのデータも、 メール中では「?」という文字に置き換えられてしまっているし、 0x93 も 0x94 も区別無く「"」という文字に置き換えられてしまっている。 すなわちメール中に「"」が現れても、それが 0x93 なのか 0x94 なのか、 はたまた「"」自身なのか、区別がつかない、ということである。

元のテキストでは、 冒頭は『以下に表示された』という文字列だったと推測される。 『以下に表示された』という文字列を quoted-printable エンコーディングで変換すると、 「=88=C8=89=BA=82=C9=95\=8E=A6=82=B3=82=EA=82=BD」になるが、 0x88 は上表にあるように「^」に化けてしまう。 同様に、0x80~0x98 の各データについて上表の「文字化け」変換を行なうと、 「^=C8?=BA,=C9.\Z=A6,=B3,=EA,=BD」となって、 前掲したメールの冒頭に一致する。

このように元のテキストから「文字化け」したメールを生成するのは、 上表を用いれば簡単に行なえるが、 その逆変換 (つまり文字化けの修復) は複数の可能性 (例えば「^」は 0x88 と「^」自身の二通りの可能性がある) の中から最も日本語として自然なものを選ばなければならない。

というわけで、 化けている文字それぞれについて、 一番自然に見えるものを選ぶ、 という操作を繰り返すことによって「暗号解読」すると、 元のテキストと思しき次の文面が得られる:

HIROAKI SENGOKU 様へ、

以下に表示された RMA のステータスを確認してください。  RMA
に関するお問い合わせはこのメールに返信してください。
情報が正しい場合、この電子メールには返信しないでください。


RMA 番号: 8083XXXX

--------------------------------------------------------------

交換ドライブを 5~7 営業日中に発送します。

以下のドライブを Western Digital は受領しました:

     シリアル番号     製品番号             受領日(GMT)
     ------------     ---------------      -------------
     WCASJxxxxxxx     WD10EACS-00ZJB0      6/25/2008

--------------------------------------------------------------

以下に表示された RMA 発送状況を確認してください。

輸送業者のシステムの更新に1営業日がかかり、その後発送追跡番号が有効になりますので、ご了承ください。

交換ドライブの送付先:

     HIROAKI SENGOKU
     XXXXXXXXXXXXXXXXXXXXXXXXX TAKATSU
     KAWASAKI, Japan 213-XXXX
     JAPAN

配送業者:     Fedex
配送追跡番号: XXXXXXXXXXXX

     シリアル番号     製品番号             発送日(GMT)
     ------------     ---------------      -------------
     WCASJXXXXXXX     WD10EACS-32ZJB0      6/26/2008

--------------------------------------------------------------

関連リンク:
RMA手順指示情報の閲覧/印刷
  - http://websupport.wdc.com/rd.asp?t=102&l=jp&p=m&r=8083XXXX&f=e

発送と梱包の情報
  - http://websupport.wdc.com/rd.asp?t=103&l=jp&p=rp

RMAステータスの閲覧
  - http://websupport.wdc.com/rd.asp?t=104&l=jp&p=v&r=8083XXXX&z=213-XXXX

Western Digital サポートホームページ
  - http://websupport.wdc.com/rd.asp?t=105&l=jp&p=h

以上、
WD RMA チーム

http://websupport.wdc.com/rd.asp?t=105&l=jp&p=h

「交換ドライブを 5~7 営業日中に発送します」と書いてあるが、 実際にはこのメールが送信された時 (日本時間で 6/26 18:44) には既に発送が完了 (18:02) していて輸送中である。 このメールを 6/27 の時点で解読できていれば、 HDD が届く前に FedEx の追跡ページ で HDD が今どこを輸送中であるか調べることができたはずであるが、 あいにく 6/27 は一日中外出していたので、 解読を始めたのは 6/28 土曜日のお昼過ぎになってからである。 ちょうど解読の糸口がつかめたあたり (元テキストが Shift JIS であることが判明した時分) で HDD が届いてしまった (6/28 15:34)。

参考までに、復号するための perl スクリプトを以下に添付する。 解読はこのような復号スクリプトを徐々に形作りつつ、 前述した表を推測していく形で行なった。

#!/usr/bin/perl
use strict;
use warnings;
while (<>) {
    while (/=\n/) {
	$_ = $` . <>;
    }

    s/\"=D4=8D\?/*94*D4*8D*86/g;	# 番号
    s/=(8[DF])\?/*$1*87/g;	# 合
    s/\?\{\-\-/*89*7B*97*97/g;	# 閲覧
    s/fVfXfef\?/*83V*83X*83e*83*80/g;	# システム
    s/fTf\|=81\[fgfz=81\[f\?fy=81\[fW/*83T*83|=81[*83g*83z=81[*83*80*83y=81[*83W/g;	# サポートホームページ
    s/f\`=81\[f\?/*83`*81[*83*80/g;	# チーム
    s/f\?/*83*89/g;	# ラ
    s/fS/*83*8A/g;	# リ
    s/f\</*83*8B/g;	# ル
    s/f\"/*83*93/g;	# ン
    s/\'-/*91*97/g;	# 送
    s/\'\?/*92*86/g;	# 中

    s/\,(=[0-9A-F][0-9A-F])/*82$1/g;
    s/f(=[89A-F][0-9A-F]|[\^\|ACNSTVXehu])/*83$1/g;
    s/\^(=[0-9A-F][0-9A-F])/*88$1/g;
    s/\?(=[0-9A-F][0-9A-F]|c)/*89$1/g;
    s/S(=[0-9A-F][0-9A-F]|[cm])/*8A$1/g;
    s/\<(=[0-9A-F][0-9A-F])/*8B$1/g;
    s/O(=[0-9A-F][0-9A-F])/*8C$1/g;
    s/Z(=[0-9A-F][0-9A-F]|[qw])/*8E$1/g;
    s/\'(=[0-9A-F][0-9A-F])/*92$1/g;
    s/\"(=FA|d)/*93$1/g;
    s/\"(=[0-9A-F][0-9A-F]|[Fz])/*94$1/g;
    s/\.(=[0-9A-F][0-9A-F]|[it\\])/*95$1/g;
    s/\-(=E2)/*96$1/g;
    s/\-(=[0-9A-F][0-9A-F]|[ALl])/*97$1/g;
    s/\~(=[0-9A-F][0-9A-F]|[ALl])/*98$1/g;

    s/[=\*]([0-9A-F][0-9A-F])/pack("H*", "$1")/eg;
    print;
}

1件のコメント »

  1. 今私は大学生ですが、こんな作業をサクッと行えるなんて、感動しましたX)

    コメント by wd — 2008年11月11日 @ 23:27

この投稿へのコメントの RSS フィード。

コメントする