根據DES規範,密鑰的每個字節的最後一位用於錯誤檢測(每個字節應該有奇數奇偶校驗)。因此有效密鑰長度是56位,而不是64位。DESKey是否保留無效奇偶校驗位?
但是,在許多使用情況下,這些奇偶校驗位未被檢查。有時它們甚至用於完全不同的目的:例如,即使原始錯誤糾正目的丟失,Mifare DESFire卡也會將密鑰版本存儲在這些位中。
Java Card實現如何處理這些位?讓我們來看看這個代碼:
DESKey desKey = ... //a single DES key instance
byte[] inputKey = new byte[8];
inputKey[7] = (byte) 0x03; //explicitly invalid parity bit in the last byte
desKey.setKey(inputKey, (short) 0);
byte[] outputKey = new byte[8];
desKey.getKey(outputKey, (short) 0);
能夠保證所有的inputKey
和outputKey
陣列將包含相同的數據到底,即使在inputKey
無效的奇偶校驗位?我用幾種卡片類型進行了幾次實驗,它們都保留了我放入這些奇偶校驗位的任何數據,但是我沒有在Java Card規範中發現這種行爲是有保證的。
這條信息對我來說非常重要;否則我將不得不存儲與密鑰實例分離的「無效奇偶校驗位」。
我有完全相同的困境,並決定將密鑰版本存儲在單獨的字段中以確保。我無法在規格中找到任何保證 - 我敢打賭,它是不確定的,因此很危險。我的卡片保持奇偶校驗位不變......祝你好運! – vlp