關於 DUKPT 過程中未來和會話密鑰生成的問題
據我了解,此過程是在客戶端設備中完成的,用於為每個事務生成唯一密鑰:
- 將生成的 IPEK 注入客戶端設備;
- 使用 IPEK+KSN 生成一組未來密鑰(實際上是 21 個未來密鑰)並刪除 IPEK;
- 使用事務密鑰 + KSN 生成會話密鑰;
- 每個事務使用此會話密鑰,下一個事務使用增量 KSN 並使用下一個未來密鑰。
我的問題:
- 為什麼我們需要會話密鑰?雖然未來密鑰本身是唯一密鑰,如果我們用未來密鑰加密每筆交易,實際上我們為每筆交易使用了唯一密鑰。
- 為什麼我們只生成 21 個未來密鑰?然後在 21 次交易之後,我們需要新的未來密鑰,並且由於刪除了 IPEK,所以我們需要向設備註入一個新的 IPEK,據我所知,從安全的角度來看,像每次一樣在短時間內傳輸設備主密鑰並不是一個好主意21 次交易。為什麼我們不使用像數千這樣更大的循環?
- 21 次交易後我們如何將新的 IPEK 傳輸到設備?有沒有關於這個的描述?IPEK 是用任何其他密鑰加密然後發送到設備還是以明文形式發送? 編輯:
會話密鑰來自這裡:
swiper 通常使用其生成的未來密鑰之一(稱為“會話密鑰”)及其目前的 KSN 來加密這些軌道。
假設這種情況:
- 將 IPEK 注入設備並生成 21 個未來密鑰
- 第一個未來密鑰 + KSN 用於加密第一個交易並增加 KSN
- 這樣做直到使用第 21 個未來密鑰進行第 21 個交易。
- 知道第 22 筆交易我們使用了第 1 個未來密鑰 + 增加的 KSN 還是使用了新的未來密鑰?如果第一個狀態那麼這是否意味著第 1 個加密密鑰和第 22 個加密密鑰僅在 KSN 中不同?
EDIT2: dave_thompson_085 描述了生成和使用未來密鑰的順序(謝謝),唯一對我來說仍然不清楚的部分是生成未來密鑰的細節。我的意思是假設我們想在初始步驟中生成 21 個未來密鑰,當然我們通過 3DES 從 IPEK 派生這個密鑰?但是我們是否使用 IPEK 作為消息和 KSN 作為所有 21 步未來密鑰生成的密鑰?之後,例如對於第 3 次交易,當我們想要在 FK21 中生成和儲存密鑰時,我們是否使用 3DES使用 IPEK 和 KSN 加密以生成 FK21?
我不知道您在哪裡看到會話密鑰。DUKPT 旨在進行交易,而不是會話,因此得名。如果某些應用程序將它們用於會話,那可能是個壞主意。(為編輯添加)好的,那個網站很棒:我認為文本的每個句子都有錯誤或歧義,但程式碼是正確的——至少對於更簡單的“主機”算法來說是正確的;它沒有實現設備端的未來密鑰算法。DUKPT 不打算也不應該用於會話密鑰。
對於設備端算法,21 個所謂的 Future Keys 以分層方式使用,由 21 位計數器(即 KSN 的低位)控制,以派生密鑰序列;它們不直接用作鍵序列。由於跳過了高漢明權重,因此設備的密鑰序列(從初始 KSN 和相應的初始設備或 TRSM 密鑰、設備或 TRSM 注入密鑰或各種其他名稱開始)是 $ 2^{20}-1 $ 或 1048575 鍵 -略超過一百萬。
(詳細擴展,因為我似乎無法傳達 21 個未來的關鍵寄存器沒有被 21 個事務“用完”;修改為更準確的“導出”而不是“生成”)
未來關鍵算法範例
在主機或設備(未來密鑰)模式下,設備的初始密鑰(兩個 64 位一半)由 twokey-3DES 創建,該設備的 IKSN 的高 8 字節使用左側的 BDK 和 BDK每一半與右邊的 C0C0C0C0_00000000 十六進制異或。
在設備註入時,此初始密鑰用於為每個計數器值為 2 的冪的 KSN 派生密鑰,並將它們儲存在未來密鑰寄存器中:IKSN+ 的密鑰 $ 2^0 $ =IKSN+1 在 FK21 中,對於 IKSN+ $ 2^1 $ =FK20 中的 IKSN+2,對於 IKSN+ $ 2^2 $ =FK19 中的 IKSN+4 依此類推至 IKSN+ $ 2^{20} $ =IKSN+1048576 在 FK1 中。由於設備派生的所有密鑰都是針對以設備的 IKSN 開頭的 KSN,從現在開始我將省略這部分,只說計數器值。
對於事務 1,設備 (TRSM) 在計數器中找到最低的“on”位,即 $ 2^0 $ =1 並使用上面設置的相應 FK 寄存器 (FK21) 中的密鑰來包含計數器 1 的密鑰。實際上,該密鑰首先被修改為一個“變體”密鑰,其中兩個八位字節的補碼取決於在交易。使用後 FK21 被邏輯擦除。
對於事務 2,最低的“開啟”位是 $ 2^1 $ =2,所以它類似地使用 FK20 並將其擦除,但首先使用它來導出計數器 3 的密鑰並將其儲存在 FK21 中。
對於事務 3,最低的“on”位是 $ 2^0 $ =1 所以它同樣使用 FK21,它現在包含上面設置的計數器 3 的密鑰,並擦除它。
對於事務 4,最低的“開啟”位是 $ 2^2=4 $ 因此它使用包含計數器 4 的密鑰的 FK19 並將其擦除,但首先在 FK20 中導出計數器 4+2^1=6 和 FK21 中的 4+2^0=5 的密鑰。
對於事務 5,最低的“開啟”位是 $ 2^0=1 $ 因此它使用包含上述計數器 5 密鑰的 FK21,並將其擦除。
對於事務 6,最低的“on”位是 $ 2^1=2 $ 因此它使用包含上述計數器 6 密鑰的 FK20,並在 FK21 中生成計數器 7 的密鑰後將其擦除。
對於事務 7,最低的“開啟”位是 $ 2^0=1 $ 因此它使用包含上述計數器 7 密鑰的 FK21,並將其擦除。
TXN 8 位 $ 2^3 $ 使用 FK18 中的密鑰 8,並在 FK19 中派生密鑰 12,在 FK20 中派生 10,在 FK21 中派生 9。
Txn 9 位 $ 2^0 $ 使用 FK21 中的密鑰 9。
TXN 10 位 $ 2^1 $ 使用 FK20 中的密鑰 10 並在 FK21 中派生密鑰 11。
TXN 11 位 $ 2^0 $ 使用 FK21 中的密鑰 11。
TXN 12 位 $ 2^2 $ 使用 FK19 中的密鑰 12,並在 FK20 中派生密鑰 14,在 FK21 中派生密鑰 13。
TXN 13 位 $ 2^0 $ 使用 FK21 中的密鑰 13。
TXN 14 位 $ 2^1 $ 使用 FK20 中的密鑰 14 並在 FK21 中派生密鑰 15。
TXN 15 位 $ 2^0 $ 使用 FK21 中的密鑰 15。
TXN 16 位 $ 2^4 $ 使用 FK17 中的密鑰 16 並在 FK18 中派生密鑰 24,在 FK19 中派生 20,在 FK20 中派生 18,在 FK21 中派生 17。
TXN 17 位 $ 2^0 $ 使用 FK21 中的密鑰 17。
TXN 18 位 $ 2^1 $ 使用 FK20 中的密鑰 18 並在 FK21 中派生密鑰 19。
TXN 19 位 $ 2^0 $ 使用 FK21 中的密鑰 19。
TXN 20 位 $ 2^2 $ 使用 FK19 中的密鑰 20,並在 FK20 中導出密鑰 22,在 FK21 中導出密鑰 19。
TXN 21 位 $ 2^0 $ 使用 FK21 中的密鑰 21。
TXN 22 位 $ 2^1 $ 使用 FK20 中的密鑰 22 並在 FK21 中派生密鑰 23。
TXN 23 位 $ 2^0 $ 使用 FK21 中的密鑰 23。
TXN 24 位 $ 2^3 $ 使用 FK18 中的密鑰 24 並在 FK19 中派生密鑰 28,在 FK20 中派生 26,在 FK21 中派生 25。
TXN 25 位 $ 2^0 $ 使用 FK21 中的密鑰 25。
TXN 26 位 $ 2^1 $ 使用 FK20 中的密鑰 26 並在 FK21 中派生密鑰 27。
TXN 27 位 $ 2^0 $ 使用 FK21 中的密鑰 27。
TXN 28 位 $ 2^2 $ 使用 FK19 中的密鑰 28,並在 FK20 中導出密鑰 30,在 FK21 中導出密鑰 29。
TXN 29 位 $ 2^0 $ 使用 FK21 中的密鑰 29。
TXN 30 位 $ 2^1 $ 使用 FK20 中的密鑰 30 並在 FK21 中派生密鑰 31。
TXN 31 位 $ 2^0 $ 使用 FK21 中的密鑰 31。
我們現在已經生成了 31 個交易密鑰,並且還沒有接近“用完”未來的密鑰寄存器——事實上,我們只使用了其中的五個,甚至根本沒有觸及 FK1-16。
如果你繼續這個過程很長時間,你會看到它為每個 21 位二進制值而不是 0 派生一個密鑰,其中有 2097151;但 DUKPT 規定,設置超過 10 位的計數器值將被跳過,因此僅使用這些值中的 1048575 個及其對應的鍵——正如我在上面的摘要中所說,這是一個 DUKPT 的鍵和事務的數量設備,無需重新加密。
最初的意圖是設備,或者(更可能在 1980 年代和 1990 年代的技術中)設備中的安全模組,將在此週期之後被替換。近年來,隨著 DUKPT 被應用於大容量但價值較低和安全性較低的應用程序,對密鑰更新的需求越來越大。請參閱使用 3DES DUKPT 的 POS 的交易容量是多少?對此的一些(不同)觀點。
(儘管這部分在連結中是正確的,但為了完整性進一步擴展)
每個推導步驟發生在一個 KSN 的密鑰和隨後的 KSN 之間,該 KSN 恰好有一個之前被清除的位集,即添加 2 的冪。對於(受信任的)主機算法,所有這些步驟都在一個循環中執行,從所需計數器中設置的最高位到最低位;對於未來密鑰算法,它們在時間上展開,每個位在設置了該位的計數器值範圍的開頭有效地完成,如上所述;無論哪種方式,實際使用的每個鍵的累積結果都是相同的。
每個一位派生步驟使用兩個單 DES 加密(但不是三重 DES),並且由標準以相當複雜的形式表示,歸結為:
輸入: curkey = ‘before’ KSN 的鍵,左半部分和右半部分可單獨訪問;
ksn = 對應於新密鑰的更新後的 KSN 的低 8 字節(添加了新位)
臨時:modkey = curkey,每一半都與 C0C0C0C0_00000000 異或
輸出:newkey = 更新 KSN 的密鑰,與左右兩半類似
newkeyR = DES_encrypt(key = curkeyL,data = ksn XOR curkeyR) XOR curkeyR
newkeyL = DES_encrypt(key=modkeyL, data= ksn XOR modkeyR) XOR modkeyR
您連結的網站用虛擬碼更簡潔地表達了這一點
GenerateKey(key, ksn) { # where ksn is already updated by the caller, and the return is used to update key return EncryptRegister(key ^ KeyMask, ksn) << 64 | EncryptRegister(key, ksn) } EncryptRegister(key, reg) { return (key & FFFFFFFFFFFFFFFF) ^ DesEncrypt((key & FFFFFFFFFFFFFFFF0000000000000000) >> 64, key & FFFFFFFFFFFFFFFF ^ reg) }
未來密鑰算法的主要好處是,如果一個設備被入侵,目前在 FK 寄存器中的數據不能用於為同一設備建構任何先前的密鑰,或者根本不能為另一個設備建構任何密鑰。因此假設檢測到妥協並且所有新的來自該設備的密鑰被列入黑名單,妥協不會導致安全性損失。DUKPT 最初旨在用於銀行 ATM 機,並且(正確地)預期某些 ATM 機會被盜或被攻擊,因為正如 Willie Sutton 的著名觀察所言,這就是錢所在的地方。更簡單的主機端算法能夠按需為每個設備的每個 txn 創建密鑰,但假設僅在受到良好保護的環境中實施,通常是在加固的數據中心內的雙鎖保險庫,有加固的牆壁、柵欄,以及全天候武裝警衛。並且可能,雖然 ABA 委員會永遠不會這麼說,但鯊魚與 frickin 雷射 :}