ID TECH
すべての技術記事

技術記事

磁気ストライプデータをデコードする方法

少し前まで、クレジットカードのデータを読み取るのは非常に簡単でした。リーダー(ID TECHが製造する多数のリーダーなど)にカードをスワイプし、仮想ターミナルアプリ(またはその他のアプリ)がリーダーから出力されるトラックデータをそのまま取り込むだけでした。対象のデータは、暗号化されていない状態でキー入力として画面に表示されました。

あの頃が懐かしいですね!

言うまでもなく、状況は大きく変わりました。今日の磁気ストライプリーダーは、USB経由(多くの場合、キーボードモードではなくHIDモード)で暗号化データを出力するのが一般的であり、ほとんどのカードリーダーは磁気ストライプカードに加えてICチップカードも処理しなければなりません。ICチップカードのデータはTLV(タグ、長さ、値)形式で表現され、かつての「単純な磁気ストライプデータ」とはかなり異なって見えることがあります。さらに、データは必ず暗号化されています。

過去の 最近の投稿では、業界標準のTDESおよびAES復号アルゴリズムと業界標準(ANSI X9.24)のDUKPT鍵導出技術を組み合わせて、クレジットカードデータを復号する方法を紹介しました。しかし、そもそも復号化された磁気ストライプデータをどう取得するかについては触れませんでした。「クレジットカードの磁気ストライプデータ」とは、現在どのようなものなのでしょうか?どのように取得し、デコードするのでしょうか?どの部分が暗号化されているか、どうやって判断するのでしょうか?

今日のカードリーダーは、USB経由(多くの場合、キーボードモードではなくHIDモード)で暗号化データを出力するのが一般的であり、ほとんどのカードリーダーは磁気ストライプカードに加えてICチップカードも処理しなければなりません。

最初の質問(磁気ストライプデータとはどのようなものか?)への答えは、使用しているカード読み取り機器のメーカーや機種だけでなく、その取引が磁気スワイプ、ディップ(接触EMV)、または非接触/NFCのいずれによって行われたかによって大きく異なります。一般的に、単に生のトラックデータを読み取る以上のことが行われています。復号に必要なKSN(Key Serial Number)の取得や、取引に関する各種メタデータの収集も行われています。確かに、例えば生のTrack 2データだけを取得したいだけかもしれませんが、それを取得する過程で他にも多くのデータを扱わなければなりません。

予想外に「メソポタミア風キンカン・アブサンラテ」を切らしたお詫びとして、罪悪感を抱いたバリスタからもらったスターバックスのギフトカードを使って、実例を簡単に見てみましょう。このスターバックスカードを、キーボードモードで動作するID TECHのAugustaカードリーダーにスワイプし、メモ帳ウィンドウを開いた状態(テキストウィンドウにカーソルを置いた状態)で読み取ると、メモ帳に以下のデータが表示されます:

02ED01801F4C2800839B%*6010********8765^0254/SERVICERECOVERYUSD^*******************************?*;6010********8765=********************?*95025C86987E4F7DD07D58730EB79FDFB90AB7F23E6ECA6F4F04A67BF511EE13F950903BDE77624680C460E9C36C4F9136256BB93A38CB98F95626DCFAF9335CE0A213074CC1CD84CC911398E06756C464AB036B694228ADA7EC018F495A013AF8A04C976288FE2F80271E6E53D987DE19ACA2707BFF2C78000000000000000000000000000000000000000000000000000000000000000000000000000000003631335435333536313862994900750002A00308108E03

これは「生のトラックデータ」をはるかに超える内容です。マスクされたトラックデータ(B%で始まり、多くのアスタリスクを含み、最後に?*で終わる部分)は識別できますが、これはプライマリアカウント番号(PAN)を隠しており、実際には暗号化されています。ここで表示されているもののほとんどは、リーダーから出力されるバイナリデータの16進数表現です。

この大きなデータブロックの解析は、方法さえ知っていれば簡単です。最も早くデコードする方法は、ID TECHの無料ツール Parsomatic にデータを通すことです。これはすべてのデータ要素を分かりやすく表示できるHTMLフォームです。

カードリーダーごとに、カードデータの表現方法は独自に異なります。ID TECHは、磁気ストライプデータをEnhanced Encrypted MSRフォーマットと呼ばれる形式で表現します。このフォーマットには26のデータフィールドが含まれており、26フィールドすべての詳細は文書 P/N 80000502-001 に記載されています。 ID TECH暗号化データ出力.

カードに何が含まれているかのイメージをつかむため、データの最初の5バイト(02 ED 01 80 1F)を見てみましょう。 Parsomaticによると、これら5バイトには以下の情報が含まれます:

最初のバイト(02)は単純にSTX、つまり「開始」バイトです。次の2バイト(ED 01)は、データペイロード全体の長さを16進数で表しています(リトルエンディアン: ED 01は実際には0x01EDつまり493バイトのデータを意味します)。Card Encodeタイプは0x80で、これは(平たく言えば)リーダーがこのカードを金融カードとみなしていることを意味します。Track Status(値: 0x1F)は8ビットフラグを含むステータスバイトで、磁気ストライプに存在するトラック(最大3つ)と、そのうち正常に読み取れたトラックを示します。今回の場合、3つの物理トラックすべてが正常に読み取られましたが、データが存在するのはTrack 1とTrack 2のみです。

次の5バイトを簡単に見てみましょう。 Parsomaticによると、これらのバイトとその意味は以下の通りです:

金融カードでは、Track 1は最大79バイト、Track 2は最大40バイト、Track 3は最大107バイトです。今回の場合、Track 1には76バイト(16進数で0x4C)、Track 2には40バイト(0x28)のデータがあります(Track 3は0バイトでした)。これらの長さを把握することは重要で、マスクされたトラックデータの解析だけでなく、暗号化されたトラックの長さを判断するためにも必要です。暗号化された長さは実際のネイティブなトラック長と異なります。トラックデータはTDES暗号化では8の倍数、AESでは16の倍数になるように最終的にパディングされなければならないためです。

データがTDES暗号化されているかAES暗号化されているかをどう判断するのでしょうか?その情報はClear/Mask Data Sent Statusバイトのビット4(上記参照)にあります。また、Encrypted/Hash Data Sent statusバイト(上記参照)もあり、暗号化されたトラックデータ(および検証ハッシュ)が存在するか、KSNが存在するかを示します。

次にTrack 1とTrack 2のマスクされたデータが続き、それぞれの暗号化版、続いてハッシュデータ(今回はすべてゼロ)、その他のデータ(後述)が続きます。なお、 Parsomatic は以下のように、ASCIIのトラックデータを16進数表現に変換しています:

注目すべきは、 Parsomatic が暗号化されたデータの横に「このデータを復号する」リンクを挿入する点です(上記参照)。このリンクをクリックすると、ID TECHの 暗号化/復号ツールに移動し、対象のデータを復号化された形で確認できます。

最後のデータフィールドには、Reader Serial Number、Key Serial Number(KSN)、LRC、チェックサム、ETX(伝送終了)が含まれます。LRCは単純にすべてのペイロードデータバイトのXOR(排他的論理和)を表す1バイト値であり、チェックサムはペイロード内のすべてのバイトの算術合計(当然オーバーフローは無視)です。LRCとチェックサムはデータペイロードの完全性を確認するために使用できます(適切なCRCを計算するよりも、いくぶん簡単で迅速です)。

このように、磁気ストライプデータには「トラックデータ」以上のものが多く含まれています。いくつかのデータフィールドの意味については触れることもできませんでした(これは将来の投稿に譲るかもしれません)。EMVデータについてもまったく触れていません(これは間違いなく別の投稿が必要です)。しかし、ID TECHのクレジットカードリーダーから出力されるデータをデコードしようとしているなら、本記事が出発点になるはずです。

詳細については、前述の通り、Enhanced Encrypted MSRデータフォーマットに関する技術文書を必ずご参照ください: ID TECH暗号化データ出力. または、下のリンクをクリックして、スムーズな決済への第一歩を踏み出しましょう!

始める