根据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