LoginSignup
7
2

More than 1 year has passed since last update.

DUKPTとは何か?

Last updated at Posted at 2022-02-17

DUKPT (Delivered Unique Key Per Transaction)

DUKPTANSI にて制定されている暗号鍵の運用についての仕様です。
「ディーユーケーピーティー」とか「ダックプット」などと呼ばれています。
クレジットカードを利用する際に、本人確認のために PED(決済端末)に PIN (暗証番号)を入力する場合がありますが、この PIN を安全にバックエンドに送信するための暗号化仕様です。
この DUKPT ですが、日本語で、且つ、開発者目線で踏み込んだ説明をしているものが少なく、運用イメージもつかないので、メモ書き的な感じでまとめてみました。

実際のサンプルコードは下記にアップロードしています。(古いコードなので、もうちょい最適化できますが雰囲気は読めると思います)

登場人物

BDK (Base Derivation Key)

128bit

絶対に漏れてはいけない鍵です。
乱数のシード的な役割で、任意に指定します。
一般的には HSM (Hardware Security Module) に格納され、HSMから外に出ることはありません1
また、運用に入ったら余程のセキュリティ障害が無い限り更新されることもないでしょう。

KSI (Key Serial Identification)

40bit

任意に指定します。
一般的には PED の機種毎に数値を設定するようです。

DID (Device ID)

19bit

任意に指定する。
一般的には PED の固有番号(例えばシリアル番号)が振られます。
すなわち、PED 毎に異なる値となります。
これで約52万台のPEDを賄えることになります。

CTR (Transaction Counter)

21bit

トランザクション毎にインクリメントされる値です。
約200万回でグルリンパします。2
暗号化においては数値として扱われず、21ビットの各ビットを後述する Future Key の配列を参照するフラグとして機能します。

KSN (Key Serial Number)

80bit

KSN = KSI + DID + CTR

image.png

IKSN (Initial Key Serial Number)

80bit

KSN のうち、CTR がゼロのもの。
この IKSNPED (Pin Entry Device) にインジェクションします。

IPEK (Initial PIN Encryption Key)

128bit

BDKKSIDID を使って生成されるハッシュ値3です。
この IPEKPED (Pin Entry Device) にインジェクションします。

Future Key

128bit x 21個

IPEK を元にビット演算を行い生成される21個のハッシュ値です。
PEDIPEK がインジェクションされるとこの21個の Future Key を生成し、セキュア領域に保存される。 インジェクションされた IPEKPED から破棄されます。

流れ

1. BDK を格納

一般的には HSMBDK をインジェクションします。
この BDK の取り扱いには十分注意しましょう。

2. KSIDID を決定

先述のとおり任意の値を決めます。

3. IPEK を生成

BDKKSIDID で生成します。
一般的には HSMKSIDID を入力し、HSM内部で BDK を絡めた演算が施され IPEK を取得します。

4. PED の設定

IPEKIKSN をインジェクションします。
IPEKFuture Key を21個生成しセキュア領域に保存した後、破棄されます。
IKSN は セキュア領域に保存します。
インターネット網を介してインジェクションすることは稀で、基本的には工場出荷時やキッティング時に行われます。

5. PIN を暗号化

PIN が入力された後、これを暗号化します。

5-1. CTR をインクリメント

この CTR がインクリメントすることで後述する PIN を暗号化する鍵が演算によって変化します。

5-2. 暗号化する鍵を生成

CTR の各ビット番号が Future Key の配列に対応してます。
CTR のビットを順に走査します。21ビットなので21回走査します。
ビットが1の場合、そのビット番号の Future Key をビット演算します。
これを繰り返して暗号鍵となります。

5-3. PIN を暗号化

PIN を 5-2 で生成した暗号鍵を使って 3DES で暗号化します。

5-4. 情報をバックエンドへ送信

5-3で生成した暗号文と KSN をバックエンドへ送信します。

6. バックエンドで復号化

KSN には KSIDID が含まれているので、 BDK を絡めて IPEK を生成します。
IPEK を生成すれば Future Key を生成することができます。
この Future KeyCTR を使って暗号鍵を生成します。
そして、暗号文を復号します。

バックエンド側には BDK を抱えている HSM がありますので、材料が揃えば鍵を生成して復号化できるという訳です。

関係図

関係図を作成しましたので、合わせて参考にしてください。

image.png

最後に

この暗号化はトランザクション毎に暗号鍵が変わるものの、本質は共通鍵暗号です。
Future Key (または IPEK)とKSNが漏洩するとPINは保護されません。
したがって、PCI DSS4 のセキュリティ要件を満たすデバイスやシステム構成でなければ安全とは言えません。5


  1. エクスポート機能がある場合でも、必ず何らかの暗号化を施してから外に出ます。 

  2. その際は、新しい IPEKIKSN がインジェクションされるのですが、200万回の PIN 入力よりも PEDの寿命が先に訪れる思いますので、一般的には故障対応をすることになります。 

  3. ハッシュ値は 3DES とビット演算(主にシフトとXOR)によって求められます。 

  4. クレジットカード決済におけるセキュリティ要件をまとめたものです。( https://ja.wikipedia.org/wiki/PCI_DSS ) 

  5. 語弊がありますが DUKPTPCI DSS の構成要素のひとつと考えても良いでしょう。 

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2